+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>
PR sanitizer/84307
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
keep_next_level (void)
{
c_parser_consume_token (parser);
brace_loc = c_parser_peek_token (parser)->location;
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 "
"only inside a function");
extern bool c_parser_error (c_parser *parser);
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
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>
PR tree-optimization/85597
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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" } */
--- /dev/null
+/* 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;
+}