From: mmitchel Date: Tue, 6 Jan 2004 00:52:10 +0000 (+0000) Subject: PR c++/12816 X-Git-Tag: upstream/4.9.2~74271 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d3c2a736c4152edd93d93d7f376ecc74b0115295;p=platform%2Fupstream%2Flinaro-gcc.git 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@75457 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 + 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 + + PR c++/12815 + * g++.dg/rtti/typeid4.C: New test. + 2004-01-05 Eric Botcazou * 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 +#include + +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) ; + } +} +