]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR other/42611 (ICE in tree_low_cst, at tree.c:5014)
authorJakub Jelinek <jakub@redhat.com>
Tue, 5 Jan 2010 08:42:53 +0000 (09:42 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 5 Jan 2010 08:42:53 +0000 (09:42 +0100)
PR other/42611
* cfgexpand.c (expand_one_var): Diagnose too large variables.

* gcc.dg/pr42611.c: New test.

From-SVN: r155641

gcc/ChangeLog
gcc/cfgexpand.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr42611.c [new file with mode: 0644]

index b45e59c549793b15e0b2265ece528d338b5e12f3..89398d7eaf3e33bf1778390cd1fbb36cde715956 100644 (file)
@@ -1,5 +1,8 @@
 2010-01-05  Jakub Jelinek  <jakub@redhat.com>
 
+       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.
index b0921bfe8e96ab9bf69adfca9c7a2a3b480a82de..7e542da3320eae90136fb2156267910088c94795 100644 (file)
@@ -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
index 89358798c846f124e231a7e7bc5fe0fd9ac461ec..aea6aa18026c60c99daaee6525b67c93390fb75d 100644 (file)
@@ -1,5 +1,8 @@
 2010-01-05  Jakub Jelinek  <jakub@redhat.com>
 
+       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 (file)
index 0000000..c33e248
--- /dev/null
@@ -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));
+}