re PR c++/29273 (error on dynamic_cast<T>(array))

/cp
2012-01-03  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/29273
	* rtti.c (build_dynamic_cast_1): In case of T a pointer type,
	call decay_conversion on v.

/testsuite
2012-01-03  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/29273
	* g++.dg/rtti/dyncast5.C: New.

From-SVN: r182851
This commit is contained in:
Paolo Carlini 2012-01-03 15:29:42 +00:00 committed by Paolo Carlini
parent 14b5207eb8
commit 63891ba2ec
4 changed files with 26 additions and 3 deletions

View file

@ -1,3 +1,9 @@
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/29273
* rtti.c (build_dynamic_cast_1): In case of T a pointer type,
call decay_conversion on v.
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/15867

View file

@ -515,7 +515,7 @@ static tree
build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
{
enum tree_code tc = TREE_CODE (type);
tree exprtype = TREE_TYPE (expr);
tree exprtype;
tree dcast_fn;
tree old_expr = expr;
const char *errstr = NULL;
@ -551,6 +551,9 @@ build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
if (tc == POINTER_TYPE)
{
expr = decay_conversion (expr);
exprtype = TREE_TYPE (expr);
/* If T is a pointer type, v shall be an rvalue of a pointer to
complete class type, and the result is an rvalue of type T. */
@ -576,7 +579,7 @@ build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
{
expr = mark_lvalue_use (expr);
exprtype = build_reference_type (exprtype);
exprtype = build_reference_type (TREE_TYPE (expr));
/* 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. */
@ -764,7 +767,7 @@ build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
fail:
if (complain & tf_error)
error ("cannot dynamic_cast %qE (of type %q#T) to type %q#T (%s)",
expr, exprtype, type, errstr);
old_expr, TREE_TYPE (old_expr), type, errstr);
return error_mark_node;
}

View file

@ -1,3 +1,8 @@
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/29273
* g++.dg/rtti/dyncast5.C: New.
2012-01-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51070

View file

@ -0,0 +1,9 @@
// PR c++/29273
struct A { virtual ~A () { } };
struct B: A { } b [1];
void foo ()
{
dynamic_cast<B*>(b);
}