@@ -6343,6 +6343,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;
}
@@ -19169,6 +19169,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;
}
new file mode 100644
@@ -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} }
+}
new file mode 100644
@@ -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:
+ ;
+}
@@ -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} } */
}