From f18ea1bfdbb4f130ed5ba2a7df5b42c9b101001c Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 17 May 2010 15:54:05 -0400 Subject: [PATCH] call.c (struct z_candidate): Add explicit_targs field. * call.c (struct z_candidate): Add explicit_targs field. (add_template_candidate_real): Set it. (build_over_call): Use it to control init-list warning. From-SVN: r159510 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/call.c | 7 ++++++- gcc/testsuite/ChangeLog | 2 -- gcc/testsuite/g++.dg/cpp0x/initlist34.C | 2 ++ 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6a7a8244158..f6515f7d3f7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2010-05-17 Jason Merrill + * call.c (struct z_candidate): Add explicit_targs field. + (add_template_candidate_real): Set it. + (build_over_call): Use it to control init-list warning. + PR c++/44157 * call.c (build_over_call): Limit init-list deduction warning to cases where the argument is actually an init-list. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 46779facc55..97a196b60da 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -447,6 +447,7 @@ struct z_candidate { indicated by the CONVERSION_PATH. */ tree conversion_path; tree template_decl; + tree explicit_targs; candidate_warning *warnings; z_candidate *next; }; @@ -2573,6 +2574,7 @@ add_template_candidate_real (struct z_candidate **candidates, tree tmpl, cand->template_decl = build_template_info (tmpl, targs); else cand->template_decl = DECL_TEMPLATE_INFO (fn); + cand->explicit_targs = explicit_targs; return cand; fail: @@ -5692,7 +5694,10 @@ build_over_call (struct z_candidate *cand, int flags, tsubst_flags_t complain) pattype = PACK_EXPANSION_PATTERN (pattype); pattype = non_reference (pattype); - if (!is_std_init_list (pattype)) + if (TREE_CODE (pattype) == TEMPLATE_TYPE_PARM + && (cand->explicit_targs == NULL_TREE + || (TREE_VEC_LENGTH (cand->explicit_targs) + <= TEMPLATE_TYPE_IDX (pattype)))) { pedwarn (input_location, 0, "deducing %qT as %qT", non_reference (TREE_TYPE (patparm)), diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aff8d1c6b14..dfd3823e67c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,8 +3,6 @@ PR c++/44157 * g++.dg/cpp0x/initlist34.C: New. -2010-05-17 Jason Merrill - PR c++/44158 * g++.dg/cpp0x/rv-trivial-bug.C: Test copy-init too. diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist34.C b/gcc/testsuite/g++.dg/cpp0x/initlist34.C index 45cba5637eb..92f5a3a4605 100644 --- a/gcc/testsuite/g++.dg/cpp0x/initlist34.C +++ b/gcc/testsuite/g++.dg/cpp0x/initlist34.C @@ -9,4 +9,6 @@ void f(T) { } int main() { std::initializer_list a = { 0 }; f(a); + + f >({ 0 }); } -- 2.30.2