From dc95eae28e68b82ad923e11f17b0f5da7c41d8b1 Mon Sep 17 00:00:00 2001 From: jsm28 <jsm28@138bc75d-0d04-0410-961f-82ee72b054a4> Date: Mon, 5 Jun 2006 00:51:45 +0000 Subject: [PATCH] PR c/25161 PR c/27020 * c-decl.c (grokdeclarator): Disallow variably modified types at file scope. Avoid marking shared array type of constant size as VLA. testsuite: * gcc.dg/array-10.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114378 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/c-decl.c | 21 ++++++++++++++++++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/array-10.c | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/array-10.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 80f588d15beb..8f4c296bb56d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-06-05 Joseph S. Myers <joseph@codesourcery.com> + + PR c/25161 + PR c/27020 + * c-decl.c (grokdeclarator): Disallow variably modified types at + file scope. Avoid marking shared array type of constant size as + VLA. + 2006-06-04 Volker Reichelt <reichelt@igpm.rwth-aachen.de> PR c++/27601 diff --git a/gcc/c-decl.c b/gcc/c-decl.c index ddf068a74f30..22b6dabcffa8 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -3936,6 +3936,14 @@ grokdeclarator (const struct c_declarator *declarator, if (declspecs->deprecated_p && deprecated_state != DEPRECATED_SUPPRESS) warn_deprecated_use (declspecs->type); + if ((decl_context == NORMAL || decl_context == FIELD) + && current_scope == file_scope + && variably_modified_type_p (type, NULL_TREE)) + { + error ("variably modified %qs at file scope", name); + type = integer_type_node; + } + typedef_type = type; size_varies = C_TYPE_VARIABLE_SIZE (type); @@ -4206,6 +4214,12 @@ grokdeclarator (const struct c_declarator *declarator, size = integer_one_node; } } + else if ((decl_context == NORMAL || decl_context == FIELD) + && current_scope == file_scope) + { + error ("variably modified %qs at file scope", name); + size = integer_one_node; + } else { /* Make sure the array size remains visibly @@ -4304,7 +4318,12 @@ grokdeclarator (const struct c_declarator *declarator, if (type != error_mark_node) { if (size_varies) - C_TYPE_VARIABLE_SIZE (type) = 1; + { + if (size && TREE_CODE (size) == INTEGER_CST) + type + = build_distinct_type_copy (TYPE_MAIN_VARIANT (type)); + C_TYPE_VARIABLE_SIZE (type) = 1; + } /* The GCC extension for zero-length arrays differs from ISO flexible array members in that sizeof yields diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 46095299fff2..07c75be3173e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-06-05 Joseph S. Myers <joseph@codesourcery.com> + + PR c/25161 + PR c/27020 + * gcc.dg/array-10.c: New test. + 2006-06-05 Volker Reichelt <reichelt@igpm.rwth-aachen.de> PR c++/27804 diff --git a/gcc/testsuite/gcc.dg/array-10.c b/gcc/testsuite/gcc.dg/array-10.c new file mode 100644 index 000000000000..aab1538d5e16 --- /dev/null +++ b/gcc/testsuite/gcc.dg/array-10.c @@ -0,0 +1,33 @@ +/* Test invalid array sizes at file scope: should not cause ICEs. + Bugs 25161 and 27020. */ +/* Origin: Joseph Myers <joseph@codesourcery.com> */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +int a; + +int b0[a]; /* { dg-error "at file scope" } */ +int (*b1)[a]; /* { dg-error "at file scope" } */ +int (*b2())[a]; /* { dg-error "at file scope" } */ +struct b3 { int x[a]; }; /* { dg-error "at file scope" } */ +struct b4 { int (*x)[a]; }; /* { dg-error "at file scope" } */ +typeof (int [a]) b5; /* { dg-error "at file scope|outside of any function" } */ + +int c0[(__SIZE_TYPE__)&a]; /* { dg-error "at file scope" } */ +int (*c1)[(__SIZE_TYPE__)&a]; /* { dg-error "at file scope" } */ +int (*c2())[(__SIZE_TYPE__)&a]; /* { dg-error "at file scope" } */ +struct c3 { int x[(__SIZE_TYPE__)&a]; }; /* { dg-error "at file scope" } */ +struct c4 { int (*x)[(__SIZE_TYPE__)&a]; }; /* { dg-error "at file scope" } */ +typeof (int [(__SIZE_TYPE__)&a]) c5; /* { dg-error "at file scope" } */ + +int d0[1/0]; /* { dg-error "at file scope" } */ +/* { dg-warning "division by zero" "" { target *-*-* } 23 } */ +int (*d1)[1/0]; /* { dg-error "at file scope" } */ +/* { dg-warning "division by zero" "" { target *-*-* } 25 } */ +int (*d2())[1/0]; /* { dg-error "at file scope" } */ +/* { dg-warning "division by zero" "" { target *-*-* } 27 } */ +struct d3 { int x[1/0]; }; /* { dg-error "at file scope" } */ +/* { dg-warning "division by zero" "" { target *-*-* } 29 } */ +struct d4 { int (*x)[1/0]; }; /* { dg-error "at file scope" } */ +/* { dg-warning "division by zero" "" { target *-*-* } 31 } */ +typeof (int [1/0]) d5; /* { dg-error "at file scope" } */ -- GitLab