c/c++, asm: Use nicer error for const and restrict
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 19 Dec 2018 16:16:05 +0000 (17:16 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 19 Dec 2018 16:16:05 +0000 (17:16 +0100)
Not all qualifiers are asm qualifiers.  We can talk about that in a
nicer way than just giving a generic parser error.

This also adds two testcases for C++, that previously were for C only.

c/
* c-parser.c (c_parser_asm_statement) <RID_CONST, RID_RESTRICT>: Give
a more specific error message (instead of just falling through).

cp/
* parser.c (cp_parser_asm_definition) <RID_CONST, RID_RESTRICT>: Give
a more specific error message (instead of just falling through).

testsuite/
* g++.dg/asm-qual-1.C: New testcase.
* g++.dg/asm-qual-2.C: New testcase.
* gcc.dg/asm-qual-1.c: Update.

From-SVN: r267279

gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/asm-qual-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/asm-qual-2.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/asm-qual-1.c

index 52b2c65ce8157716b98c78ab53ca75c2a8b9743f..6e12dda23317582a5fa335b7da356b5353985532 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * c-parser.c (c_parser_asm_statement) <RID_CONST, RID_RESTRICT>: Give
+       a more specific error message (instead of just falling through).
+
 2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * c-parser.c (c_parser_asm_statement): Keep track of the location each
index 652e53ca0258beb56b78b996be25ea036f863136..0def4976408f372b363e093bdad51c5d1f0dcf76 100644 (file)
@@ -6411,6 +6411,12 @@ c_parser_asm_statement (c_parser *parser)
          c_parser_consume_token (parser);
          continue;
 
+       case RID_CONST:
+       case RID_RESTRICT:
+         error_at (loc, "%qE is not an asm qualifier", token->value);
+         c_parser_consume_token (parser);
+         continue;
+
        default:
          break;
        }
index eb54a5250dc3575af59fd934558d57c11652eee8..4f84686e411a784bf886b36e703e9b713e6c5459 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * parser.c (cp_parser_asm_definition) <RID_CONST, RID_RESTRICT>: Give
+       a more specific error message (instead of just falling through).
+
 2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * parser.c (cp_parser_asm_definition): Rewrite the loop to work without
index b860fc4d2dc88066df8a26058fe56ee3b026c8e8..c4b969c84b9f3774dd03e353869d194ea0601144 100644 (file)
@@ -19743,6 +19743,12 @@ cp_parser_asm_definition (cp_parser* parser)
            cp_lexer_consume_token (parser->lexer);
            continue;
 
+         case RID_CONST:
+         case RID_RESTRICT:
+           error_at (loc, "%qT is not an asm qualifier", token->u.value);
+           cp_lexer_consume_token (parser->lexer);
+           continue;
+
          default:
            break;
          }
index b996242f00b07b6adaa1e3cfb3e963f874028e41..d5b99730899c60d6741ed8a9acef54c9276415a1 100644 (file)
@@ -1,3 +1,9 @@
+2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * g++.dg/asm-qual-1.C: New testcase.
+       * g++.dg/asm-qual-2.C: New testcase.
+       * gcc.dg/asm-qual-1.c: Update.
+
 2018-12-19  David Malcolm  <dmalcolm@redhat.com>
 
        PR c++/88375
diff --git a/gcc/testsuite/g++.dg/asm-qual-1.C b/gcc/testsuite/g++.dg/asm-qual-1.C
new file mode 100644 (file)
index 0000000..3fba592
--- /dev/null
@@ -0,0 +1,13 @@
+// Test that qualifiers other than volatile are disallowed on asm.
+// { dg-do compile }
+// { dg-options "-std=gnu++98" }
+
+void
+f ()
+{
+  asm volatile ("");
+
+  asm const (""); // { dg-error {'const' is not an asm qualifier} }
+
+  asm __restrict (""); // { dg-error {'__restrict' is not an asm qualifier} }
+}
diff --git a/gcc/testsuite/g++.dg/asm-qual-2.C b/gcc/testsuite/g++.dg/asm-qual-2.C
new file mode 100644 (file)
index 0000000..52968bd
--- /dev/null
@@ -0,0 +1,46 @@
+// Test that qualifiers on asm are allowed in any order.
+// { dg-do compile }
+// { dg-options "-std=c++98" }
+
+void
+f ()
+{
+  asm volatile goto ("" :::: lab);
+  asm volatile inline ("" :::);
+  asm inline volatile ("" :::);
+  asm inline goto ("" :::: lab);
+  asm goto volatile ("" :::: lab);
+  asm goto inline ("" :::: lab);
+
+  asm volatile inline goto ("" :::: lab);
+  asm volatile goto inline ("" :::: lab);
+  asm inline volatile goto ("" :::: lab);
+  asm inline goto volatile ("" :::: lab);
+  asm goto volatile inline ("" :::: lab);
+  asm goto inline volatile ("" :::: lab);
+
+  /* Duplicates are not allowed.  */
+  asm goto volatile volatile ("" :::: lab);  /* { dg-error "" } */
+  asm volatile goto volatile ("" :::: lab);  /* { dg-error "" } */
+  asm volatile volatile goto ("" :::: lab);  /* { dg-error "" } */
+  asm goto goto volatile ("" :::: lab);  /* { dg-error "" } */
+  asm goto volatile goto ("" :::: lab);  /* { dg-error "" } */
+  asm volatile goto goto ("" :::: lab);  /* { dg-error "" } */
+
+  asm inline volatile volatile ("" :::);  /* { dg-error "" } */
+  asm volatile inline volatile ("" :::);  /* { dg-error "" } */
+  asm volatile volatile inline ("" :::);  /* { dg-error "" } */
+  asm inline inline volatile ("" :::);  /* { dg-error "" } */
+  asm inline volatile inline ("" :::);  /* { dg-error "" } */
+  asm volatile inline inline ("" :::);  /* { dg-error "" } */
+
+  asm goto inline inline ("" :::: lab);  /* { dg-error "" } */
+  asm inline goto inline ("" :::: lab);  /* { dg-error "" } */
+  asm inline inline goto ("" :::: lab);  /* { dg-error "" } */
+  asm goto goto inline ("" :::: lab);  /* { dg-error "" } */
+  asm goto inline goto ("" :::: lab);  /* { dg-error "" } */
+  asm inline goto goto ("" :::: lab);  /* { dg-error "" } */
+
+lab:
+  ;
+}
index cb37283d13f943d4f1bfc3751498b063d9653b1f..eff6b45d2170e643b31f7f6504f35ece0fffa620 100644 (file)
@@ -8,9 +8,7 @@ f (void)
 {
   asm volatile ("");
 
-  asm const (""); /* { dg-error {expected '\(' before 'const'} } */
-  /* { dg-error {expected identifier} {} {target *-*-*} .-1 } */
+  asm const (""); /* { dg-error {'const' is not an asm qualifier} } */
 
-  asm restrict (""); /* { dg-error {expected '\(' before 'restrict'} } */
-  /* { dg-error {expected identifier} {} {target *-*-*} .-1 } */
+  asm restrict (""); /* { dg-error {'restrict' is not an asm qualifier} } */
 }