Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On 05/22/2015 06:19 PM, Mikhail Maltsev wrote: On 22.05.2015 12:10, Marek Polacek wrote: Thanks, applied. Here's the final version. By the way, we have a feature test macro, __cpp_attributes=200809 which can be used to determine, whether C++11 attribute syntax is supported by the compiler. I propose to add something similar for this extension (like __cpp_gnu_enum_attributes=... for C++ and __GCC_HAVE_ENUM_ATTRIBUTES for C). Thoughts? I think SG 10 is or did debate this a weekor two ago. I haven't heard. I had made some recommendations along the lines you describe. Another member had suggested just bumping the date on __cpp_attributes I don't know what/if they decided. Ed
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On Thu, May 21, 2015 at 02:00:26PM -0400, Jason Merrill wrote: On 05/07/2015 12:22 PM, Marek Polacek wrote: - mark_used (decl); + mark_used (decl, 0); This should use tf_none rather than 0. Fixed. + build_enumerator (DECL_NAME (decl), value, newtag, +DECL_ATTRIBUTES (decl), DECL_SOURCE_LOCATION (decl)); This is assuming that enumerators can't have dependent attributes. I guess that's currently true, but please add a comment about it. Done. OK with those changes. Thanks, applied. Here's the final version. 2015-05-22 Marek Polacek pola...@redhat.com Edward Smith-Rowland 3dw...@verizon.net PR c/47043 * c-common.c (handle_deprecated_attribute): Allow CONST_DECL. * c-parser.c (c_parser_enum_specifier): Parse and apply enumerator attributes. * cp-tree.h (build_enumerator): Update declaration. * decl.c (build_enumerator): Add attributes parameter. Call cplus_decl_attributes. * init.c (constant_value_1): Pass tf_none to mark_used. * parser.c (cp_parser_enumerator_definition): Parse attributes and pass them down to build_enumerator. * pt.c (tsubst_enum): Pass decl attributes to build_enumerator. * semantics.c (finish_id_expression): Don't warn_deprecated_use here. * doc/extend.texi (Enumerator Attributes): New section. Document syntax of enumerator attributes. * c-c++-common/attributes-enum-1.c: New test. * c-c++-common/attributes-enum-2.c: New test. * g++.dg/cpp0x/attributes-enum-1.C: New test. * g++.dg/cpp1y/attributes-enum-1.C: New test. diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c index a2b3793..36c984c 100644 --- gcc/c-family/c-common.c +++ gcc/c-family/c-common.c @@ -9088,6 +9088,7 @@ handle_deprecated_attribute (tree *node, tree name, || TREE_CODE (decl) == PARM_DECL || VAR_OR_FUNCTION_DECL_P (decl) || TREE_CODE (decl) == FIELD_DECL + || TREE_CODE (decl) == CONST_DECL || objc_method_decl (TREE_CODE (decl))) TREE_DEPRECATED (decl) = 1; else diff --git gcc/c/c-parser.c gcc/c/c-parser.c index f496733..965b4b9 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -2516,6 +2516,13 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, enumerator: enumeration-constant enumeration-constant = constant-expression + + GNU Extensions: + + enumerator: + enumeration-constant attributes[opt] + enumeration-constant attributes[opt] = constant-expression + */ static struct c_typespec @@ -2575,6 +2582,8 @@ c_parser_enum_specifier (c_parser *parser) c_parser_set_source_position_from_token (token); decl_loc = value_loc = token-location; c_parser_consume_token (parser); + /* Parse any specified attributes. */ + tree enum_attrs = c_parser_attributes (parser); if (c_parser_next_token_is (parser, CPP_EQ)) { c_parser_consume_token (parser); @@ -2584,7 +2593,9 @@ c_parser_enum_specifier (c_parser *parser) else enum_value = NULL_TREE; enum_decl = build_enumerator (decl_loc, value_loc, - the_enum, enum_id, enum_value); + the_enum, enum_id, enum_value); + if (enum_attrs) + decl_attributes (TREE_PURPOSE (enum_decl), enum_attrs, 0); TREE_CHAIN (enum_decl) = values; values = enum_decl; seen_comma = false; diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h index 4136d98..91619e2 100644 --- gcc/cp/cp-tree.h +++ gcc/cp/cp-tree.h @@ -5400,7 +5400,7 @@ extern bool xref_basetypes(tree, tree); extern tree start_enum (tree, tree, tree, bool, bool *); extern void finish_enum_value_list (tree); extern void finish_enum(tree); -extern void build_enumerator (tree, tree, tree, location_t); +extern void build_enumerator (tree, tree, tree, tree, location_t); extern tree lookup_enumerator (tree, tree); extern bool start_preparsed_function (tree, tree, int); extern bool start_function (cp_decl_specifier_seq *, diff --git gcc/cp/decl.c gcc/cp/decl.c index e4d3c1d..5396994 100644 --- gcc/cp/decl.c +++ gcc/cp/decl.c @@ -13057,11 +13057,12 @@ finish_enum (tree enumtype) /* Build and install a CONST_DECL for an enumeration constant of the enumeration type ENUMTYPE whose NAME and VALUE (if any) are provided. - LOC is the location of NAME. + Apply ATTRIBUTES if available. LOC is the location of NAME. Assignment of sequential values by default is handled here. */ void -build_enumerator (tree name, tree value, tree enumtype, location_t loc) +build_enumerator (tree name, tree value, tree enumtype,
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On 22.05.2015 12:10, Marek Polacek wrote: Thanks, applied. Here's the final version. By the way, we have a feature test macro, __cpp_attributes=200809 which can be used to determine, whether C++11 attribute syntax is supported by the compiler. I propose to add something similar for this extension (like __cpp_gnu_enum_attributes=... for C++ and __GCC_HAVE_ENUM_ATTRIBUTES for C). Thoughts? -- Regards, Mikhail Maltsev
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On 05/07/2015 12:22 PM, Marek Polacek wrote: - mark_used (decl); + mark_used (decl, 0); This should use tf_none rather than 0. + build_enumerator (DECL_NAME (decl), value, newtag, + DECL_ATTRIBUTES (decl), DECL_SOURCE_LOCATION (decl)); This is assuming that enumerators can't have dependent attributes. I guess that's currently true, but please add a comment about it. OK with those changes. Jason
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
I'm pinging the C++ parts. Thanks, On Thu, May 07, 2015 at 06:22:40PM +0200, Marek Polacek wrote: This (third) version of the patch entails the change in tsubst_enum Ed suggested + new testcase. Bootstrapped/regtested on x86_64-linux, ok for trunk? 2015-05-07 Marek Polacek pola...@redhat.com Edward Smith-Rowland 3dw...@verizon.net PR c/47043 * c-common.c (handle_deprecated_attribute): Allow CONST_DECL. * c-parser.c (c_parser_enum_specifier): Parse and apply enumerator attributes. * cp-tree.h (build_enumerator): Update declaration. * decl.c (build_enumerator): Add attributes parameter. Call cplus_decl_attributes. * init.c (constant_value_1): Pass 0 to mark_used. * parser.c (cp_parser_enumerator_definition): Parse attributes and pass them down to build_enumerator. * pt.c (tsubst_enum): Pass decl attributes to build_enumerator. * semantics.c (finish_id_expression): Don't warn_deprecated_use here. * doc/extend.texi (Enumerator Attributes): New section. Document syntax of enumerator attributes. * c-c++-common/attributes-enum-1.c: New test. * c-c++-common/attributes-enum-2.c: New test. * g++.dg/cpp0x/attributes-enum-1.C: New test. * g++.dg/cpp1y/attributes-enum-1.C: New test. diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c index ada8e8a..36968e5 100644 --- gcc/c-family/c-common.c +++ gcc/c-family/c-common.c @@ -8810,6 +8810,7 @@ handle_deprecated_attribute (tree *node, tree name, || TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == FIELD_DECL + || TREE_CODE (decl) == CONST_DECL || objc_method_decl (TREE_CODE (decl))) TREE_DEPRECATED (decl) = 1; else diff --git gcc/c/c-parser.c gcc/c/c-parser.c index bf0e4c57..889e6d7 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -2516,6 +2516,13 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, enumerator: enumeration-constant enumeration-constant = constant-expression + + GNU Extensions: + + enumerator: + enumeration-constant attributes[opt] + enumeration-constant attributes[opt] = constant-expression + */ static struct c_typespec @@ -2575,6 +2582,8 @@ c_parser_enum_specifier (c_parser *parser) c_parser_set_source_position_from_token (token); decl_loc = value_loc = token-location; c_parser_consume_token (parser); + /* Parse any specified attributes. */ + tree enum_attrs = c_parser_attributes (parser); if (c_parser_next_token_is (parser, CPP_EQ)) { c_parser_consume_token (parser); @@ -2584,7 +2593,9 @@ c_parser_enum_specifier (c_parser *parser) else enum_value = NULL_TREE; enum_decl = build_enumerator (decl_loc, value_loc, - the_enum, enum_id, enum_value); + the_enum, enum_id, enum_value); + if (enum_attrs) + decl_attributes (TREE_PURPOSE (enum_decl), enum_attrs, 0); TREE_CHAIN (enum_decl) = values; values = enum_decl; seen_comma = false; diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h index e0fbf5e..6b26cb1 100644 --- gcc/cp/cp-tree.h +++ gcc/cp/cp-tree.h @@ -5400,7 +5400,7 @@ extern bool xref_basetypes(tree, tree); extern tree start_enum (tree, tree, tree, bool, bool *); extern void finish_enum_value_list (tree); extern void finish_enum(tree); -extern void build_enumerator (tree, tree, tree, location_t); +extern void build_enumerator (tree, tree, tree, tree, location_t); extern tree lookup_enumerator (tree, tree); extern bool start_preparsed_function (tree, tree, int); extern bool start_function (cp_decl_specifier_seq *, diff --git gcc/cp/decl.c gcc/cp/decl.c index 261a12d..ebbd585 100644 --- gcc/cp/decl.c +++ gcc/cp/decl.c @@ -13067,11 +13067,12 @@ finish_enum (tree enumtype) /* Build and install a CONST_DECL for an enumeration constant of the enumeration type ENUMTYPE whose NAME and VALUE (if any) are provided. - LOC is the location of NAME. + Apply ATTRIBUTES if available. LOC is the location of NAME. Assignment of sequential values by default is handled here. */ void -build_enumerator (tree name, tree value, tree enumtype, location_t loc) +build_enumerator (tree name, tree value, tree enumtype, tree attributes, + location_t loc) { tree decl; tree context; @@ -13234,6 +13235,9 @@ incremented enumerator value is too large for %long%); TREE_READONLY (decl) = 1; DECL_INITIAL (decl) = value; + if
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On Thu, 14 May 2015, Marek Polacek wrote: Ping. Joseph, do you have any further comments on the patch? The C front-end changes are OK. -- Joseph S. Myers jos...@codesourcery.com
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
Ping. Joseph, do you have any further comments on the patch? Jason, can you review the C++ parts? Thanks, On Thu, May 07, 2015 at 06:22:40PM +0200, Marek Polacek wrote: This (third) version of the patch entails the change in tsubst_enum Ed suggested + new testcase. Bootstrapped/regtested on x86_64-linux, ok for trunk? 2015-05-07 Marek Polacek pola...@redhat.com Edward Smith-Rowland 3dw...@verizon.net PR c/47043 * c-common.c (handle_deprecated_attribute): Allow CONST_DECL. * c-parser.c (c_parser_enum_specifier): Parse and apply enumerator attributes. * cp-tree.h (build_enumerator): Update declaration. * decl.c (build_enumerator): Add attributes parameter. Call cplus_decl_attributes. * init.c (constant_value_1): Pass 0 to mark_used. * parser.c (cp_parser_enumerator_definition): Parse attributes and pass them down to build_enumerator. * pt.c (tsubst_enum): Pass decl attributes to build_enumerator. * semantics.c (finish_id_expression): Don't warn_deprecated_use here. * doc/extend.texi (Enumerator Attributes): New section. Document syntax of enumerator attributes. * c-c++-common/attributes-enum-1.c: New test. * c-c++-common/attributes-enum-2.c: New test. * g++.dg/cpp0x/attributes-enum-1.C: New test. * g++.dg/cpp1y/attributes-enum-1.C: New test. diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c index ada8e8a..36968e5 100644 --- gcc/c-family/c-common.c +++ gcc/c-family/c-common.c @@ -8810,6 +8810,7 @@ handle_deprecated_attribute (tree *node, tree name, || TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == FIELD_DECL + || TREE_CODE (decl) == CONST_DECL || objc_method_decl (TREE_CODE (decl))) TREE_DEPRECATED (decl) = 1; else diff --git gcc/c/c-parser.c gcc/c/c-parser.c index bf0e4c57..889e6d7 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -2516,6 +2516,13 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, enumerator: enumeration-constant enumeration-constant = constant-expression + + GNU Extensions: + + enumerator: + enumeration-constant attributes[opt] + enumeration-constant attributes[opt] = constant-expression + */ static struct c_typespec @@ -2575,6 +2582,8 @@ c_parser_enum_specifier (c_parser *parser) c_parser_set_source_position_from_token (token); decl_loc = value_loc = token-location; c_parser_consume_token (parser); + /* Parse any specified attributes. */ + tree enum_attrs = c_parser_attributes (parser); if (c_parser_next_token_is (parser, CPP_EQ)) { c_parser_consume_token (parser); @@ -2584,7 +2593,9 @@ c_parser_enum_specifier (c_parser *parser) else enum_value = NULL_TREE; enum_decl = build_enumerator (decl_loc, value_loc, - the_enum, enum_id, enum_value); + the_enum, enum_id, enum_value); + if (enum_attrs) + decl_attributes (TREE_PURPOSE (enum_decl), enum_attrs, 0); TREE_CHAIN (enum_decl) = values; values = enum_decl; seen_comma = false; diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h index e0fbf5e..6b26cb1 100644 --- gcc/cp/cp-tree.h +++ gcc/cp/cp-tree.h @@ -5400,7 +5400,7 @@ extern bool xref_basetypes (tree, tree); extern tree start_enum (tree, tree, tree, bool, bool *); extern void finish_enum_value_list (tree); extern void finish_enum (tree); -extern void build_enumerator (tree, tree, tree, location_t); +extern void build_enumerator (tree, tree, tree, tree, location_t); extern tree lookup_enumerator(tree, tree); extern bool start_preparsed_function (tree, tree, int); extern bool start_function (cp_decl_specifier_seq *, diff --git gcc/cp/decl.c gcc/cp/decl.c index 261a12d..ebbd585 100644 --- gcc/cp/decl.c +++ gcc/cp/decl.c @@ -13067,11 +13067,12 @@ finish_enum (tree enumtype) /* Build and install a CONST_DECL for an enumeration constant of the enumeration type ENUMTYPE whose NAME and VALUE (if any) are provided. - LOC is the location of NAME. + Apply ATTRIBUTES if available. LOC is the location of NAME. Assignment of sequential values by default is handled here. */ void -build_enumerator (tree name, tree value, tree enumtype, location_t loc) +build_enumerator (tree name, tree value, tree enumtype, tree attributes, + location_t loc) { tree decl; tree context; @@ -13234,6 +13235,9 @@ incremented enumerator value is too large for %long%); TREE_READONLY (decl) = 1; DECL_INITIAL (decl)
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On Thu, May 07, 2015 at 11:23:51AM -0600, Sandra Loosemore wrote: How about making the new Enumerator Attributes node a subsection of the Type Attributes section, instead of a section of its own at the same level? Sorry, I don't particularly like this idea. I think an enumerator is not closely related to a type. The current state makes it clear that so far only the deprecated attribute can appertain to an enumerator. I've kind of been scratching my head over the existing entry for bnd_variable_size in the Type Attributes section; it applies to members of a structure rather than a structure type. Now that there's another similar special case being proposed, I think it makes sense to give both of these type-related attributes parallel treatment, and pull bnd_variable_size out into its own subsection as well. I can take care of that part, or shuffle the Enumerator Attributes section around too if you just want to commit what you have before I have time to get around to finishing the reorganization of this material. Thanks -- I'm keeping the docs as it was then. Marek
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
[ CC'ing Sandra: since you were recently cleaning up the attributes docs (thanks), the doc/extend.texi bits in this patch might be of interest to you. ] On Wed, May 06, 2015 at 08:44:10PM +0200, Marek Polacek wrote: 2015-05-06 Marek Polacek pola...@redhat.com PR c/47043 * c-common.c (handle_deprecated_attribute): Allow CONST_DECL. * c-parser.c (c_parser_enum_specifier): Parse and apply enumerator attributes. * cp-tree.h (build_enumerator): Update declaration. * decl.c (build_enumerator): Add attributes parameter. Call cplus_decl_attributes. * init.c (constant_value_1): Pass 0 to mark_used. * parser.c (cp_parser_enumerator_definition): Parse attributes and pass them down to build_enumerator. * pt.c (tsubst_enum): Pass NULL_TREE to build_enumerator. * semantics.c (finish_id_expression): Don't warn_deprecated_use here. * doc/extend.texi (Enumerator Attributes): New section. Document syntax of enumerator attributes. * c-c++-common/attributes-enum-1.c: New test. * c-c++-common/attributes-enum-2.c: New test. * g++.dg/cpp0x/attributes-enum-1.C: New test. diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c index ada8e8a..36968e5 100644 --- gcc/c-family/c-common.c +++ gcc/c-family/c-common.c @@ -8810,6 +8810,7 @@ handle_deprecated_attribute (tree *node, tree name, || TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == FIELD_DECL + || TREE_CODE (decl) == CONST_DECL || objc_method_decl (TREE_CODE (decl))) TREE_DEPRECATED (decl) = 1; else diff --git gcc/c/c-parser.c gcc/c/c-parser.c index bf0e4c57..889e6d7 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -2516,6 +2516,13 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, enumerator: enumeration-constant enumeration-constant = constant-expression + + GNU Extensions: + + enumerator: + enumeration-constant attributes[opt] + enumeration-constant attributes[opt] = constant-expression + */ static struct c_typespec @@ -2575,6 +2582,8 @@ c_parser_enum_specifier (c_parser *parser) c_parser_set_source_position_from_token (token); decl_loc = value_loc = token-location; c_parser_consume_token (parser); + /* Parse any specified attributes. */ + tree enum_attrs = c_parser_attributes (parser); if (c_parser_next_token_is (parser, CPP_EQ)) { c_parser_consume_token (parser); @@ -2584,7 +2593,9 @@ c_parser_enum_specifier (c_parser *parser) else enum_value = NULL_TREE; enum_decl = build_enumerator (decl_loc, value_loc, - the_enum, enum_id, enum_value); + the_enum, enum_id, enum_value); + if (enum_attrs) + decl_attributes (TREE_PURPOSE (enum_decl), enum_attrs, 0); TREE_CHAIN (enum_decl) = values; values = enum_decl; seen_comma = false; diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h index e0fbf5e..6b26cb1 100644 --- gcc/cp/cp-tree.h +++ gcc/cp/cp-tree.h @@ -5400,7 +5400,7 @@ extern bool xref_basetypes (tree, tree); extern tree start_enum (tree, tree, tree, bool, bool *); extern void finish_enum_value_list (tree); extern void finish_enum (tree); -extern void build_enumerator (tree, tree, tree, location_t); +extern void build_enumerator (tree, tree, tree, tree, location_t); extern tree lookup_enumerator(tree, tree); extern bool start_preparsed_function (tree, tree, int); extern bool start_function (cp_decl_specifier_seq *, diff --git gcc/cp/decl.c gcc/cp/decl.c index 261a12d..ebbd585 100644 --- gcc/cp/decl.c +++ gcc/cp/decl.c @@ -13067,11 +13067,12 @@ finish_enum (tree enumtype) /* Build and install a CONST_DECL for an enumeration constant of the enumeration type ENUMTYPE whose NAME and VALUE (if any) are provided. - LOC is the location of NAME. + Apply ATTRIBUTES if available. LOC is the location of NAME. Assignment of sequential values by default is handled here. */ void -build_enumerator (tree name, tree value, tree enumtype, location_t loc) +build_enumerator (tree name, tree value, tree enumtype, tree attributes, + location_t loc) { tree decl; tree context; @@ -13234,6 +13235,9 @@ incremented enumerator value is too large for %long%); TREE_READONLY (decl) = 1; DECL_INITIAL (decl) = value; + if (attributes) +cplus_decl_attributes (decl, attributes, 0); + if (context context == current_class_type !SCOPED_ENUM_P (enumtype)) /* In something like `struct S { enum E { i = 7 };
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On 05/07/2015 09:59 AM, Marek Polacek wrote: On Wed, May 06, 2015 at 11:17:20PM -0400, Ed Smith-Rowland wrote: In addition to a PR this is 1/2 of a C=+17 feature. (The other half - really a separate thing - is attributes on namespaces). Ah, nice, I wasn't aware. For the record, this is http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4266.html. I wonder if we should pedwarn for C++17? Or it could be just an extension for C++17 - I guess that would match with clang. Yeah, it is meant as a GNU extension. (clang supports this extension for several years already.) I'd rather let Jason decide what to do wrt C++17. @@ -3651,11 +3651,6 @@ finish_id_expression (tree id_expression, } } - /* Handle references (c++/56130). */ - tree t = REFERENCE_REF_P (decl) ? TREE_OPERAND (decl, 0) : decl; - if (TREE_DEPRECATED (t)) -warn_deprecated_use (t, NULL_TREE); - return decl; } Why did this bit get removed? This hunk got added in r201906 to address c++/56130 - we didn't warn for deprecated references: int g_nn; int g_n __attribute__((deprecated)) = g_nn; int main() { g_n = 1; } But then Jason added warn_deprecated_use to mark_used in r217677 and we warned twice. So I figured the warning in finish_id_expression isn't needed anymore. Do we handle enums in template specializations? Not sure, could you provide a testcase? Thanks, Marek Instead of NULL_TREE in pt.c I grabbed the attrs. /* Actually build the enumerator itself. */ build_enumerator (DECL_NAME (decl), value, newtag, DECL_ATTRIBUTES (decl), DECL_SOURCE_LOCATION (decl)); Seems to work. Also, I haven't tested the testcase in terms of the pattern matching of the error. Tweak it if necessary. Thanks for this. Ed // PR c/47046 // { dg-do compile { target c++11 } } class C { public: enum Foo { T, U [[deprecated(unused)]], V }; }; templatetypename Tp class D { public: enum Bar { X, Y [[deprecated(unused)]], Z }; }; int f (int i) { auto j = C::U; // { dg-warning .C::U. is deprecated } auto k = Dint::Y; // { dg-warning .Dint::Y. is deprecated } return i; }
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On Wed, May 06, 2015 at 11:17:20PM -0400, Ed Smith-Rowland wrote: In addition to a PR this is 1/2 of a C=+17 feature. (The other half - really a separate thing - is attributes on namespaces). Ah, nice, I wasn't aware. For the record, this is http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4266.html. I wonder if we should pedwarn for C++17? Or it could be just an extension for C++17 - I guess that would match with clang. Yeah, it is meant as a GNU extension. (clang supports this extension for several years already.) I'd rather let Jason decide what to do wrt C++17. @@ -3651,11 +3651,6 @@ finish_id_expression (tree id_expression, } } - /* Handle references (c++/56130). */ - tree t = REFERENCE_REF_P (decl) ? TREE_OPERAND (decl, 0) : decl; - if (TREE_DEPRECATED (t)) -warn_deprecated_use (t, NULL_TREE); - return decl; } Why did this bit get removed? This hunk got added in r201906 to address c++/56130 - we didn't warn for deprecated references: int g_nn; int g_n __attribute__((deprecated)) = g_nn; int main() { g_n = 1; } But then Jason added warn_deprecated_use to mark_used in r217677 and we warned twice. So I figured the warning in finish_id_expression isn't needed anymore. Do we handle enums in template specializations? Not sure, could you provide a testcase? Thanks, Marek
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On Thu, May 07, 2015 at 10:21:28AM -0400, Ed Smith-Rowland wrote: Instead of NULL_TREE in pt.c I grabbed the attrs. /* Actually build the enumerator itself. */ build_enumerator (DECL_NAME (decl), value, newtag, DECL_ATTRIBUTES (decl), DECL_SOURCE_LOCATION (decl)); Seems to work. Cool! Also, I haven't tested the testcase in terms of the pattern matching of the error. Tweak it if necessary. I did some small adjustments, thanks. This (third) version of the patch entails the change in tsubst_enum Ed suggested + new testcase. Bootstrapped/regtested on x86_64-linux, ok for trunk? 2015-05-07 Marek Polacek pola...@redhat.com Edward Smith-Rowland 3dw...@verizon.net PR c/47043 * c-common.c (handle_deprecated_attribute): Allow CONST_DECL. * c-parser.c (c_parser_enum_specifier): Parse and apply enumerator attributes. * cp-tree.h (build_enumerator): Update declaration. * decl.c (build_enumerator): Add attributes parameter. Call cplus_decl_attributes. * init.c (constant_value_1): Pass 0 to mark_used. * parser.c (cp_parser_enumerator_definition): Parse attributes and pass them down to build_enumerator. * pt.c (tsubst_enum): Pass decl attributes to build_enumerator. * semantics.c (finish_id_expression): Don't warn_deprecated_use here. * doc/extend.texi (Enumerator Attributes): New section. Document syntax of enumerator attributes. * c-c++-common/attributes-enum-1.c: New test. * c-c++-common/attributes-enum-2.c: New test. * g++.dg/cpp0x/attributes-enum-1.C: New test. * g++.dg/cpp1y/attributes-enum-1.C: New test. diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c index ada8e8a..36968e5 100644 --- gcc/c-family/c-common.c +++ gcc/c-family/c-common.c @@ -8810,6 +8810,7 @@ handle_deprecated_attribute (tree *node, tree name, || TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == FIELD_DECL + || TREE_CODE (decl) == CONST_DECL || objc_method_decl (TREE_CODE (decl))) TREE_DEPRECATED (decl) = 1; else diff --git gcc/c/c-parser.c gcc/c/c-parser.c index bf0e4c57..889e6d7 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -2516,6 +2516,13 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, enumerator: enumeration-constant enumeration-constant = constant-expression + + GNU Extensions: + + enumerator: + enumeration-constant attributes[opt] + enumeration-constant attributes[opt] = constant-expression + */ static struct c_typespec @@ -2575,6 +2582,8 @@ c_parser_enum_specifier (c_parser *parser) c_parser_set_source_position_from_token (token); decl_loc = value_loc = token-location; c_parser_consume_token (parser); + /* Parse any specified attributes. */ + tree enum_attrs = c_parser_attributes (parser); if (c_parser_next_token_is (parser, CPP_EQ)) { c_parser_consume_token (parser); @@ -2584,7 +2593,9 @@ c_parser_enum_specifier (c_parser *parser) else enum_value = NULL_TREE; enum_decl = build_enumerator (decl_loc, value_loc, - the_enum, enum_id, enum_value); + the_enum, enum_id, enum_value); + if (enum_attrs) + decl_attributes (TREE_PURPOSE (enum_decl), enum_attrs, 0); TREE_CHAIN (enum_decl) = values; values = enum_decl; seen_comma = false; diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h index e0fbf5e..6b26cb1 100644 --- gcc/cp/cp-tree.h +++ gcc/cp/cp-tree.h @@ -5400,7 +5400,7 @@ extern bool xref_basetypes(tree, tree); extern tree start_enum (tree, tree, tree, bool, bool *); extern void finish_enum_value_list (tree); extern void finish_enum(tree); -extern void build_enumerator (tree, tree, tree, location_t); +extern void build_enumerator (tree, tree, tree, tree, location_t); extern tree lookup_enumerator (tree, tree); extern bool start_preparsed_function (tree, tree, int); extern bool start_function (cp_decl_specifier_seq *, diff --git gcc/cp/decl.c gcc/cp/decl.c index 261a12d..ebbd585 100644 --- gcc/cp/decl.c +++ gcc/cp/decl.c @@ -13067,11 +13067,12 @@ finish_enum (tree enumtype) /* Build and install a CONST_DECL for an enumeration constant of the enumeration type ENUMTYPE whose NAME and VALUE (if any) are provided. - LOC is the location of NAME. + Apply ATTRIBUTES if available. LOC is the location of NAME. Assignment of sequential values by default is handled here. */ void -build_enumerator (tree name, tree value, tree enumtype, location_t loc)
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On 05/07/2015 10:22 AM, Marek Polacek wrote: [snip] * doc/extend.texi (Enumerator Attributes): New section. Document syntax of enumerator attributes. How about making the new Enumerator Attributes node a subsection of the Type Attributes section, instead of a section of its own at the same level? I've kind of been scratching my head over the existing entry for bnd_variable_size in the Type Attributes section; it applies to members of a structure rather than a structure type. Now that there's another similar special case being proposed, I think it makes sense to give both of these type-related attributes parallel treatment, and pull bnd_variable_size out into its own subsection as well. I can take care of that part, or shuffle the Enumerator Attributes section around too if you just want to commit what you have before I have time to get around to finishing the reorganization of this material. -Sandra
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On Wed, May 06, 2015 at 04:13:05PM +, Joseph Myers wrote: On Wed, 6 May 2015, Marek Polacek wrote: 2015-05-06 Marek Polacek pola...@redhat.com PR c/47043 * c-common.c (handle_deprecated_attribute): Allow CONST_DECL. Do all other attributes already reject CONST_DECL? I don't see any tests for unsupported attributes on enum values being properly diagnosed (adding tests for every unsupported attribute would seem excessive, but there should be a few). I've tried a bunch of them manually and all seemed to just ignore CONST_DECLs. This version of the patch contains a new test to test invalid attributes. diff --git gcc/c/c-parser.c gcc/c/c-parser.c index bf0e4c57..f06a6b3 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -2584,7 +2584,11 @@ c_parser_enum_specifier (c_parser *parser) else enum_value = NULL_TREE; enum_decl = build_enumerator (decl_loc, value_loc, - the_enum, enum_id, enum_value); + the_enum, enum_id, enum_value); + /* Parse any specified attributes. */ + tree enum_attrs = c_parser_attributes (parser); + if (enum_attrs) + decl_attributes (TREE_PURPOSE (enum_decl), enum_attrs, 0); You need to update the syntax comment to include the new syntax. Done (and for C++ as well). You also need to update the user documentation of attributes (syntax and semantics) in extend.texi to include this case. Right, apparently I posted the patch too soon. So this version updates the documentation, hopefully what I wrote is enough. Why is the attribute going after the = value? That seems inconsistent with positioning of attributes in initialized variable declarations, for example. A thinko of mine: I didn't properly check what we do for variables with an initializer... Fixed by moving the attribute parsing slightly above. Thanks. Bootstrapped/regtested on x86_64-linux, ok for trunk? 2015-05-06 Marek Polacek pola...@redhat.com PR c/47043 * c-common.c (handle_deprecated_attribute): Allow CONST_DECL. * c-parser.c (c_parser_enum_specifier): Parse and apply enumerator attributes. * cp-tree.h (build_enumerator): Update declaration. * decl.c (build_enumerator): Add attributes parameter. Call cplus_decl_attributes. * init.c (constant_value_1): Pass 0 to mark_used. * parser.c (cp_parser_enumerator_definition): Parse attributes and pass them down to build_enumerator. * pt.c (tsubst_enum): Pass NULL_TREE to build_enumerator. * semantics.c (finish_id_expression): Don't warn_deprecated_use here. * doc/extend.texi (Enumerator Attributes): New section. Document syntax of enumerator attributes. * c-c++-common/attributes-enum-1.c: New test. * c-c++-common/attributes-enum-2.c: New test. * g++.dg/cpp0x/attributes-enum-1.C: New test. diff --git gcc/c-family/c-common.c gcc/c-family/c-common.c index ada8e8a..36968e5 100644 --- gcc/c-family/c-common.c +++ gcc/c-family/c-common.c @@ -8810,6 +8810,7 @@ handle_deprecated_attribute (tree *node, tree name, || TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL || TREE_CODE (decl) == FIELD_DECL + || TREE_CODE (decl) == CONST_DECL || objc_method_decl (TREE_CODE (decl))) TREE_DEPRECATED (decl) = 1; else diff --git gcc/c/c-parser.c gcc/c/c-parser.c index bf0e4c57..889e6d7 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -2516,6 +2516,13 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, enumerator: enumeration-constant enumeration-constant = constant-expression + + GNU Extensions: + + enumerator: + enumeration-constant attributes[opt] + enumeration-constant attributes[opt] = constant-expression + */ static struct c_typespec @@ -2575,6 +2582,8 @@ c_parser_enum_specifier (c_parser *parser) c_parser_set_source_position_from_token (token); decl_loc = value_loc = token-location; c_parser_consume_token (parser); + /* Parse any specified attributes. */ + tree enum_attrs = c_parser_attributes (parser); if (c_parser_next_token_is (parser, CPP_EQ)) { c_parser_consume_token (parser); @@ -2584,7 +2593,9 @@ c_parser_enum_specifier (c_parser *parser) else enum_value = NULL_TREE; enum_decl = build_enumerator (decl_loc, value_loc, - the_enum, enum_id, enum_value); + the_enum, enum_id, enum_value); + if (enum_attrs) + decl_attributes (TREE_PURPOSE (enum_decl), enum_attrs, 0); TREE_CHAIN (enum_decl) = values; values = enum_decl; seen_comma = false; diff --git gcc/cp/cp-tree.h gcc/cp/cp-tree.h index e0fbf5e..6b26cb1
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
On Wed, 6 May 2015, Marek Polacek wrote: 2015-05-06 Marek Polacek pola...@redhat.com PR c/47043 * c-common.c (handle_deprecated_attribute): Allow CONST_DECL. Do all other attributes already reject CONST_DECL? I don't see any tests for unsupported attributes on enum values being properly diagnosed (adding tests for every unsupported attribute would seem excessive, but there should be a few). diff --git gcc/c/c-parser.c gcc/c/c-parser.c index bf0e4c57..f06a6b3 100644 --- gcc/c/c-parser.c +++ gcc/c/c-parser.c @@ -2584,7 +2584,11 @@ c_parser_enum_specifier (c_parser *parser) else enum_value = NULL_TREE; enum_decl = build_enumerator (decl_loc, value_loc, - the_enum, enum_id, enum_value); + the_enum, enum_id, enum_value); + /* Parse any specified attributes. */ + tree enum_attrs = c_parser_attributes (parser); + if (enum_attrs) + decl_attributes (TREE_PURPOSE (enum_decl), enum_attrs, 0); You need to update the syntax comment to include the new syntax. You also need to update the user documentation of attributes (syntax and semantics) in extend.texi to include this case. Why is the attribute going after the = value? That seems inconsistent with positioning of attributes in initialized variable declarations, for example. -- Joseph S. Myers jos...@codesourcery.com
Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)
In addition to a PR this is 1/2 of a C=+17 feature. (The other half - really a separate thing - is attributes on namespaces). I wonder if we should pedwarn for C++17? Or it could be just an extension for C++17 - I guess that would match with clang. if (SCOPED_ENUM_P (newtag)) diff --git gcc/cp/semantics.c gcc/cp/semantics.c index 701a8eb..b46c6fc 100644 --- gcc/cp/semantics.c +++ gcc/cp/semantics.c @@ -3651,11 +3651,6 @@ finish_id_expression (tree id_expression, } } - /* Handle references (c++/56130). */ - tree t = REFERENCE_REF_P (decl) ? TREE_OPERAND (decl, 0) : decl; - if (TREE_DEPRECATED (t)) -warn_deprecated_use (t, NULL_TREE); - return decl; } Why did this bit get removed? Do we handle enums in template specializations? Ed