From ffc76561784fdb1f6607af45bd37aee531e193df Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Sun, 10 Aug 2003 14:59:58 +0000 Subject: [PATCH] re PR c++/11670 (ICE in convert_like_real on illegal code) cp: PR c++/11670 * call.c (convert_like_real): Add rvalue binding error message. * error.c (dump_expr) : Detect when the no expr is really a cast. testsuite: PR c++/11670 * g++.dg/expr/cast2.C: New test. From-SVN: r70294 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/call.c | 2 +- gcc/cp/error.c | 24 +++++++++++++++++++++--- gcc/testsuite/ChangeLog | 3 +++ 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4db8e19ede8..c4a59498cad 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2003-08-10 Nathan Sidwell + PR c++/11670 + * call.c (convert_like_real): Add rvalue binding error message. + * error.c (dump_expr) : Detect when the no expr is + really a cast. + PR c++/10530 * pt.c (dependent_type_p_r): A dependent template-id is a class type with dependent template arguments, or a bound template diff --git a/gcc/cp/call.c b/gcc/cp/call.c index e77aaee8442..73c8c44ea79 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4133,7 +4133,7 @@ convert_like_real (tree convs, tree expr, tree fn, int argnum, int inner, error ("cannot bind packed field `%E' to `%T'", expr, ref_type); else - my_friendly_assert (0, 20030715); + error ("cannot bind rvalue `%E' to `%T'", expr, ref_type); return error_mark_node; } expr = build_target_expr_with_type (expr, type); diff --git a/gcc/cp/error.c b/gcc/cp/error.c index cb317033658..3531f94ec8a 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1682,9 +1682,27 @@ dump_expr (tree t, int flags) break; case NOP_EXPR: - dump_expr (TREE_OPERAND (t, 0), flags); - break; - + { + tree op = TREE_OPERAND (t, 0); + + if (!same_type_p (TREE_TYPE (op), TREE_TYPE (t))) + { + /* It is a cast, but we cannot tell whether it is a + reinterpret or static cast. Use the C style notation. */ + if (flags & TFF_EXPR_IN_PARENS) + pp_left_paren (cxx_pp); + pp_left_paren (cxx_pp); + dump_type (TREE_TYPE (t), flags); + pp_right_paren (cxx_pp); + dump_expr (op, flags | TFF_EXPR_IN_PARENS); + if (flags & TFF_EXPR_IN_PARENS) + pp_right_paren (cxx_pp); + } + else + dump_expr (op, flags); + break; + } + case EXPR_WITH_FILE_LOCATION: dump_expr (EXPR_WFL_NODE (t), flags); break; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 34e5185272b..efdfe31f3a2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2003-08-10 Nathan Sidwell + PR c++/11670 + * g++.dg/expr/cast2.C: New test. + PR c++/10530 * g++.dg/template/dependent-name2.C: New test. -- 2.30.2