From: Jason Merrill Date: Sun, 3 Oct 2010 23:28:15 +0000 (-0400) Subject: typeck.c (require_complete_type_sfinae): Add complain parm to... X-Git-Tag: releases/gcc-4.6.0~3931 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=79fe346e8aac0fecd659ba7433107ea3e86a4cd6;p=thirdparty%2Fgcc.git typeck.c (require_complete_type_sfinae): Add complain parm to... * typeck.c (require_complete_type_sfinae): Add complain parm to... (require_complete_type): ...this function. (cp_build_array_ref, convert_arguments): Use it. (convert_for_initialization, cp_build_modify_expr): Likewise. * cp-tree.h: Declare it. * call.c (build_over_call): Use it. From-SVN: r164918 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8c201d743ed0..c5c40f8bee02 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2010-10-03 Jason Merrill + + * typeck.c (require_complete_type_sfinae): Add complain parm to... + (require_complete_type): ...this function. + (cp_build_array_ref, convert_arguments): Use it. + (convert_for_initialization, cp_build_modify_expr): Likewise. + * cp-tree.h: Declare it. + * call.c (build_over_call): Use it. + 2010-09-30 Iain Sandoe merge from FSF 'apple/trunk' branch. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 2e7083d45fd0..e0911ac45d3d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -5655,7 +5655,7 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) if (TREE_THIS_VOLATILE (fn) && cfun) current_function_returns_abnormally = 1; if (!VOID_TYPE_P (return_type)) - require_complete_type (return_type); + require_complete_type_sfinae (return_type, complain); return convert_from_reference (expr); } diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index aa1fe4d11ff0..6ce10e6af2ca 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5432,6 +5432,7 @@ extern int string_conv_p (const_tree, const_tree, int); extern tree cp_truthvalue_conversion (tree); extern tree condition_conversion (tree); extern tree require_complete_type (tree); +extern tree require_complete_type_sfinae (tree, tsubst_flags_t); extern tree complete_type (tree); extern tree complete_type_or_else (tree, tree); extern tree complete_type_or_maybe_complain (tree, tree, tsubst_flags_t); diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index eff670419f54..b2b8e5f5f78a 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -64,11 +64,11 @@ static int convert_arguments (tree, VEC(tree,gc) **, tree, int, /* Do `exp = require_complete_type (exp);' to make sure exp does not have an incomplete type. (That includes void types.) - Returns the error_mark_node if the VALUE does not have + Returns error_mark_node if the VALUE does not have complete type when this function returns. */ tree -require_complete_type (tree value) +require_complete_type_sfinae (tree value, tsubst_flags_t complain) { tree type; @@ -87,12 +87,18 @@ require_complete_type (tree value) if (COMPLETE_TYPE_P (type)) return value; - if (complete_type_or_else (type, value)) + if (complete_type_or_maybe_complain (type, value, complain)) return value; else return error_mark_node; } +tree +require_complete_type (tree value) +{ + return require_complete_type_sfinae (value, tf_warning_or_error); +} + /* Try to complete TYPE, if it is incomplete. For example, if TYPE is a template instantiation, do the instantiation. Returns TYPE, whether or not it could be completed, unless something goes @@ -3039,7 +3045,8 @@ cp_build_array_ref (location_t loc, tree array, tree idx, |= (CP_TYPE_VOLATILE_P (type) | TREE_SIDE_EFFECTS (array)); TREE_THIS_VOLATILE (rval) |= (CP_TYPE_VOLATILE_P (type) | TREE_THIS_VOLATILE (array)); - ret = require_complete_type (fold_if_not_in_template (rval)); + ret = require_complete_type_sfinae (fold_if_not_in_template (rval), + complain); protected_set_expr_location (ret, loc); return ret; } @@ -3542,7 +3549,7 @@ convert_arguments (tree typelist, VEC(tree,gc) **values, tree fndecl, /* Don't do ellipsis conversion for __built_in_constant_p as this will result in spurious errors for non-trivial types. */ - val = require_complete_type (val); + val = require_complete_type_sfinae (val, complain); else val = convert_arg_to_ellipsis (val); @@ -6744,7 +6751,7 @@ cp_build_modify_expr (tree lhs, enum tree_code modifycode, tree rhs, } else { - lhs = require_complete_type (lhs); + lhs = require_complete_type_sfinae (lhs, complain); if (lhs == error_mark_node) return error_mark_node; @@ -7592,7 +7599,7 @@ convert_for_initialization (tree exp, tree type, tree rhs, int flags, } if (exp != 0) - exp = require_complete_type (exp); + exp = require_complete_type_sfinae (exp, complain); if (exp == error_mark_node) return error_mark_node; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3319f7adcdec..269e4e000cc7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-10-03 Jason Merrill + + * g++.dg/cpp0x/sfinae5.C: New. + 2010-10-02 H.J. Lu PR tree-optimization/45720 diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae5.C b/gcc/testsuite/g++.dg/cpp0x/sfinae5.C new file mode 100644 index 000000000000..8474fb314312 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae5.C @@ -0,0 +1,16 @@ +// { dg-options -std=c++0x } + +template +T&& create(); + +template () = create()) + > +char test(int); + +template +double test(...); + +int main() { + test(0); // #1 +}