2007-12-11 Jakub Jelinek 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. --- gcc/cp/rtti.c (revision 130769) +++ gcc/cp/rtti.c (revision 130770) @@ -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)); --- gcc/testsuite/g++.dg/rtti/dyncast2.C (revision 0) +++ gcc/testsuite/g++.dg/rtti/dyncast2.C (revision 130770) @@ -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; +}