diff options
author | Volker Reichelt <reichelt@igpm.rwth-aachen.de> | 2006-04-19 17:15:54 +0000 |
---|---|---|
committer | Volker Reichelt <reichelt@gcc.gnu.org> | 2006-04-19 17:15:54 +0000 |
commit | d149fba0ff511eda85cb47a630ffc499ea5a8756 (patch) | |
tree | 4c87550ddc6151cf241615c6e60fff6799983f78 /gcc/cp | |
parent | 37e7dc121db68d87fb61996219088f0b94680455 (diff) | |
download | gcc-d149fba0ff511eda85cb47a630ffc499ea5a8756.zip gcc-d149fba0ff511eda85cb47a630ffc499ea5a8756.tar.gz gcc-d149fba0ff511eda85cb47a630ffc499ea5a8756.tar.bz2 |
re PR c++/10385 (Internal compiler error in build_up_reference, at cp/cvt.c:353, on invalid dynamic_cast)
PR c++/10385
* rtti.c (build_dynamic_cast_1): Check for invalid conversions
before calling convert_to_reference.
* cvt.c (convert_to_reference): Assert that reftype is a
REFERENCE_TYPE.
* g++.dg/conversion/dynamic1.C: New test.
From-SVN: r113084
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/cvt.c | 1 | ||||
-rw-r--r-- | gcc/cp/rtti.c | 6 |
3 files changed, 12 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2d80e52..27d31ba 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2006-04-19 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + + PR c++/10385 + * rtti.c (build_dynamic_cast_1): Check for invalid conversions + before calling convert_to_reference. + * cvt.c (convert_to_reference): Assert that reftype is a + REFERENCE_TYPE. + 2006-04-19 Mark Mitchell <mark@codesourcery.com> PR c++/27102 diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index c59c74c..902372e 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -460,6 +460,7 @@ convert_to_reference (tree reftype, tree expr, int convtype, intype = TREE_TYPE (expr); gcc_assert (TREE_CODE (intype) != REFERENCE_TYPE); + gcc_assert (TREE_CODE (reftype) == REFERENCE_TYPE); intype = TYPE_MAIN_VARIANT (intype); diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 0275ed9..5c6d38d 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -513,10 +513,7 @@ build_dynamic_cast_1 (tree type, tree expr) } else { - /* Apply trivial conversion T -> T& for dereferenced ptrs. */ exprtype = build_reference_type (exprtype); - expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT, - LOOKUP_NORMAL, NULL_TREE); /* T is a reference type, v shall be an lvalue of a complete class type, and the result is an lvalue of the type referred to by T. */ @@ -532,6 +529,9 @@ build_dynamic_cast_1 (tree type, tree expr) goto fail; } + /* Apply trivial conversion T -> T& for dereferenced ptrs. */ + expr = convert_to_reference (exprtype, expr, CONV_IMPLICIT, + LOOKUP_NORMAL, NULL_TREE); } /* The dynamic_cast operator shall not cast away constness. */ |