diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-01-06 00:52:10 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-01-06 00:52:10 +0000 |
commit | 962c0823997cba18cca85efec200b19fac8e2c87 (patch) | |
tree | cb82f8866a29849465ec023e201d87c0798f6f2a | |
parent | 96f7369ac5bf732d61804b130a633ebd79fbf166 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/class.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/rtti/typeid4.C | 26 |
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) ; + } +} + |