]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
(attrib): Handle string args as expressions,
authorRichard Stallman <rms@gnu.org>
Mon, 28 Mar 1994 01:27:48 +0000 (01:27 +0000)
committerRichard Stallman <rms@gnu.org>
Mon, 28 Mar 1994 01:27:48 +0000 (01:27 +0000)
merging the two rules.  `mode' attribute now takes a string arg.
Delete the rule for an identifier as arg.

From-SVN: r6913

gcc/c-parse.in

index 36cfa2addb39fc209ce51ff125ae79d456fc657d..57530d063fb4891a9a0eaf9e20ed43c187c6353f 100644 (file)
@@ -1062,31 +1062,27 @@ attribute_list
     ;
 
 attrib
-    : IDENTIFIER
+    : identifier
        { if (strcmp (IDENTIFIER_POINTER ($1), "packed")
              && strcmp (IDENTIFIER_POINTER ($1), "noreturn"))
            warning ("`%s' attribute directive ignored",
                     IDENTIFIER_POINTER ($1));
          $$ = $1; }
     | TYPE_QUAL
-    | IDENTIFIER '(' IDENTIFIER ')'
-       { /* If not "mode (m)" or "aligned", then issue warning. 
-            If "aligned", this will later produce an error in decl_attributes
-            since an identifier is not a valid constant, but we want to give
-            an error instead of a warning when the attribute name is
-            recognized but has an improper argument.  */
-         if (strcmp (IDENTIFIER_POINTER ($1), "mode") != 0
-             && strcmp (IDENTIFIER_POINTER ($1), "aligned") != 0)
+    | identifier '(' expr_no_commas ')'
+       { /* If not aligned(n) or section(name), then issue warning */
+         if (strcmp (IDENTIFIER_POINTER ($1), "section") == 0
+             || strcmp (IDENTIFIER_POINTER ($1), "mode") == 0)
            {
-             warning ("`%s' attribute directive ignored",
-                      IDENTIFIER_POINTER ($1));
-             $$ = $1;
+             if (TREE_CODE ($3) != STRING_CST)
+               {
+                 error ("invalid argument in `%s' attribute",
+                        IDENTIFIER_POINTER ($1));
+                 $$ = $1;
+               }
+             $$ = tree_cons ($1, $3, NULL_TREE);
            }
-         else
-           $$ = tree_cons ($1, $3, NULL_TREE); }
-    | IDENTIFIER '(' expr_no_commas ')'
-       { /* if not "aligned(n)", then issue warning */
-         if (strcmp (IDENTIFIER_POINTER ($1), "aligned") != 0)
+         else if (strcmp (IDENTIFIER_POINTER ($1), "aligned") != 0)
            {
              warning ("`%s' attribute directive ignored",
                       IDENTIFIER_POINTER ($1));
@@ -1094,7 +1090,7 @@ attrib
            }
          else
            $$ = tree_cons ($1, $3, NULL_TREE); }
-    | IDENTIFIER '(' IDENTIFIER ',' expr_no_commas ',' expr_no_commas ')'
+    | identifier '(' IDENTIFIER ',' expr_no_commas ',' expr_no_commas ')'
        { /* if not "format(...)", then issue warning */
          if (strcmp (IDENTIFIER_POINTER ($1), "format") != 0)
            {
@@ -1108,16 +1104,6 @@ attrib
                                       tree_cons ($5, $7, NULL_TREE),
                                       NULL_TREE),
                            NULL_TREE); }
-    | IDENTIFIER '(' STRING ')'
-       { /* If not "section (name)", then issue warning.  */
-         if (strcmp (IDENTIFIER_POINTER ($1), "section") != 0)
-           {
-             warning ("`%s' attribute directive ignored",
-                      IDENTIFIER_POINTER ($1));
-             $$ = $1;
-           }
-         else
-           $$ = tree_cons ($1, $3, NULL_TREE); }
     ;
 \f
 /* Initializers.  `init' is the entry point.  */