From 61a861e6868242b07f7a06f5981681061093a69f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 11 Dec 2007 09:20:15 +0100 Subject: re PR c++/34364 (class& is not known as as a class-type anymore after dynamic_cast) PR c++/34364 * rtti.c (build_dynamic_cast): Call convert_from_reference even for dynamic_cast in a template. * g++.dg/rtti/dyncast2.C: New test. From-SVN: r130770 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/rtti.c | 3 +-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/rtti/dyncast2.C | 31 +++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/rtti/dyncast2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 294be3a..f55b06a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2007-12-11 Jakub Jelinek + + PR c++/34364 + * rtti.c (build_dynamic_cast): Call convert_from_reference even for + dynamic_cast in a template. + 2007-12-10 Simon Martin PR c++/34059 diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 92cddbf..6cac0ef 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -728,8 +728,7 @@ build_dynamic_cast (tree type, tree expr) { expr = build_min (DYNAMIC_CAST_EXPR, type, expr); TREE_SIDE_EFFECTS (expr) = 1; - - return expr; + return convert_from_reference (expr); } return convert_from_reference (build_dynamic_cast_1 (type, expr)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 33e5663..663a059 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-12-11 Jakub Jelinek + + PR c++/34364 + * g++.dg/rtti/dyncast2.C: New test. + 2007-12-11 Uros Bizjak PR tree-optimization/34407 diff --git a/gcc/testsuite/g++.dg/rtti/dyncast2.C b/gcc/testsuite/g++.dg/rtti/dyncast2.C new file mode 100644 index 0000000..2e4f615 --- /dev/null +++ b/gcc/testsuite/g++.dg/rtti/dyncast2.C @@ -0,0 +1,31 @@ +// PR c++/34364 +// { dg-do run } + +struct A +{ + virtual ~A () {} +}; + +struct B : public A +{ + template struct C + { + static void f (A &a) + { + dynamic_cast (a).g (); + } + }; + + B () : c (6) {} + void g () { c++; } + int c; +}; + +B b; + +int +main (void) +{ + B::C::f (b); + return b.c != 7; +} -- cgit v1.1