c/c++, asm: Write the asm-qualifier loop without "done" boolean

As suggested by Jason.


c/
	* c-parser.c (c_parser_asm_statement): Rewrite the loop to work without
	"done" boolean variable.

cp/
	* parser.c (cp_parser_asm_definition): Rewrite the loop to work without
	"done" boolean variable.

From-SVN: r267277
This commit is contained in:
Segher Boessenkool 2018-12-19 16:55:28 +01:00 committed by Segher Boessenkool
parent 15c40a3b7c
commit 9c9cfcbbbe
4 changed files with 72 additions and 74 deletions

View File

@ -1,3 +1,8 @@
2018-12-19 Segher Boessenkool <segher@kernel.crashing.org>
* c-parser.c (c_parser_asm_statement): Rewrite the loop to work without
"done" boolean variable.
2018-12-19 David Malcolm <dmalcolm@redhat.com>
PR c++/87504

View File

@ -6372,40 +6372,37 @@ c_parser_asm_statement (c_parser *parser)
is_volatile = false;
is_inline = false;
is_goto = false;
for (bool done = false; !done; )
switch (c_parser_peek_token (parser)->keyword)
{
case RID_VOLATILE:
if (!is_volatile)
{
is_volatile = true;
quals = c_parser_peek_token (parser)->value;
c_parser_consume_token (parser);
}
else
done = true;
break;
case RID_INLINE:
if (!is_inline)
{
is_inline = true;
c_parser_consume_token (parser);
}
else
done = true;
break;
case RID_GOTO:
if (!is_goto)
{
is_goto = true;
c_parser_consume_token (parser);
}
else
done = true;
break;
default:
done = true;
}
for (;;)
{
switch (c_parser_peek_token (parser)->keyword)
{
case RID_VOLATILE:
if (is_volatile)
break;
is_volatile = true;
quals = c_parser_peek_token (parser)->value;
c_parser_consume_token (parser);
continue;
case RID_INLINE:
if (is_inline)
break;
is_inline = true;
c_parser_consume_token (parser);
continue;
case RID_GOTO:
if (is_goto)
break;
is_goto = true;
c_parser_consume_token (parser);
continue;
default:
break;
}
break;
}
/* ??? Follow the C++ parser rather than using the
lex_untranslated_string kludge. */

View File

@ -1,3 +1,8 @@
2018-12-19 Segher Boessenkool <segher@kernel.crashing.org>
* parser.c (cp_parser_asm_definition): Rewrite the loop to work without
"done" boolean variable.
2018-12-19 David Malcolm <dmalcolm@redhat.com>
PR c++/88375

View File

@ -19698,47 +19698,38 @@ cp_parser_asm_definition (cp_parser* parser)
cp_function_chain->invalid_constexpr = true;
}
/* See if the next token is `volatile'. */
/* Handle the asm-qualifier-list. */
if (cp_parser_allow_gnu_extensions_p (parser))
for (bool done = false; !done ; )
switch (cp_lexer_peek_token (parser->lexer)->keyword)
{
case RID_VOLATILE:
if (!volatile_p)
{
/* Remember that we saw the `volatile' keyword. */
volatile_p = true;
/* Consume the token. */
cp_lexer_consume_token (parser->lexer);
}
else
done = true;
break;
case RID_INLINE:
if (!inline_p && parser->in_function_body)
{
/* Remember that we saw the `inline' keyword. */
inline_p = true;
/* Consume the token. */
cp_lexer_consume_token (parser->lexer);
}
else
done = true;
break;
case RID_GOTO:
if (!goto_p && parser->in_function_body)
{
/* Remember that we saw the `goto' keyword. */
goto_p = true;
/* Consume the token. */
cp_lexer_consume_token (parser->lexer);
}
else
done = true;
break;
default:
done = true;
}
for (;;)
{
switch (cp_lexer_peek_token (parser->lexer)->keyword)
{
case RID_VOLATILE:
if (volatile_p)
break;
volatile_p = true;
cp_lexer_consume_token (parser->lexer);
continue;
case RID_INLINE:
if (inline_p || !parser->in_function_body)
break;
inline_p = true;
cp_lexer_consume_token (parser->lexer);
continue;
case RID_GOTO:
if (goto_p || !parser->in_function_body)
break;
goto_p = true;
cp_lexer_consume_token (parser->lexer);
continue;
default:
break;
}
break;
}
/* Look for the opening `('. */
if (!cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN))