c-common.c (decl_attributes): Take a pointer to the node to which attributes are...
authorJoseph Myers <jsm28@cam.ac.uk>
Fri, 13 Jul 2001 20:40:43 +0000 (21:40 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Fri, 13 Jul 2001 20:40:43 +0000 (21:40 +0100)
* c-common.c (decl_attributes): Take a pointer to the node to
which attributes are to be attached, and a flags argument.
* c-common.h (enum attribute_flags): New.
(decl_attributes): Update prototype.
* c-decl.c (start_decl, push_parm_decl, finish_struct,
finish_enum, start_function): Update calls to decl_attributes.
* c-parse.in (component_declarator, component_notype_declarator,
label): Update calls to decl_attributes.

cp:
* decl2.c (cplus_decl_attributes): Take a pointer to the node to
which attributes are to be attached, and a flags argument.  Update
call to decl_attributes.
(grokfield): Update call to decl_attributes.
* class.c (finish_struct): Update call to cplus_decl_attributes.
* cp-tree.h (cplus_decl_attributes): Update prototype.
* decl.c (start_decl, grokdeclarator, start_function): Update
calls to decl_attributes and cplus_decl_attributes.
* friend.c (do_friend): Update call to cplus_decl_attributes.
* parse.y (parse_bitfield): Update call to cplus_decl_attributes.

From-SVN: r43995

12 files changed:
gcc/ChangeLog
gcc/c-common.c
gcc/c-common.h
gcc/c-decl.c
gcc/c-parse.in
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/cp/friend.c
gcc/cp/parse.y

index 8be501f37949783d08a77e56b7d8e3a8545eba49..5fa755290bf55daa721eef0fbd63c9f82e54f7b2 100644 (file)
@@ -1,3 +1,14 @@
+2001-07-13  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * c-common.c (decl_attributes): Take a pointer to the node to
+       which attributes are to be attached, and a flags argument.
+       * c-common.h (enum attribute_flags): New.
+       (decl_attributes): Update prototype.
+       * c-decl.c (start_decl, push_parm_decl, finish_struct,
+       finish_enum, start_function): Update calls to decl_attributes.
+       * c-parse.in (component_declarator, component_notype_declarator,
+       label): Update calls to decl_attributes.
+
 Fri Jul 13 23:04:00 2001  Denis Chertykov  <denisc@overta.ru>
 
        * config/avr/avr.md (strlenhi): PARALLEL keyword removed.
index 0213843be9ed7c0f5385dd5e92298b355796d9be..751ba267c9871e4ab6be79a8adc1af26e7f6d6e5 100644 (file)
@@ -723,12 +723,19 @@ default_valid_lang_attribute (attr_name, attr_args, decl, type)
 int (*valid_lang_attribute) PARAMS ((tree, tree, tree, tree))
      = default_valid_lang_attribute;
 
-/* Process the attributes listed in ATTRIBUTES and install them in NODE,
-   which is either a DECL (including a TYPE_DECL) or a TYPE.  */
+/* Process the attributes listed in ATTRIBUTES and install them in *NODE,
+   which is either a DECL (including a TYPE_DECL) or a TYPE.  If a DECL,
+   it should be modified in place; if a TYPE, a copy should be created.
+   FLAGS gives further information, in the form of a bitwise OR of flags
+   in enum attribute_flags from c-common.h.  Depending on these flags,
+   some attributes may be returned to be applied at a later stage (for
+   example, to apply a decl attribute to the declaration rather than to
+   its type).  */
 
-void
-decl_attributes (node, attributes)
-     tree node, attributes;
+tree
+decl_attributes (node, attributes, flags)
+     tree *node, attributes;
+     int flags ATTRIBUTE_UNUSED;
 {
   tree decl = 0, type = 0;
   int is_type = 0;
@@ -737,16 +744,16 @@ decl_attributes (node, attributes)
   if (attrtab_idx == 0)
     init_attributes ();
 
-  if (DECL_P (node))
+  if (DECL_P (*node))
     {
-      decl = node;
+      decl = *node;
       type = TREE_TYPE (decl);
-      is_type = TREE_CODE (node) == TYPE_DECL;
+      is_type = TREE_CODE (*node) == TYPE_DECL;
     }
-  else if (TYPE_P (node))
-    type = node, is_type = 1;
+  else if (TYPE_P (*node))
+    type = *node, is_type = 1;
 
-  (*targetm.insert_attributes) (node, &attributes);
+  (*targetm.insert_attributes) (*node, &attributes);
 
   for (a = attributes; a; a = TREE_CHAIN (a))
     {
@@ -979,16 +986,16 @@ decl_attributes (node, attributes)
              else if (DECL_SECTION_NAME (decl) != NULL_TREE
                       && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)),
                                  TREE_STRING_POINTER (TREE_VALUE (args))) != 0)
