Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-23 Thread Ed Smith-Rowland

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)

2015-05-22 Thread Mikhail Maltsev
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)

2015-05-22 Thread Marek Polacek
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  
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)

2015-05-21 Thread Jason Merrill

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)

2015-05-21 Thread Marek Polacek
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  
> > 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,
> > + locat

Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-14 Thread Joseph Myers
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)

2015-05-14 Thread Marek Polacek
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  
>   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 @@ incre

Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-07 Thread Marek Polacek
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)

2015-05-07 Thread Sandra Loosemore

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)

2015-05-07 Thread Marek Polacek
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  
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_e

Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-07 Thread Ed Smith-Rowland

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
.
  

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
  };
};

template
  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 = D::Y; // { dg-warning ".D::Y. is deprecated" }

  return i;
}


Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-07 Thread Marek Polacek
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
.
 
> 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)

2015-05-07 Thread Marek Polacek
[ 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  
> 
>   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 
> %");
>TREE_READONLY (decl) = 1;
>DECL_INITIAL (decl) = value;
>  
> +  if (attributes)
> +cplus_decl_attributes (&decl, attributes, 0);
> +
>if (context && context == c

Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-06 Thread Ed Smith-Rowland
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




Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-06 Thread Marek Polacek
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  
> > 
> > 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  

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

Re: C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-06 Thread Joseph Myers
On Wed, 6 May 2015, Marek Polacek wrote:

> 2015-05-06  Marek Polacek  
> 
>   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


C/C++ PATCH to allow deprecating enum values (PR c/47043)

2015-05-06 Thread Marek Polacek
This patch implements a feature quite a lot of people wanted: allow using
__attribute__ ((deprecated)) on an enumerator.  Implementing it was quite
straightforward: parse the attributes and apply them to the CONST_DECL.

I hit an issue in the C++ FE though: since r217677 we produce the deprecated
diagnostic twice.  In finish_id_expression I've just removed the code that
isn't needed anymore (since we've already warned via mark_used), and in
constant_value_1 I'm passing 0 to mark_used to mollify the warning.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2015-05-06  Marek Polacek  

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.

* c-c++-common/attributes-enum-1.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..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);
  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 
%");
   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 }; };' we put `i'
on the TYPE_FIELDS list for `S'.  (That's so that you can say
diff --git gcc/cp/init.c gcc/cp/init.c
index c41e30c..9298f2d 100644
--- gcc/cp/init.c
+++ gcc/cp/init.c
@@ -2035,7 +2035,7 @@ constant_value_1 (tree decl, bool strict_p, bool 
return_aggregate_cst_ok_p)
 specialization, we must instantiate it here.  The
 initializer for the static data member is not processed
 until needed; we need it now.  */
-  mark_used (decl);
+  mark_used (decl, 0);
   mark_rvalue_use (decl);
   init = DECL_INITI