From 9c9cfcbbbe659d16a216883ff9a9bcb098e243f0 Mon Sep 17 00:00:00 2001 From: Segher Boessenkool Date: Wed, 19 Dec 2018 16:55:28 +0100 Subject: [PATCH] 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 --- gcc/c/ChangeLog | 5 ++++ gcc/c/c-parser.c | 65 +++++++++++++++++++++----------------------- gcc/cp/ChangeLog | 5 ++++ gcc/cp/parser.c | 71 +++++++++++++++++++++--------------------------- 4 files changed, 72 insertions(+), 74 deletions(-) diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 3232614f430..d1beffaac62 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,8 @@ +2018-12-19 Segher Boessenkool + + * c-parser.c (c_parser_asm_statement): Rewrite the loop to work without + "done" boolean variable. + 2018-12-19 David Malcolm PR c++/87504 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index b875c4f4750..835c0d8b879 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -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. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7b794612c8b..44ac2a96ff0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2018-12-19 Segher Boessenkool + + * parser.c (cp_parser_asm_definition): Rewrite the loop to work without + "done" boolean variable. + 2018-12-19 David Malcolm PR c++/88375 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e5381b45d03..0e4716ff0d5 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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)) -- 2.30.2