From 7604eb4e07613c79a9b81da29baabdac8187f461 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 5 Jan 2010 09:42:53 +0100 Subject: [PATCH] re PR other/42611 (ICE in tree_low_cst, at tree.c:5014) PR other/42611 * cfgexpand.c (expand_one_var): Diagnose too large variables. * gcc.dg/pr42611.c: New test. From-SVN: r155641 --- gcc/ChangeLog | 3 +++ gcc/cfgexpand.c | 10 +++++++++- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/pr42611.c | 19 +++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr42611.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b45e59c5497..89398d7eaf3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2010-01-05 Jakub Jelinek + PR other/42611 + * cfgexpand.c (expand_one_var): Diagnose too large variables. + PR tree-optimization/42508 * tree-sra.c (convert_callers): Check for recursive call by comparing cgraph nodes instead of decls. diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index b0921bfe8e9..7e542da3320 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -1,5 +1,5 @@ /* A pass for lowering trees to RTL. - Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 + Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GCC. @@ -1011,6 +1011,14 @@ expand_one_var (tree var, bool toplevel, bool really_expand) if (really_expand) expand_one_register_var (origvar); } + else if (!host_integerp (DECL_SIZE_UNIT (var), 1)) + { + if (really_expand) + { + error ("size of variable %q+D is too large", var); + expand_one_error_var (var); + } + } else if (defer_stack_allocation (var, toplevel)) add_stack_var (origvar); else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 89358798c84..aea6aa18026 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2010-01-05 Jakub Jelinek + PR other/42611 + * gcc.dg/pr42611.c: New test. + PR tree-optimization/42508 * g++.dg/opt/pr42508.C: New test. diff --git a/gcc/testsuite/gcc.dg/pr42611.c b/gcc/testsuite/gcc.dg/pr42611.c new file mode 100644 index 00000000000..c33e248caf5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr42611.c @@ -0,0 +1,19 @@ +/* PR other/42611 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +#define L \ + (sizeof (__SIZE_TYPE__) == 1 ? __SCHAR_MAX__ \ + : sizeof (__SIZE_TYPE__) == sizeof (short) ? __SHRT_MAX__ \ + : sizeof (__SIZE_TYPE__) == sizeof (int) ? __INT_MAX__ \ + : sizeof (__SIZE_TYPE__) == sizeof (long) ? __LONG_MAX__ \ + : sizeof (__SIZE_TYPE__) == sizeof (long long) ? __LONG_LONG_MAX__ \ + : __INTMAX_MAX__) +struct S { int a; char b[L]; }; + +void +foo (void) +{ + struct S s; /* { dg-error "is too large" } */ + asm volatile ("" : : "r" (&s)); +}