Commit 5c076987 by Joseph Myers Committed by Joseph Myers

re PR c/25161 (Internal compiler error (segfault) instead of error message)

	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.

From-SVN: r114378
parent 1ac8104c
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> 2006-06-04 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/27601 PR c++/27601
......
...@@ -3936,6 +3936,14 @@ grokdeclarator (const struct c_declarator *declarator, ...@@ -3936,6 +3936,14 @@ grokdeclarator (const struct c_declarator *declarator,
if (declspecs->deprecated_p && deprecated_state != DEPRECATED_SUPPRESS) if (declspecs->deprecated_p && deprecated_state != DEPRECATED_SUPPRESS)
warn_deprecated_use (declspecs->type); 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; typedef_type = type;
size_varies = C_TYPE_VARIABLE_SIZE (type); size_varies = C_TYPE_VARIABLE_SIZE (type);
...@@ -4206,6 +4214,12 @@ grokdeclarator (const struct c_declarator *declarator, ...@@ -4206,6 +4214,12 @@ grokdeclarator (const struct c_declarator *declarator,
size = integer_one_node; 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 else
{ {
/* Make sure the array size remains visibly /* Make sure the array size remains visibly
...@@ -4304,7 +4318,12 @@ grokdeclarator (const struct c_declarator *declarator, ...@@ -4304,7 +4318,12 @@ grokdeclarator (const struct c_declarator *declarator,
if (type != error_mark_node) if (type != error_mark_node)
{ {
if (size_varies) if (size_varies)
{
if (size && TREE_CODE (size) == INTEGER_CST)
type
= build_distinct_type_copy (TYPE_MAIN_VARIANT (type));
C_TYPE_VARIABLE_SIZE (type) = 1; C_TYPE_VARIABLE_SIZE (type) = 1;
}
/* The GCC extension for zero-length arrays differs from /* The GCC extension for zero-length arrays differs from
ISO flexible array members in that sizeof yields ISO flexible array members in that sizeof yields
......
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> 2006-06-05 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/27804 PR c++/27804
/* 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" } */
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