Commit 4c923c28 by Joseph Myers Committed by Joseph Myers

re PR c/27893 (ICE with TREE_CONSTANT VLA sizes inside functions)

	PR c/27893
	* gimplify.c (gimplify_decl_expr, gimplify_init_ctor_preeval,
	omp_add_variable): Treat sizes as variable whenever not
	INTEGER_CST.

testsuite:
	* gcc.c-torture/compile/vla-const-1.c,
	gcc.c-torture/compile/vla-const-2.c: New tests.

From-SVN: r116450
parent 45988118
2006-08-25 Joseph S. Myers <joseph@codesourcery.com>
PR c/27893
* gimplify.c (gimplify_decl_expr, gimplify_init_ctor_preeval,
omp_add_variable): Treat sizes as variable whenever not
INTEGER_CST.
2006-08-26 Richard Guenther <rguenther@suse.de> 2006-08-26 Richard Guenther <rguenther@suse.de>
PR middle-end/28814 PR middle-end/28814
......
...@@ -528,8 +528,8 @@ pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t) ...@@ -528,8 +528,8 @@ pp_c_direct_abstract_declarator (c_pretty_printer *pp, tree t)
if (host_integerp (maxval, 0)) if (host_integerp (maxval, 0))
pp_wide_integer (pp, tree_low_cst (maxval, 0) + 1); pp_wide_integer (pp, tree_low_cst (maxval, 0) + 1);
else else
pp_expression (pp, fold_build2 (PLUS_EXPR, type, maxval, pp_expression (pp, fold (build2 (PLUS_EXPR, type, maxval,
build_int_cst (type, 1))); build_int_cst (type, 1))));
} }
pp_c_right_bracket (pp); pp_c_right_bracket (pp);
pp_direct_abstract_declarator (pp, TREE_TYPE (t)); pp_direct_abstract_declarator (pp, TREE_TYPE (t));
......
...@@ -1219,7 +1219,7 @@ gimplify_decl_expr (tree *stmt_p) ...@@ -1219,7 +1219,7 @@ gimplify_decl_expr (tree *stmt_p)
{ {
tree init = DECL_INITIAL (decl); tree init = DECL_INITIAL (decl);
if (!TREE_CONSTANT (DECL_SIZE (decl))) if (TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
{ {
/* This is a variable-sized decl. Simplify its size and mark it /* This is a variable-sized decl. Simplify its size and mark it
for deferred expansion. Note that mudflap depends on the format for deferred expansion. Note that mudflap depends on the format
...@@ -2696,7 +2696,7 @@ gimplify_init_ctor_preeval (tree *expr_p, tree *pre_p, tree *post_p, ...@@ -2696,7 +2696,7 @@ gimplify_init_ctor_preeval (tree *expr_p, tree *pre_p, tree *post_p,
/* If this is of variable size, we have no choice but to assume it doesn't /* If this is of variable size, we have no choice but to assume it doesn't
overlap since we can't make a temporary for it. */ overlap since we can't make a temporary for it. */
if (!TREE_CONSTANT (TYPE_SIZE (TREE_TYPE (*expr_p)))) if (TREE_CODE (TYPE_SIZE (TREE_TYPE (*expr_p))) != INTEGER_CST)
return; return;
/* Otherwise, we must search for overlap ... */ /* Otherwise, we must search for overlap ... */
...@@ -4384,7 +4384,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags) ...@@ -4384,7 +4384,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
/* When adding a variable-sized variable, we have to handle all sorts /* When adding a variable-sized variable, we have to handle all sorts
of additional bits of data: the pointer replacement variable, and of additional bits of data: the pointer replacement variable, and
the parameters of the type. */ the parameters of the type. */
if (DECL_SIZE (decl) && !TREE_CONSTANT (DECL_SIZE (decl))) if (DECL_SIZE (decl) && TREE_CODE (DECL_SIZE (decl)) != INTEGER_CST)
{ {
/* Add the pointer replacement variable as PRIVATE if the variable /* Add the pointer replacement variable as PRIVATE if the variable
replacement is private, else FIRSTPRIVATE since we'll need the replacement is private, else FIRSTPRIVATE since we'll need the
...@@ -4431,7 +4431,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags) ...@@ -4431,7 +4431,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tree decl, unsigned int flags)
if ((flags & GOVD_SHARED) == 0) if ((flags & GOVD_SHARED) == 0)
{ {
t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl))); t = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (decl)));
if (!TREE_CONSTANT (t)) if (TREE_CODE (t) != INTEGER_CST)
omp_notice_variable (ctx, t, true); omp_notice_variable (ctx, t, true);
} }
} }
......
2006-08-25 Joseph S. Myers <joseph@codesourcery.com>
PR c/27893
* gcc.c-torture/compile/vla-const-1.c,
gcc.c-torture/compile/vla-const-2.c: New tests.
2006-08-26 Richard Guenther <rguenther@suse.de> 2006-08-26 Richard Guenther <rguenther@suse.de>
PR middle-end/28814 PR middle-end/28814
/* Test TREE_CONSTANT VLA size: bug 27893. */
/* Origin: Joseph Myers <joseph@codesourcery.com> */
int a;
void g(void *);
void f(void) { int b[(__SIZE_TYPE__)&a]; g(b); }
/* Test TREE_CONSTANT VLA size: bug 27893. */
/* Origin: Joseph Myers <joseph@codesourcery.com> */
void g(void *);
void f(void) { int b[1/0]; g(b); }
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