re PR bootstrap/79052 (bootstrap-ubsan failures due to warnings)

2017-01-11  Richard Biener  <rguenther@suse.de>

	PR bootstrap/79052
	* gimple-parser.c (c_parser_gimple_switch_stmt): Add missing
	returns on parse errors.

From-SVN: r244310
This commit is contained in:
Richard Biener 2017-01-11 11:26:59 +00:00 committed by Richard Biener
parent f3df0b3cde
commit e325277522
2 changed files with 103 additions and 95 deletions

View file

@ -1,3 +1,9 @@
2017-01-11 Richard Biener <rguenther@suse.de>
PR bootstrap/79052
* gimple-parser.c (c_parser_gimple_switch_stmt): Add missing
returns on parse errors.
2017-01-04 Marek Polacek <polacek@redhat.com>
PR c++/64767

View file

@ -1259,118 +1259,120 @@ c_parser_gimple_switch_stmt (c_parser *parser, gimple_seq *seq)
gimple_seq switch_body = NULL;
c_parser_consume_token (parser);
if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
{
cond_expr = c_parser_gimple_postfix_expression (parser);
if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
return;
}
if (! c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
return;
cond_expr = c_parser_gimple_postfix_expression (parser);
if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
return;
if (c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
if (! c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
return;
while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
{
while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
if (c_parser_next_token_is (parser, CPP_EOF))
{
if (c_parser_next_token_is (parser, CPP_EOF))
{
c_parser_error (parser, "expected statement");
return;
}
c_parser_error (parser, "expected statement");
return;
}
switch (c_parser_peek_token (parser)->keyword)
{
case RID_CASE:
switch (c_parser_peek_token (parser)->keyword)
{
case RID_CASE:
{
c_expr exp1;
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME)
|| c_parser_peek_token (parser)->type == CPP_NUMBER)
exp1 = c_parser_gimple_postfix_expression (parser);
else
{
c_expr exp1;
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME)
|| c_parser_peek_token (parser)->type == CPP_NUMBER)
exp1 = c_parser_gimple_postfix_expression (parser);
else
c_parser_error (parser, "expected expression");
if (c_parser_next_token_is (parser, CPP_COLON))
{
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME))
{
label = c_parser_peek_token (parser)->value;
c_parser_consume_token (parser);
tree decl = lookup_label_for_goto (loc, label);
case_label = build_case_label (exp1.value, NULL_TREE,
decl);
labels.safe_push (case_label);
if (! c_parser_require (parser, CPP_SEMICOLON,
"expected %<;%>"))
return;
}
else if (! c_parser_require (parser, CPP_NAME,
"expected label"))
return;
}
else if (! c_parser_require (parser, CPP_SEMICOLON,
"expected %<:%>"))
return;
break;
c_parser_error (parser, "expected expression");
return;
}
case RID_DEFAULT:
if (c_parser_next_token_is (parser, CPP_COLON))
{
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_COLON))
{
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME))
{
label = c_parser_peek_token (parser)->value;
c_parser_consume_token (parser);
tree decl = lookup_label_for_goto (loc, label);
default_label = build_case_label (NULL_TREE, NULL_TREE,
decl);
if (! c_parser_require (parser, CPP_SEMICOLON,
"expected %<;%>"))
return;
}
else if (! c_parser_require (parser, CPP_NAME,
"expected label"))
return;
}
else if (! c_parser_require (parser, CPP_SEMICOLON,
"expected %<:%>"))
return;
break;
}
case RID_GOTO:
{
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME))
{
c_parser_gimple_goto_stmt (loc,
c_parser_peek_token
(parser)->value,
&switch_body);
label = c_parser_peek_token (parser)->value;
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_SEMICOLON))
c_parser_consume_token (parser);
else
{
c_parser_error (parser, "expected semicolon");
return;
}
tree decl = lookup_label_for_goto (loc, label);
case_label = build_case_label (exp1.value, NULL_TREE,
decl);
labels.safe_push (case_label);
if (! c_parser_require (parser, CPP_SEMICOLON,
"expected %<;%>"))
return;
}
else if (! c_parser_require (parser, CPP_NAME,
"expected label"))
"expected label"))
return;
break;
}
default:
c_parser_error (parser, "expected case label or goto statement");
else if (! c_parser_require (parser, CPP_SEMICOLON,
"expected %<:%>"))
return;
}
break;
}
case RID_DEFAULT:
{
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_COLON))
{
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME))
{
label = c_parser_peek_token (parser)->value;
c_parser_consume_token (parser);
tree decl = lookup_label_for_goto (loc, label);
default_label = build_case_label (NULL_TREE, NULL_TREE,
decl);
if (! c_parser_require (parser, CPP_SEMICOLON,
"expected %<;%>"))
return;
}
else if (! c_parser_require (parser, CPP_NAME,
"expected label"))
return;
}
else if (! c_parser_require (parser, CPP_SEMICOLON,
"expected %<:%>"))
return;
break;
}
case RID_GOTO:
{
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME))
{
c_parser_gimple_goto_stmt (loc,
c_parser_peek_token
(parser)->value,
&switch_body);
c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_SEMICOLON))
c_parser_consume_token (parser);
else
{
c_parser_error (parser, "expected semicolon");
return;
}
}
else if (! c_parser_require (parser, CPP_NAME,
"expected label"))
return;
break;
}
default:
c_parser_error (parser, "expected case label or goto statement");
return;
}
}
if (! c_parser_require (parser, CPP_CLOSE_BRACE, "expected %<}%>"))
return;