-               error_with_decl (node,
+               error_with_decl (*node,
                                 "section of `%s' conflicts with previous declaration");
              else
                DECL_SECTION_NAME (decl) = TREE_VALUE (args);
            }
          else
-           error_with_decl (node,
+           error_with_decl (*node,
                           "section attribute not allowed for `%s'");
 #else
-         error_with_decl (node,
+         error_with_decl (*node,
                  "section attributes are not supported for this target");
 #endif
          break;
@@ -1140,6 +1147,7 @@ decl_attributes (node, attributes)
          break;
        }
     }
+  return NULL_TREE;
 }
 
 /* Split SPECS_ATTRS, a list of declspecs and prefix attributes, into two
index eac227e48d2ab642946772208d80766dd43c46d2..0ba64b121d17756a578004efb861fb26c991b3f4 100644 (file)
@@ -498,7 +498,25 @@ extern void finish_fname_decls                     PARAMS ((void));
 extern const char *fname_as_string             PARAMS ((int));
 extern tree fname_decl                         PARAMS ((unsigned, tree));
 extern const char *fname_string                        PARAMS ((unsigned));
-extern void decl_attributes                    PARAMS ((tree, tree));
+
+/* Flags that may be passed in the third argument of decl_attributes.  */
+enum attribute_flags
+{
+  /* The type passed in is the type of a DECL, and any attributes that
+     should be passed in again to be applied to the DECL rather than the
+     type should be returned.  */
+  ATTR_FLAG_DECL_NEXT = 1,
+  /* The type passed in is a function return type, and any attributes that
+     should be passed in again to be applied to the function type rather
+     than the return type should be returned.  */
+  ATTR_FLAG_FUNCTION_NEXT = 2,
+  /* The type passed in is an array element type, and any attributes that
+     should be passed in again to be applied to the array type rather
+     than the element type should be returned.  */
+  ATTR_FLAG_ARRAY_NEXT = 4
+};
+
+extern tree decl_attributes                    PARAMS ((tree *, tree, int));
 extern void init_function_format_info          PARAMS ((void));
 extern void check_function_format              PARAMS ((int *, tree, tree, tree));
 extern void set_Wformat                                PARAMS ((int));
index dc100db5ad4ae6bbf9a2c6158be8508bee9930d1..a9f6968b7ea9a6b9f1a02404aa79cdc3c7a0a2bf 100644 (file)
@@ -3341,8 +3341,8 @@ start_decl (declarator, declspecs, initialized, attributes)
      int initialized;
      tree attributes;
 {
-  register tree decl = grokdeclarator (declarator, declspecs,
-                                      NORMAL, initialized);
+  tree decl = grokdeclarator (declarator, declspecs,
+                             NORMAL, initialized);
   register tree tem;
 
   if (warn_main > 0 && TREE_CODE (decl) != FUNCTION_DECL
@@ -3448,7 +3448,7 @@ start_decl (declarator, declspecs, initialized, attributes)
     DECL_COMMON (decl) = 1;
 
   /* Set attributes here so if duplicate decl, will have proper attributes.  */
-  decl_attributes (decl, attributes);
+  decl_attributes (&decl, attributes, 0);
 
   /* Add this decl to the current binding level.
      TEM may equal DECL or it may be a previous decl of the same name.  */
@@ -3712,7 +3712,7 @@ push_parm_decl (parm)
 
   decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)),
                         TREE_PURPOSE (TREE_PURPOSE (parm)), PARM, 0);
