Commit f7584c81 by David Pagan Committed by Jeff Law

re PR c/30552 (gcc crashes when compiling examples with GNU statement…

re PR c/30552 (gcc crashes when compiling examples with GNU statement expressions in VLAs (also involved: nested functions declared K&R-style))

	PR c/30552
	* c-decl.c (old_style_parameter_scope): New function.
	* c-parser.c (c_parser_postfix_expression): Check for statement
	expressions in old-style function parameter list declarations.
	* c-parser.h (old_style_parameter_scope): New extern declaration.

	PR c/30552
	* gcc.dg/noncompile/pr30552-1.c: New test.
	* gcc.dg/noncompile/pr30552-2.c: New test.
	* gcc.dg/noncompile/pr30552-3.c: New test.
	* gcc.dg/noncompile/pr30552-4.c: New test.

From-SVN: r259849
parent 621af561
2018-05-02 David Pagan <dave.pagan@oracle.com>
PR c/30552
* c-decl.c (old_style_parameter_scope): New function.
* c-parser.c (c_parser_postfix_expression): Check for statement
expressions in old-style function parameter list declarations.
* c-parser.h (old_style_parameter_scope): New extern declaration.
2018-04-25 Jakub Jelinek <jakub@redhat.com> 2018-04-25 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/84307 PR sanitizer/84307
......
...@@ -952,6 +952,17 @@ global_bindings_p (void) ...@@ -952,6 +952,17 @@ global_bindings_p (void)
return current_scope == file_scope; return current_scope == file_scope;
} }
/* Return true if we're declaring parameters in an old-style function
declaration. */
bool
old_style_parameter_scope (void)
{
/* If processing parameters and there is no function statement list, we
* have an old-style function declaration. */
return (current_scope->parm_flag && !DECL_SAVED_TREE (current_function_decl));
}
void void
keep_next_level (void) keep_next_level (void)
{ {
......
...@@ -7930,7 +7930,10 @@ c_parser_postfix_expression (c_parser *parser) ...@@ -7930,7 +7930,10 @@ c_parser_postfix_expression (c_parser *parser)
c_parser_consume_token (parser); c_parser_consume_token (parser);
brace_loc = c_parser_peek_token (parser)->location; brace_loc = c_parser_peek_token (parser)->location;
c_parser_consume_token (parser); c_parser_consume_token (parser);
if (!building_stmt_list_p ()) /* If we've not yet started the current function's statement list,
or we're in the parameter scope of an old-style function
declaration, statement expressions are not allowed. */
if (!building_stmt_list_p () || old_style_parameter_scope ())
{ {
error_at (loc, "braced-group within expression allowed " error_at (loc, "braced-group within expression allowed "
"only inside a function"); "only inside a function");
......
...@@ -155,6 +155,9 @@ extern c_token * c_parser_tokens_buf (c_parser *parser, unsigned n); ...@@ -155,6 +155,9 @@ extern c_token * c_parser_tokens_buf (c_parser *parser, unsigned n);
extern bool c_parser_error (c_parser *parser); extern bool c_parser_error (c_parser *parser);
extern void c_parser_set_error (c_parser *parser, bool); extern void c_parser_set_error (c_parser *parser, bool);
/* A bit of a hack to have this here. It would be better in a c-decl.h. */
extern bool old_style_parameter_scope (void);
/* Return true if the next token from PARSER has the indicated /* Return true if the next token from PARSER has the indicated
TYPE. */ TYPE. */
......
2018-05-02 David Pagan <dave.pagan@oracle.com>
PR c/30552
* gcc.dg/noncompile/pr30552-1.c: New test.
* gcc.dg/noncompile/pr30552-2.c: New test.
* gcc.dg/noncompile/pr30552-3.c: New test.
* gcc.dg/noncompile/pr30552-4.c: New test.
2018-05-02 Richard Biener <rguenther@suse.de> 2018-05-02 Richard Biener <rguenther@suse.de>
PR tree-optimization/85597 PR tree-optimization/85597
......
/* PR c/30552 */
/* Statement expression as formal array argument size in nested old-style
function declaration should generate user error, not internal compiler
error. */
/* { dg-do compile } */
/* { dg-options "" } */
int main()
{
void fun(int a) /* { dg-error "old-style parameter declarations in prototyped function definition" } */
int a[({void h(){}2;})]; /* { dg-error "braced-group within expression allowed only inside a function" } */
{
}
return 0;
}
/* PR c/30552 */
/* Another example of a statement expression as formal array argument size in
* nested old-style function declaration should generate user error, not
* internal compiler error. */
/* { dg-do compile } */
/* { dg-options "" } */
int main()
{
void fun(a)
int a[({int b=2; b;})]; /* { dg-error "braced-group within expression allowed only inside a function" } */
{
}
return 0;
}
/* PR c/30552 */
/* Related example where statement expression used as old-style formal array
* argument size in an invalid nested function declaration should generate
* user error, not internal compiler error. */
/* { dg-do compile } */
/* { dg-options "" } */
int main()
{
int g()
int a[( {int b} )]; /* { dg-error "braced-group within expression allowed only inside a function|declaration for parameter" } */
return 0; /* { dg-error "expected declaration specifiers before" } */
} /* { dg-error "expected declaration specifiers before|end of input|expected declaration or statement at end of input" } */
/* PR c/30552 */
/* Statement expression as formal array argument size in nested function
* prototype scope is valid. */
/* { dg-do compile } */
/* { dg-options "" } */
int main()
{
void fun(int a[({void h(){}10;})])
{
}
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment