diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2012-09-11 01:05:12 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-09-11 01:05:12 +0000 |
commit | e2e030322038fa1b9bad7c567a09c8835dfd5183 (patch) | |
tree | 96b82d9148fffb25980f7664eaf3ee1f5a19ccee /gcc/cp/call.c | |
parent | f0bdc1d25c3b5619856efbb0ae260a7e6550df9e (diff) | |
download | gcc-e2e030322038fa1b9bad7c567a09c8835dfd5183.zip gcc-e2e030322038fa1b9bad7c567a09c8835dfd5183.tar.gz gcc-e2e030322038fa1b9bad7c567a09c8835dfd5183.tar.bz2 |
re PR c++/54541 (SFINAE bug: handling incomplete return types)
/cp
2012-09-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/54541
PR c++/54542
* call.c (build_cxx_call): Add tsubst_flags_t parameter, use
require_complete_type_sfinae.
(build_op_delete_call, build_over_call): Adjust.
* typeck.c (build_x_compound_expr_from_vec): Add tsubst_flags_t
parameter.
(cp_build_function_call_vec): Adjust.
* init.c (build_new_1): Likewise.
* rtti.c (throw_bad_cast, throw_bad_typeid, build_dynamic_cast_1):
Likewise.
* optimize.c (build_delete_destructor_body): Likewise.
* cp-tree.h: Adjust declarations.
* call.c (convert_arg_to_ellipsis): Use require_complete_type_sfinae.
/testsuite
2012-09-10 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/54541
PR c++/54542
* g++.dg/cpp0x/sfinae40.C: New.
* g++.dg/cpp0x/sfinae41.C: Likewise.
From-SVN: r191170
Diffstat (limited to 'gcc/cp/call.c')
-rw-r--r-- | gcc/cp/call.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 159be6b..6f7e346 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5525,7 +5525,7 @@ build_op_delete_call (enum tree_code code, tree addr, tree size, for (i = 1; i < nargs; i++) argarray[i] = CALL_EXPR_ARG (placement, i); mark_used (fn); - return build_cxx_call (fn, nargs, argarray); + return build_cxx_call (fn, nargs, argarray, complain); } else { @@ -6127,12 +6127,12 @@ convert_arg_to_ellipsis (tree arg, tsubst_flags_t complain) arg = cp_perform_integral_promotions (arg, complain); } - arg = require_complete_type (arg); + arg = require_complete_type_sfinae (arg, complain); arg_type = TREE_TYPE (arg); if (arg != error_mark_node /* In a template (or ill-formed code), we can have an incomplete type - even after require_complete_type, in which case we don't know + even after require_complete_type_sfinae, in which case we don't know whether it has trivial copy or not. */ && COMPLETE_TYPE_P (arg_type)) { @@ -6882,7 +6882,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) return error_mark_node; } - return build_cxx_call (fn, nargs, argarray); + return build_cxx_call (fn, nargs, argarray, complain); } /* Build and return a call to FN, using NARGS arguments in ARGARRAY. @@ -6890,7 +6890,8 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) high-level operations. */ tree -build_cxx_call (tree fn, int nargs, tree *argarray) +build_cxx_call (tree fn, int nargs, tree *argarray, + tsubst_flags_t complain) { tree fndecl; int optimize_sav; @@ -6923,12 +6924,12 @@ build_cxx_call (tree fn, int nargs, tree *argarray) if (VOID_TYPE_P (TREE_TYPE (fn))) return fn; - fn = require_complete_type (fn); + fn = require_complete_type_sfinae (fn, complain); if (fn == error_mark_node) return error_mark_node; if (MAYBE_CLASS_TYPE_P (TREE_TYPE (fn))) - fn = build_cplus_new (TREE_TYPE (fn), fn, tf_warning_or_error); + fn = build_cplus_new (TREE_TYPE (fn), fn, complain); return convert_from_reference (fn); } |