[Bug c++/104682] Missing deprecated warning on enumerator in class template

cvs-commit at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Feb 28 16:39:49 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104682

--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Marek Polacek <mpolacek@gcc.gnu.org>:

https://gcc.gnu.org/g:430c89274d7f82810724126637ffdc5507d442f0

commit r12-7413-g430c89274d7f82810724126637ffdc5507d442f0
Author: Marek Polacek <polacek@redhat.com>
Date:   Fri Feb 25 14:56:13 2022 -0500

    c++: Lost deprecated/unavailable attr in class tmpl [PR104682]

    When looking into the other PR I noticed that we fail to give a warning
    for a deprecated enumerator when the enum is in a class template.  This
    only happens when the attribute doesn't have an argument.  The reason is
    that when we tsubst_enum, we create a new enumerator:

          build_enumerator (DECL_NAME (decl), value, newtag,
               DECL_ATTRIBUTES (decl), DECL_SOURCE_LOCATION (decl));

    but DECL_ATTRIBUTES (decl) is null when the attribute was provided
    without an argument -- in that case it simply melts into a tree flag.
    handle_deprecated_attribute has:

          if (!args)
             *no_add_attrs = true;

    so the attribute isn't retained and we lose it when tsubsting.  Same
    thing when the attribute is on the enum itself.

    Attribute unavailable is a similar case, but it's different in that
    it can be a late attribute whereas "deprecated" can't:
    is_late_template_attribute has

                    /* But some attributes specifically apply to templates.  */
                    && !is_attribute_p ("abi_tag", name)
                    && !is_attribute_p ("deprecated", name)
                    && !is_attribute_p ("visibility", name))
             return true;
           else
             return false;

    which looks strange, but attr-unavailable-9.C tests that we don't error
when
    the attribute is applied on a template.

            PR c++/104682

    gcc/cp/ChangeLog:

            * cp-tree.h (build_enumerator): Adjust.
            * decl.cc (finish_enum): Make it return the new decl.
            * pt.cc (tsubst_enum): Propagate TREE_DEPRECATED and
TREE_UNAVAILABLE.

    gcc/testsuite/ChangeLog:

            * g++.dg/ext/attr-unavailable-10.C: New test.
            * g++.dg/ext/attr-unavailable-11.C: New test.
            * g++.dg/warn/deprecated-17.C: New test.
            * g++.dg/warn/deprecated-18.C: New test.


More information about the Gcc-bugs mailing list