diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2014-05-09 19:30:03 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2014-05-09 19:30:03 +0000 |
commit | ad31c32a963df2a9da09e10057a7f00899210e7c (patch) | |
tree | a32f63b8ec33e79956848270b16e71f3e90844b8 /gcc | |
parent | e7eee636b3eb402f434e8efa757b80c98d491e9b (diff) | |
download | gcc-ad31c32a963df2a9da09e10057a7f00899210e7c.zip gcc-ad31c32a963df2a9da09e10057a7f00899210e7c.tar.gz gcc-ad31c32a963df2a9da09e10057a7f00899210e7c.tar.bz2 |
pt.c (convert_nontype_argument_function): Add tsubst_flags_t parameter.
2014-05-09 Paolo Carlini <paolo.carlini@oracle.com>
* 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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/pt.c | 49 |
2 files changed, 38 insertions, 19 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 228fe95..ea813a9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2014-05-09 Paolo Carlini <paolo.carlini@oracle.com> + + * 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 <jason@redhat.com> DR 587 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index d30349c..bfae6806 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<deferred_access_check, va_gc> **, 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; } |