X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=parser.c;h=dcd6cdc2c7f7b98da799a1ca3c997988bfa1534d;hb=d2c97d08e22cfca07b4ac98ae8d4a9c5cb3b9261;hp=095c010f3a05085d3d397960961eac0632b9d738;hpb=e5e0e26ebb8a250283a43ff85477a8435d6645fa;p=cparser diff --git a/parser.c b/parser.c index 095c010..dcd6cdc 100644 --- a/parser.c +++ b/parser.c @@ -118,7 +118,7 @@ static statement_t *current_parent = NULL; static ms_try_statement_t *current_try = NULL; static linkage_kind_t current_linkage = LINKAGE_INVALID; static goto_statement_t *goto_first = NULL; -static goto_statement_t *goto_last = NULL; +static goto_statement_t **goto_anchor = NULL; static label_statement_t *label_first = NULL; static label_statement_t **label_anchor = NULL; /** current translation unit. */ @@ -5272,8 +5272,6 @@ static void check_labels(void) "label '%Y' used but not defined", label->base.symbol); } } - goto_first = NULL; - goto_last = NULL; if (warning.unused_label) { for (const label_statement_t *label_statement = label_first; @@ -5288,8 +5286,6 @@ static void check_labels(void) } } } - label_first = NULL; - label_anchor = &label_first; } static void warn_unused_decl(entity_t *entity, entity_t *end, @@ -5970,7 +5966,12 @@ static void parse_external_declaration(void) current_function = function; current_parent = NULL; - statement_t *const body = parse_compound_statement(false); + goto_first = NULL; + goto_anchor = &goto_first; + label_first = NULL; + label_anchor = &label_first; + + statement_t *const body = parse_compound_statement(false); function->statement = body; first_err = true; check_labels(); @@ -6313,10 +6314,10 @@ static expression_t *parse_character_constant(void) cnst->conste.v.character = token.v.string; if (cnst->conste.v.character.size != 1) { - if (warning.multichar && GNU_MODE) { + if (!GNU_MODE) { + errorf(HERE, "more than 1 character in character constant"); + } else if (warning.multichar) { warningf(HERE, "multi-character character constant"); - } else { - errorf(HERE, "more than 1 characters in character constant"); } } next_token(); @@ -6334,10 +6335,10 @@ static expression_t *parse_wide_character_constant(void) cnst->conste.v.wide_character = token.v.wide_string; if (cnst->conste.v.wide_character.size != 1) { - if (warning.multichar && GNU_MODE) { + if (!GNU_MODE) { + errorf(HERE, "more than 1 character in character constant"); + } else if (warning.multichar) { warningf(HERE, "multi-character character constant"); - } else { - errorf(HERE, "more than 1 characters in character constant"); } } next_token(); @@ -9809,8 +9810,8 @@ static statement_t *parse_goto(void) expression_t *expression = parse_expression(); mark_vars_read(expression, NULL); - /* Argh: although documentation say the expression must be of type void *, - * gcc excepts anything that can be casted into void * without error */ + /* Argh: although documentation says the expression must be of type void*, + * gcc accepts anything that can be casted into void* without error */ type_t *type = expression->base.type; if (type != type_error_type) { @@ -9841,12 +9842,8 @@ static statement_t *parse_goto(void) } /* remember the goto's in a list for later checking */ - if (goto_last == NULL) { - goto_first = &statement->gotos; - } else { - goto_last->next = &statement->gotos; - } - goto_last = &statement->gotos; + *goto_anchor = &statement->gotos; + goto_anchor = &statement->gotos.next; expect(';');