From: Jakub Jelinek Date: Tue, 11 Dec 2007 08:20:15 +0000 (+0100) Subject: re PR c++/34364 (class& is not known as as a class-type anymore after dynamic_cast) X-Git-Tag: releases/gcc-4.3.0~1103 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61a861e6868242b07f7a06f5981681061093a69f;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 294be3a089d1..f55b06a45833 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 92cddbfb37f2..6cac0efc1f85 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 33e566377a3e..663a059da018 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 000000000000..2e4f61596961 --- /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; +}