Commit 1edf8866 by Segher Boessenkool Committed by Segher Boessenkool

c/c++, asm: Use nicer error for const and restrict

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
parent db4fd626
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
asm qualifier is first seen; use that to give nicer "duplicate asm
qualifier" messages. Delete 'quals" variable, instead pass the
......
......@@ -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;
}
......
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
"done" boolean variable.
* parser.c (cp_parser_asm_definition): Keep track of the location each
......
......@@ -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;
}
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
......
// 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} }
}
// 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} } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment