re PR tree-optimization/43066 (ICE: SIGFPE with empty struct and va_arg)
authorMartin Jambor <mjambor@suse.cz>
Thu, 18 Feb 2010 14:53:05 +0000 (15:53 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Thu, 18 Feb 2010 14:53:05 +0000 (15:53 +0100)
2010-02-18  Martin Jambor  <mjambor@suse.cz>

PR tree-optimization/43066
* tree-sra.c (build_ref_for_offset_1): Return false on encountering an
array with zero-sized element type.

* testsuite/gcc.c-torture/compile/pr43066.c: New test.

From-SVN: r156863

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr43066.c [new file with mode: 0644]
gcc/tree-sra.c

index bb696ae..fc1135d 100644 (file)
@@ -1,3 +1,9 @@
+2010-02-18  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/43066
+       * tree-sra.c (build_ref_for_offset_1): Return false on encountering an
+       array with zero-sized element type.
+
 2010-02-18  Jakub Jelinek  <jakub@redhat.com>
 
        * dwarf2out.c (add_var_loc_to_decl): Change last argument to
index 95f460c..9c82d35 100644 (file)
@@ -1,3 +1,8 @@
+2010-02-18  Martin Jambor  <mjambor@suse.cz>
+
+       PR tree-optimization/43066
+       * gcc.c-torture/compile/pr43066.c: New test.
+
 2010-02-18  Uros Bizjak  <ubizjak@gmail.com>
 
        * g++.dg/ext/attrib35.C: Fix target selector string.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr43066.c b/gcc/testsuite/gcc.c-torture/compile/pr43066.c
new file mode 100644 (file)
index 0000000..2ded912
--- /dev/null
@@ -0,0 +1,14 @@
+struct S {
+  struct { } empty[1];
+  int i;
+};
+
+int foo(int i, ...)
+{
+  struct S s;
+  __builtin_va_list va;
+  __builtin_va_start(va, i);
+  s = __builtin_va_arg(va, struct S);
+  __builtin_va_end(va);
+  return s.i;
+}
index 12b365f..86620e0 100644 (file)
@@ -1432,7 +1432,7 @@ build_ref_for_offset_1 (tree *res, tree type, HOST_WIDE_INT offset,
          el_size = tree_low_cst (tr_size, 1);
 
          minidx = TYPE_MIN_VALUE (TYPE_DOMAIN (type));
-         if (TREE_CODE (minidx) != INTEGER_CST)
+         if (TREE_CODE (minidx) != INTEGER_CST || el_size == 0)
            return false;
          if (res)
            {