diff options
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/c/c-parser.c | 65 |
2 files changed, 36 insertions, 34 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 3232614..d1beffa 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -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 diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index b875c4f..835c0d8 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. */ |