From: Paolo Carlini Date: Fri, 9 May 2014 19:30:03 +0000 (+0000) Subject: pt.c (convert_nontype_argument_function): Add tsubst_flags_t parameter. X-Git-Tag: releases/gcc-5.1.0~7662 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ad31c32a963df2a9da09e10057a7f00899210e7c;p=thirdparty%2Fgcc.git pt.c (convert_nontype_argument_function): Add tsubst_flags_t parameter. 2014-05-09 Paolo Carlini * pt.c (convert_nontype_argument_function): Add tsubst_flags_t parameter. (convert_nontype_argument): Adjust calls. (coerce_template_parameter_pack): Add missing complain & tf_error check. From-SVN: r210289 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 228fe959822f..ea813a98d2ea 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2014-05-09 Paolo Carlini + + * pt.c (convert_nontype_argument_function): Add tsubst_flags_t + parameter. + (convert_nontype_argument): Adjust calls. + (coerce_template_parameter_pack): Add missing complain & tf_error + check. + 2014-05-09 Jason Merrill DR 587 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d30349cd8575..bfae68062946 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -142,7 +142,7 @@ static int type_unification_real (tree, tree, tree, const tree *, vec **, bool); static void note_template_header (int); -static tree convert_nontype_argument_function (tree, tree); +static tree convert_nontype_argument_function (tree, tree, tsubst_flags_t); static tree convert_nontype_argument (tree, tree, tsubst_flags_t); static tree convert_template_argument (tree, tree, tree, tsubst_flags_t, int, tree); @@ -5272,7 +5272,8 @@ get_underlying_template (tree tmpl) and check that the resulting function has external linkage. */ static tree -convert_nontype_argument_function (tree type, tree expr) +convert_nontype_argument_function (tree type, tree expr, + tsubst_flags_t complain) { tree fns = expr; tree fn, fn_no_ptr; @@ -5298,25 +5299,34 @@ convert_nontype_argument_function (tree type, tree expr) if (TREE_CODE (fn_no_ptr) != FUNCTION_DECL) { - error ("%qE is not a valid template argument for type %qT", expr, type); - if (TYPE_PTR_P (type)) - error ("it must be the address of a function with external linkage"); - else - error ("it must be the name of a function with external linkage"); + if (complain & tf_error) + { + error ("%qE is not a valid template argument for type %qT", + expr, type); + if (TYPE_PTR_P (type)) + error ("it must be the address of a function with " + "external linkage"); + else + error ("it must be the name of a function with " + "external linkage"); + } return NULL_TREE; } linkage = decl_linkage (fn_no_ptr); if (cxx_dialect >= cxx11 ? linkage == lk_none : linkage != lk_external) { - if (cxx_dialect >= cxx11) - error ("%qE is not a valid template argument for type %qT " - "because %qD has no linkage", - expr, type, fn_no_ptr); - else - error ("%qE is not a valid template argument for type %qT " - "because %qD does not have external linkage", - expr, type, fn_no_ptr); + if (complain & tf_error) + { + if (cxx_dialect >= cxx11) + error ("%qE is not a valid template argument for type %qT " + "because %qD has no linkage", + expr, type, fn_no_ptr); + else + error ("%qE is not a valid template argument for type %qT " + "because %qD does not have external linkage", + expr, type, fn_no_ptr); + } return NULL_TREE; } @@ -5959,7 +5969,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) /* Null pointer values are OK in C++11. */ return perform_qualification_conversions (type, expr); - expr = convert_nontype_argument_function (type, expr); + expr = convert_nontype_argument_function (type, expr, complain); if (!expr || expr == error_mark_node) return expr; } @@ -5983,7 +5993,7 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain) return NULL_TREE; } - expr = convert_nontype_argument_function (type, expr); + expr = convert_nontype_argument_function (type, expr, complain); if (!expr || expr == error_mark_node) return expr; @@ -6696,8 +6706,9 @@ coerce_template_parameter_pack (tree parms, if (arg_idx - parm_idx < TREE_VEC_LENGTH (packed_args) && TREE_VEC_LENGTH (packed_args) > 0) { - error ("wrong number of template arguments (%d, should be %d)", - arg_idx - parm_idx, TREE_VEC_LENGTH (packed_args)); + if (complain & tf_error) + error ("wrong number of template arguments (%d, should be %d)", + arg_idx - parm_idx, TREE_VEC_LENGTH (packed_args)); return error_mark_node; }