diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-12-11 09:20:15 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-12-11 09:20:15 +0100 |
commit | 61a861e6868242b07f7a06f5981681061093a69f (patch) | |
tree | 8446f81382b3ef280edb81d32c3e74a42c54cd4e | |
parent | 67689d1ad6e58969c455f31a997290732ac13842 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/rtti/dyncast2.C | 31 |
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; +} |