Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > b5e52bbfb4bb11a6cbed452927fba979 > files > 84

gcc-4.1.2-50.el5.src.rpm

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