diff options
author | Jason Merrill <jason@redhat.com> | 2011-04-26 15:28:25 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-04-26 15:28:25 -0400 |
commit | 574cfaa47dbcc2e8d9ea68b83d8dc3122832ff9b (patch) | |
tree | e83e77854b5490319145c8e64a21bec89b47616f /gcc/cp/cvt.c | |
parent | 5a87ca71c875b5bc34b9b8bc0ef405cec9b51b51 (diff) | |
download | gcc-574cfaa47dbcc2e8d9ea68b83d8dc3122832ff9b.zip gcc-574cfaa47dbcc2e8d9ea68b83d8dc3122832ff9b.tar.gz gcc-574cfaa47dbcc2e8d9ea68b83d8dc3122832ff9b.tar.bz2 |
re PR c++/48530 ([C++0x][SFINAE] Hard errors with deleted d'tors)
PR c++/48530
* decl.c (cxx_maybe_build_cleanup): Add complain parm.
* tree.c (force_target_expr): Add complain parm.
(build_target_expr_with_type): Likewise.
(get_target_expr_sfinae): Split out.
(build_vec_init_expr, bot_manip): Adjust.
* init.c (build_vec_delete, build_vec_delete_1): Add complain parm.
(build_delete, build_dtor_call): Likewise.
(perform_direct_initialization_if_possible): Adjust.
(build_vec_init): Handle error return.
* cvt.c (force_rvalue): Add complain parm.
Call build_special_member_call directly.
* decl2.c (delete_sanity): Add complain parm.
(build_cleanup): Adjust.
* pt.c (tsubst_copy_and_build, tsubst_expr): Adjust.
* semantics.c (finish_stmt_expr_expr): Adjust.
(finish_compound_literal): Adjust.
* parser.c (cp_parser_delete_expression): Adjust.
* typeck2.c (build_functional_cast): Adjust.
* cp-tree.h: Adjust.
From-SVN: r172985
Diffstat (limited to 'gcc/cp/cvt.c')
-rw-r--r-- | gcc/cp/cvt.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/cp/cvt.c b/gcc/cp/cvt.c index de981bc..64fe871 100644 --- a/gcc/cp/cvt.c +++ b/gcc/cp/cvt.c @@ -531,11 +531,17 @@ convert_from_reference (tree val) argument of class type into a temporary. */ tree -force_rvalue (tree expr) +force_rvalue (tree expr, tsubst_flags_t complain) { - if (MAYBE_CLASS_TYPE_P (TREE_TYPE (expr)) && TREE_CODE (expr) != TARGET_EXPR) - expr = ocp_convert (TREE_TYPE (expr), expr, - CONV_IMPLICIT|CONV_FORCE_TEMP, LOOKUP_NORMAL); + tree type = TREE_TYPE (expr); + if (MAYBE_CLASS_TYPE_P (type) && TREE_CODE (expr) != TARGET_EXPR) + { + VEC(tree,gc) *args = make_tree_vector_single (expr); + expr = build_special_member_call (NULL_TREE, complete_ctor_identifier, + &args, type, LOOKUP_NORMAL, complain); + release_tree_vector (args); + expr = build_cplus_new (type, expr, complain); + } else expr = decay_conversion (expr); |