c++, asm: Do not handle any asm-qualifiers in top-level asm
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 19 Dec 2018 16:22:47 +0000 (17:22 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 19 Dec 2018 16:22:47 +0000 (17:22 +0100)
Previously, "volatile" was allowed.  Changing this simplifies the code,
makes things more regular, and makes the C and C++ frontends handle
this the same way.

cp/
* parser.c (cp_parser_asm_definition): Do not allow any asm qualifiers
on top-level asm.

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

From-SVN: r267280

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

index 4f84686e411a784bf886b36e703e9b713e6c5459..01d2f576c227cd9a2001d5651fcfbaa7047ab6d0 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * parser.c (cp_parser_asm_definition): Do not allow any asm qualifiers
+       on top-level asm.
+
 2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * parser.c (cp_parser_asm_definition) <RID_CONST, RID_RESTRICT>: Give
index c4b969c84b9f3774dd03e353869d194ea0601144..d6bac826581200537853d0f4b801cd32f1a176c2 100644 (file)
@@ -19699,7 +19699,8 @@ cp_parser_asm_definition (cp_parser* parser)
   location_t volatile_loc = UNKNOWN_LOCATION;
   location_t inline_loc = UNKNOWN_LOCATION;
   location_t goto_loc = UNKNOWN_LOCATION;
-  if (cp_parser_allow_gnu_extensions_p (parser))
+
+  if (cp_parser_allow_gnu_extensions_p (parser) && parser->in_function_body)
     for (;;)
       {
        cp_token *token = cp_lexer_peek_token (parser->lexer);
@@ -19718,8 +19719,6 @@ cp_parser_asm_definition (cp_parser* parser)
            continue;
 
          case RID_INLINE:
-           if (!parser->in_function_body)
-             break;
            if (inline_loc)
              {
                error_at (loc, "duplicate asm qualifier %qT", token->u.value);
@@ -19731,8 +19730,6 @@ cp_parser_asm_definition (cp_parser* parser)
            continue;
 
          case RID_GOTO:
-           if (!parser->in_function_body)
-             break;
            if (goto_loc)
              {
                error_at (loc, "duplicate asm qualifier %qT", token->u.value);
index d5b99730899c60d6741ed8a9acef54c9276415a1..d1ebfc7c3469577d51597762c30ab21a97029b5f 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * g++.dg/asm-qual-3.C: New testcase.
+       * gcc.dg/asm-qual-3.c: New testcase.
+
 2018-12-19  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * g++.dg/asm-qual-1.C: New testcase.
diff --git a/gcc/testsuite/g++.dg/asm-qual-3.C b/gcc/testsuite/g++.dg/asm-qual-3.C
new file mode 100644 (file)
index 0000000..95c9b57
--- /dev/null
@@ -0,0 +1,12 @@
+// Test that asm-qualifiers are not allowed on toplevel asm.
+// { dg-do compile }
+// { dg-options "-std=gnu++98" }
+
+asm const ("");    // { dg-error {expected '\(' before 'const'} }
+asm volatile (""); // { dg-error {expected '\(' before 'volatile'} }
+asm restrict (""); // { dg-error {expected '\(' before 'restrict'} }
+asm inline ("");   // { dg-error {expected '\(' before 'inline'} }
+asm goto ("");     // { dg-error {expected '\(' before 'goto'} }
+
+// There are many other things wrong with this code, so:
+// { dg-excess-errors "" }
diff --git a/gcc/testsuite/gcc.dg/asm-qual-3.c b/gcc/testsuite/gcc.dg/asm-qual-3.c
new file mode 100644 (file)
index 0000000..f85d8bf
--- /dev/null
@@ -0,0 +1,9 @@
+/* Test that asm-qualifiers are not allowed on toplevel asm.  */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu99" } */
+
+asm const ("");    /* { dg-error {expected '\(' before 'const'} } */
+asm volatile (""); /* { dg-error {expected '\(' before 'volatile'} } */
+asm restrict (""); /* { dg-error {expected '\(' before 'restrict'} } */
+asm inline ("");   /* { dg-error {expected '\(' before 'inline'} } */
+asm goto ("");     /* { dg-error {expected '\(' before 'goto'} } */