-  decl_attributes (decl, TREE_VALUE (parm));
+  decl_attributes (&decl, TREE_VALUE (parm), 0);
 
 #if 0
   if (DECL_NAME (decl))
@@ -5340,7 +5340,7 @@ finish_struct (t, fieldlist, attributes)
 
   TYPE_SIZE (t) = 0;
 
-  decl_attributes (t, attributes);
+  decl_attributes (&t, attributes, 0);
 
   /* Nameless union parm types are useful as GCC extension.  */
   if (! (TREE_CODE (t) == UNION_TYPE && TYPE_NAME (t) == 0) && !pedantic)
@@ -5704,7 +5704,7 @@ finish_enum (enumtype, values, attributes)
   if (in_parm_level_p ())
     warning ("enum defined inside parms");
 
-  decl_attributes (enumtype, attributes);
+  decl_attributes (&enumtype, attributes, 0);
 
   /* Calculate the maximum value of any enumerator in this type.  */
 
@@ -5928,7 +5928,7 @@ start_function (declspecs, declarator, attributes)
       return 0;
     }
 
-  decl_attributes (decl1, attributes);
+  decl_attributes (&decl1, attributes, 0);
 
   announce_function (decl1);
 
index ad2d5f7f13d31b690e8eb89f18aec9278ea6be64..a094ebb146f21bc6e90bf1561ebe200c97bc0d6d 100644 (file)
@@ -1896,27 +1896,27 @@ components_notype:
 component_declarator:
          save_filename save_lineno declarator maybe_attribute
                { $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE);
-                 decl_attributes ($$, chainon ($4, prefix_attributes)); }
+                 decl_attributes (&$$, chainon ($4, prefix_attributes), 0); }
        | save_filename save_lineno
          declarator ':' expr_no_commas maybe_attribute
                { $$ = grokfield ($1, $2, $3, current_declspecs, $5);
-                 decl_attributes ($$, chainon ($6, prefix_attributes)); }
+                 decl_attributes (&$$, chainon ($6, prefix_attributes), 0); }
        | save_filename save_lineno ':' expr_no_commas maybe_attribute
                { $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4);
