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 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  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)

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-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  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)

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  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)

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 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  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)

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
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)

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
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)

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  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)

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-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  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)

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

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