OSDN Git Service

2005-03-16 Daniel Berlin <dberlin@dberlin.org>
authordberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Mar 2005 16:25:47 +0000 (16:25 +0000)
committerdberlin <dberlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Mar 2005 16:25:47 +0000 (16:25 +0000)
Fix PR tree-optimization/20489

* tree-ssa-alias.c (push_fields_onto_fieldstack): DTRT
for empty structures.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@96562 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr20489.C [new file with mode: 0644]
gcc/tree-ssa-alias.c

index bbb663e..0714aee 100644 (file)
@@ -1,4 +1,11 @@
 2005-03-16  Daniel Berlin  <dberlin@dberlin.org>
+       
+       Fix PR tree-optimization/20489
+
+       * tree-ssa-alias.c (push_fields_onto_fieldstack): DTRT
+       for empty structures.
+
+2005-03-16  Daniel Berlin  <dberlin@dberlin.org>
 
        Fix PR tree-optimization/20490
        
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr20489.C b/gcc/testsuite/g++.dg/tree-ssa/pr20489.C
new file mode 100644 (file)
index 0000000..0a1a569
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+struct A
+{
+       ~A();
+};
+
+/* If we don't create SFT's for the "empty" structure A, bad things
+   will happen, and we will fail verification.  */
+struct B
+{
+       int i;
+       A a;
+
+       void foo() {}
+};
+
+void bar()
+{
+       B().foo();
+}
index e38a8c2..315463f 100644 (file)
@@ -2729,8 +2729,21 @@ push_fields_onto_fieldstack (tree type, VEC(fieldoff_t) **fieldstack,
        continue;
       if (var_can_have_subvars (field))
        {
+         size_t before = VEC_length (fieldoff_t, *fieldstack);
          push_fields_onto_fieldstack (TREE_TYPE (field), fieldstack, 
                                       offset + bitpos_of_field (field));
+      /* Empty structures may have actual size, like in C++. So see if we
+        actually end up pushing a field, and if not, if the size is non-zero,
+        push the field onto the stack */
+         if (before == VEC_length (fieldoff_t, *fieldstack)
+             && DECL_SIZE (field)
+             && !integer_zerop (DECL_SIZE (field)))
+           {
+             pair = xmalloc (sizeof (struct fieldoff));
+             pair->field = field;
+             pair->offset = offset + bitpos_of_field (field);
+             VEC_safe_push (fieldoff_t, *fieldstack, pair);
+           }
        }
       else
        {