aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-01-06 00:52:10 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-01-06 00:52:10 +0000
commit962c0823997cba18cca85efec200b19fac8e2c87 (patch)
treecb82f8866a29849465ec023e201d87c0798f6f2a
parent96f7369ac5bf732d61804b130a633ebd79fbf166 (diff)
downloadgcc-962c0823997cba18cca85efec200b19fac8e2c87.zip
gcc-962c0823997cba18cca85efec200b19fac8e2c87.tar.gz
gcc-962c0823997cba18cca85efec200b19fac8e2c87.tar.bz2
re PR c++/12815 (Code compiled with optimization behaves unexpectedly)
PR c++/12816 * class.c (build_vtbl_ref_1): Do not unconditionally mark vtable references as constant. PR c++/12815 * g++.dg/rtti/typeid4.C: New test. From-SVN: r75457
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/class.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/rtti/typeid4.C26
4 files changed, 36 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3a6a6ae..b428cee 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
2004-01-05 Mark Mitchell <mark@codesourcery.com>
+ PR c++/12816
+ * class.c (build_vtbl_ref_1): Do not unconditionally mark vtable
+ references as constant.
+
PR c++/12132
* parser.c (cp_parser_explicit_instantiation): Improve error
recovery.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 2928dd3..31c6d22 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -455,7 +455,7 @@ build_vtbl_ref_1 (tree instance, tree idx)
assemble_external (vtbl);
aref = build_array_ref (vtbl, idx);
- TREE_CONSTANT (aref) = 1;
+ TREE_CONSTANT (aref) |= TREE_CONSTANT (vtbl) && TREE_CONSTANT (idx);
return aref;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3741b3b..d9c5108 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-01-05 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/12815
+ * g++.dg/rtti/typeid4.C: New test.
+
2004-01-05 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/compat/sdata-section.h: Declare 'abort'.
diff --git a/gcc/testsuite/g++.dg/rtti/typeid4.C b/gcc/testsuite/g++.dg/rtti/typeid4.C
new file mode 100644
index 0000000..e6a1dce
--- /dev/null
+++ b/gcc/testsuite/g++.dg/rtti/typeid4.C
@@ -0,0 +1,26 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+#include <typeinfo>
+#include <iostream>
+
+struct A { virtual ~A () {} };
+
+struct APtr
+{
+ APtr (A* p) : p_ (p) { }
+ A& operator* () const { return *p_; }
+ A* p_;
+};
+
+int main ()
+{
+ APtr ap (new A);
+ std::type_info const* const exp = &typeid (*ap);
+ for (bool cont = true; cont; cont = false)
+ {
+ std::cout << "inner: cont " << cont << std::endl;
+ if (exp) ;
+ }
+}
+