OSDN Git Service

PR c++/23947
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Sep 2005 15:40:57 +0000 (15:40 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Sep 2005 15:40:57 +0000 (15:40 +0000)
* rtti.c (get_pseudo_ti_init): Recompute ti pointer after
get_tinfo_ptr calls.

* g++.dg/rtti/crash3.C: New test.

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

gcc/cp/ChangeLog
gcc/cp/rtti.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/rtti/crash3.C [new file with mode: 0644]

index 0680431..5bdf8bd 100644 (file)
@@ -1,3 +1,9 @@
+2005-09-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/23947
+       * rtti.c (get_pseudo_ti_init): Recompute ti pointer after
+       get_tinfo_ptr calls.
+
 2005-09-16  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/23914
index 6d60d4c..8a3582d 100644 (file)
@@ -1020,7 +1020,9 @@ get_pseudo_ti_init (tree type, unsigned tk_index)
        tree base_binfo = BINFO_BASE_BINFO (TYPE_BINFO (type), 0);
        tree tinfo = get_tinfo_ptr (BINFO_TYPE (base_binfo));
        tree base_inits = tree_cons (NULL_TREE, tinfo, NULL_TREE);
-       
+
+       /* get_tinfo_ptr might have reallocated the tinfo_descs vector.  */
+       ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
        return class_initializer (ti, type, base_inits);
       }
 
@@ -1079,6 +1081,9 @@ get_pseudo_ti_init (tree type, unsigned tk_index)
        base_inits = tree_cons (NULL_TREE,
                                build_int_cst (NULL_TREE, hint),
                                base_inits);
+
+       /* get_tinfo_ptr might have reallocated the tinfo_descs vector.  */
+       ti = VEC_index (tinfo_s, tinfo_descs, tk_index);
        return class_initializer (ti, type, base_inits);
       }
     }
index e456199..8dd65bb 100644 (file)
@@ -1,5 +1,8 @@
 2005-09-20  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/23947
+       * g++.dg/rtti/crash3.C: New test.
+
        PR tree-optimization/23818
        * gcc.dg/pr23818.c: New test.
 
diff --git a/gcc/testsuite/g++.dg/rtti/crash3.C b/gcc/testsuite/g++.dg/rtti/crash3.C
new file mode 100644 (file)
index 0000000..076e360
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/23947
+// { dg-do compile }
+
+class A {};
+class B {};
+class C : public A, public B {};
+class D : public C {};
+void f () throw (D)
+{
+}