aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-12-11 09:20:15 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2007-12-11 09:20:15 +0100
commit61a861e6868242b07f7a06f5981681061093a69f (patch)
tree8446f81382b3ef280edb81d32c3e74a42c54cd4e
parent67689d1ad6e58969c455f31a997290732ac13842 (diff)
downloadgcc-61a861e6868242b07f7a06f5981681061093a69f.zip
gcc-61a861e6868242b07f7a06f5981681061093a69f.tar.gz
gcc-61a861e6868242b07f7a06f5981681061093a69f.tar.bz2
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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/rtti.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/rtti/dyncast2.C31
4 files changed, 43 insertions, 2 deletions
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 <jakub@redhat.com>
+
+ PR c++/34364
+ * rtti.c (build_dynamic_cast): Call convert_from_reference even for
+ dynamic_cast in a template.
+
2007-12-10 Simon Martin <simartin@users.sourceforge.net>
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 <jakub@redhat.com>
+
+ PR c++/34364
+ * g++.dg/rtti/dyncast2.C: New test.
+
2007-12-11 Uros Bizjak <ubizjak@gmail.com>
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 <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;
+}