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
This commit is contained in:
Mark Mitchell 2004-01-06 00:52:10 +00:00 committed by Mark Mitchell
parent 96f7369ac5
commit 962c082399
4 changed files with 36 additions and 1 deletions

View File

@ -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.

View File

@ -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;
}

View File

@ -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'.

View File

@ -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) ;
}
}