55 lines
1.0 KiB
Diff
55 lines
1.0 KiB
Diff
2007-12-11 Jakub Jelinek <jakub@redhat.com>
|
|
|
|
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 <typename T> struct C
|
|
+ {
|
|
+ static void f (A &a)
|
|
+ {
|
|
+ dynamic_cast <B &>(a).g ();
|
|
+ }
|
|
+ };
|
|
+
|
|
+ B () : c (6) {}
|
|
+ void g () { c++; }
|
|
+ int c;
|
|
+};
|
|
+
|
|
+B b;
|
|
+
|
|
+int
|
|
+main (void)
|
|
+{
|
|
+ B::C<int>::f (b);
|
|
+ return b.c != 7;
|
|
+}
|