-                 decl_attributes ($$, chainon ($5, prefix_attributes)); }
+                 decl_attributes (&$$, chainon ($5, prefix_attributes), 0); }
        ;
 
 component_notype_declarator:
          save_filename save_lineno notype_declarator maybe_attribute
                { $$ = grokfield ($1, $2, $3, current_declspecs, NULL_TREE);
-                 decl_attributes ($$, chainon ($4, prefix_attributes)); }
+                 decl_attributes (&$$, chainon ($4, prefix_attributes), 0); }
        | save_filename save_lineno
          notype_declarator ':' expr_no_commas maybe_attribute
                { $$ = grokfield ($1, $2, $3, current_declspecs, $5);
-                 decl_attributes ($$, chainon ($6, prefix_attributes)); }
+                 decl_attributes (&$$, chainon ($6, prefix_attributes), 0); }
        | save_filename save_lineno ':' expr_no_commas maybe_attribute
                { $$ = grokfield ($1, $2, NULL_TREE, current_declspecs, $4);
-                 decl_attributes ($$, chainon ($5, prefix_attributes)); }
+                 decl_attributes (&$$, chainon ($5, prefix_attributes), 0); }
        ;
 
 /* We chain the enumerators in reverse order.
@@ -2447,7 +2447,7 @@ label:      CASE expr_no_commas ':'
                  stmt_count++;
                  if (label)
                    {
-                     decl_attributes (label, $5);
+                     decl_attributes (&label, $5, 0);
                      $$ = add_stmt (build_stmt (LABEL_STMT, label));
                    }
                  else
index 3d8f346349eaf426d453a1dff135dca003a1076b..61e59933461d4e14a0118483c43682e355f5963a 100644 (file)
@@ -1,3 +1,16 @@
+2001-07-13  Joseph S. Myers  <jsm28@cam.ac.uk>
+
+       * decl2.c (cplus_decl_attributes): Take a pointer to the node to
+       which attributes are to be attached, and a flags argument.  Update
+       call to decl_attributes.
+       (grokfield): Update call to decl_attributes.
+       * class.c (finish_struct): Update call to cplus_decl_attributes.
+       * cp-tree.h (cplus_decl_attributes): Update prototype.
+       * decl.c (start_decl, grokdeclarator, start_function): Update
+       calls to decl_attributes and cplus_decl_attributes.
+       * friend.c (do_friend): Update call to cplus_decl_attributes.
+       * parse.y (parse_bitfield): Update call to cplus_decl_attributes.
+
 2001-07-12  Mark Mitchell  <mark@codesourcery.com>
 
        * decl.c (make_rtl_for_nonlocal_decl): Set DECL_C_HARD_REGISTER
index fac4a3891a9534cbf9bf8a17f0674f0ba75244ce..2ec3448d6365ce717613496143f17e14218664d6 100644 (file)
@@ -5539,7 +5539,7 @@ finish_struct (t, attributes)
      as necessary.  */
   unreverse_member_declarations (t);
 
-  cplus_decl_attributes (t, attributes, NULL_TREE);
+  cplus_decl_attributes (&t, attributes, NULL_TREE, 0);
 
   /* Nadger the current location so that diagnostics point to the start of
      the struct, not the end.  */
index 66ce4fb0d31418aebb26bde50f84fdbb410753ce..e8a61a8b11c8a06dd7b4d546646451c66d452afa 100644 (file)
@@ -3907,7 +3907,7 @@ extern tree grokbitfield                  PARAMS ((tree, tree, tree));
 extern tree groktypefield                      PARAMS ((tree, tree));
 extern tree grokoptypename                     PARAMS ((tree, tree));
 extern int copy_assignment_arg_p               PARAMS ((tree, int));
-extern void cplus_decl_attributes              PARAMS ((tree, tree, tree));
+extern void cplus_decl_attributes              PARAMS ((tree *, tree, tree, int));
 extern tree constructor_name_full              PARAMS ((tree));
 extern tree constructor_name                   PARAMS ((tree));
 extern void defer_fn                           PARAMS ((tree));
index c0e9b85a4718552e720edb9c3c03e63104e4b0cc..bc157b37d6861446ba71c7735934a2a66dd96343 100644 (file)
@@ -7128,7 +7128,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
      int initialized;
      tree attributes, prefix_attributes;
 {
-  register tree decl;
+  tree decl;
   register tree type, tem;
   tree context;
   extern int have_extern_spec;
@@ -7221,7 +7221,7 @@ start_decl (declarator, declspecs, initialized, attributes, prefix_attributes)
     }
 
   /* Set attributes here so if duplicate decl, will have proper attributes.  */
