aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/call.c
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2012-09-11 01:05:12 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2012-09-11 01:05:12 +0000
commite2e030322038fa1b9bad7c567a09c8835dfd5183 (patch)
tree96b82d9148fffb25980f7664eaf3ee1f5a19ccee /gcc/cp/call.c
parentf0bdc1d25c3b5619856efbb0ae260a7e6550df9e (diff)
downloadgcc-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.c15
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);
}