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:
parent
14b5207eb8
commit
63891ba2ec
4 changed files with 26 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
9
gcc/testsuite/g++.dg/rtti/dyncast5.C
Normal file
9
gcc/testsuite/g++.dg/rtti/dyncast5.C
Normal file
|
@ -0,0 +1,9 @@
|
|||
// PR c++/29273
|
||||
|
||||
struct A { virtual ~A () { } };
|
||||
struct B: A { } b [1];
|
||||
|
||||
void foo ()
|
||||
{
|
||||
dynamic_cast<B*>(b);
|
||||
}
|
Loading…
Add table
Reference in a new issue