aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2014-05-09 19:30:03 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2014-05-09 19:30:03 +0000
commitad31c32a963df2a9da09e10057a7f00899210e7c (patch)
treea32f63b8ec33e79956848270b16e71f3e90844b8 /gcc
parente7eee636b3eb402f434e8efa757b80c98d491e9b (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/cp/pt.c49
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;
}