-  cplus_decl_attributes (decl, attributes, prefix_attributes);
+  cplus_decl_attributes (&decl, attributes, prefix_attributes, 0);
 
   if (context && COMPLETE_TYPE_P (complete_type (context)))
     {
@@ -10471,7 +10471,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
        ignore_attrs = 0;
       else if (inner_attrs)
        {
-         decl_attributes (type, inner_attrs);
+         decl_attributes (&type, inner_attrs, 0);
          inner_attrs = NULL_TREE;
        }
 
@@ -10990,7 +10990,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, attrlist)
   if (inner_attrs)
     {
       if (! ignore_attrs)
-       decl_attributes (type, inner_attrs);
+       decl_attributes (&type, inner_attrs, 0);
       else if (attrlist)
        TREE_VALUE (attrlist) = chainon (inner_attrs, TREE_VALUE (attrlist));
       else
@@ -13639,7 +13639,7 @@ start_function (declspecs, declarator, attrs, flags)
   pushlevel (0);
   current_binding_level->parm_flag = 1;
 
-  cplus_decl_attributes (decl1, NULL_TREE, attrs);
+  cplus_decl_attributes (&decl1, NULL_TREE, attrs, 0);
 
   /* Promote the value to int before returning it.  */
   if (c_promoting_integer_type_p (restype))
index e6d4274ebb272a2bbabd0a121913110712534910..5a1a1edc66736faf34b037c6d8b52e793178cfe7 100644 (file)
@@ -1531,7 +1531,7 @@ tree
 grokfield (declarator, declspecs, init, asmspec_tree, attrlist)
      tree declarator, declspecs, init, asmspec_tree, attrlist;
 {
-  register tree value;
+  tree value;
   const char *asmspec = 0;
   int flags = LOOKUP_ONLYCONVERTING;
 
@@ -1679,8 +1679,8 @@ grokfield (declarator, declspecs, init, asmspec_tree, attrlist)
     value = push_template_decl (value);
 
   if (attrlist)
-    cplus_decl_attributes (value, TREE_PURPOSE (attrlist),
-                          TREE_VALUE (attrlist));
+    cplus_decl_attributes (&value, TREE_PURPOSE (attrlist),
+                          TREE_VALUE (attrlist), 0);
 
   if (TREE_CODE (value) == VAR_DECL)
     {
@@ -1875,19 +1875,20 @@ grok_function_init (decl, init)
 }
 \f
 void
-cplus_decl_attributes (decl, attributes, prefix_attributes)
-     tree decl, attributes, prefix_attributes;
+cplus_decl_attributes (decl, attributes, prefix_attributes, flags)
+     tree *decl, attributes, prefix_attributes;
+     int flags;
 {
-  if (decl == NULL_TREE || decl == void_type_node)
+  if (*decl == NULL_TREE || *decl == void_type_node)
     return;
 
-  if (TREE_CODE (decl) == TEMPLATE_DECL)
-    decl = DECL_TEMPLATE_RESULT (decl);
+  if (TREE_CODE (*decl) == TEMPLATE_DECL)
+    decl = &DECL_TEMPLATE_RESULT (*decl);
 
-  decl_attributes (decl, chainon (attributes, prefix_attributes));
+  decl_attributes (decl, chainon (attributes, prefix_attributes), flags);
 
-  if (TREE_CODE (decl) == TYPE_DECL)
-    SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (decl), TREE_TYPE (decl));
+  if (TREE_CODE (*decl) == TYPE_DECL)
+    SET_IDENTIFIER_TYPE_VALUE (DECL_NAME (*decl), TREE_TYPE (*decl));
 }
 \f
 /* CONSTRUCTOR_NAME:
index c27a73ecc2ca1f501c702cc4524343fdd780c1d3..f7ff9848a6fe66a30f02932468471d03a1dbd2f5 100644 (file)
@@ -447,7 +447,7 @@ do_friend (ctype, declarator, decl, parmdecls, attrlist,
     } 
 
   /* Set attributes here so if duplicate decl, will have proper attributes.  */
-  cplus_decl_attributes (decl, attributes, prefix_attributes);
+  cplus_decl_attributes (&decl, attributes, prefix_attributes, 0);
 
   return decl;
 }
index 6e2ac183ce55685f87ee308b47f984753480731c..276537582d24abefc322dc778e5ffd540f33914d 100644 (file)
@@ -182,7 +182,7 @@ parse_bitfield (declarator, attributes, width)
      tree declarator, attributes, width;
 {
   tree d = grokbitfield (declarator, current_declspecs, width);
-  cplus_decl_attributes (d, attributes, prefix_attributes);
+  cplus_decl_attributes (&d, attributes, prefix_attributes, 0);
   decl_type_access_control (d);
   return d;
 }