+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
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);
continue;
case RID_INLINE:
- if (!parser->in_function_body)
- break;
if (inline_loc)
{
error_at (loc, "duplicate asm qualifier %qT", token->u.value);
continue;
case RID_GOTO:
- if (!parser->in_function_body)
- break;
if (goto_loc)
{
error_at (loc, "duplicate asm qualifier %qT", token->u.value);
+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.
--- /dev/null
+// 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 "" }
--- /dev/null
+/* 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'} } */