diff options
author | Jason Merrill <jason@redhat.com> | 2010-10-03 19:28:15 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2010-10-03 19:28:15 -0400 |
commit | 79fe346e8aac0fecd659ba7433107ea3e86a4cd6 (patch) | |
tree | 591b863df38402e3a26c6e201f36025b6da5f227 /gcc | |
parent | 82a1c2fe690f15bfa0b91b54a7f1746acad0a1ef (diff) | |
download | gcc-79fe346e8aac0fecd659ba7433107ea3e86a4cd6.zip gcc-79fe346e8aac0fecd659ba7433107ea3e86a4cd6.tar.gz gcc-79fe346e8aac0fecd659ba7433107ea3e86a4cd6.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/call.c | 2 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/sfinae5.C | 16 |
6 files changed, 45 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8c201d7..c5c40f8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2010-10-03 Jason Merrill <jason@redhat.com> + + * 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 <iains@gcc.gnu.org> merge from FSF 'apple/trunk' branch. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 2e7083d..e0911ac 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 aa1fe4d..6ce10e6 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 eff6704..b2b8e5f 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 3319f7a..269e4e0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-10-03 Jason Merrill <jason@redhat.com> + + * g++.dg/cpp0x/sfinae5.C: New. + 2010-10-02 H.J. Lu <hongjiu.lu@intel.com> 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 0000000..8474fb3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae5.C @@ -0,0 +1,16 @@ +// { dg-options -std=c++0x } + +template<class T> +T&& create(); + +template <class T, class U, + class = decltype(create<T>() = create<U>()) + > +char test(int); + +template <class, class> +double test(...); + +int main() { + test<int[], int[]>(0); // #1 +} |