summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
c36bb20)
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182851
138bc75d-0d04-0410-961f-
82ee72b054a4
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
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
* decl.c (duplicate_decls): With -Wredundant-decls don't warn for
declaration followed by specialization.
PR c++/15867
* decl.c (duplicate_decls): With -Wredundant-decls don't warn for
declaration followed by specialization.
build_dynamic_cast_1 (tree type, tree expr, tsubst_flags_t complain)
{
enum tree_code tc = TREE_CODE (type);
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 dcast_fn;
tree old_expr = expr;
const char *errstr = NULL;
tree dcast_fn;
tree old_expr = expr;
const char *errstr = NULL;
if (tc == POINTER_TYPE)
{
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. */
/* 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. */
{
expr = mark_lvalue_use (expr);
{
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. */
/* 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. */
fail:
if (complain & tf_error)
error ("cannot dynamic_cast %qE (of type %q#T) to type %q#T (%s)",
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;
}
return error_mark_node;
}
+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
2012-01-03 Richard Guenther <rguenther@suse.de>
PR tree-optimization/51070
--- /dev/null
+// PR c++/29273
+
+struct A { virtual ~A () { } };
+struct B: A { } b [1];
+
+void foo ()
+{
+ dynamic_cast<B*>(b);
+}