pt.c (convert_nontype_argument_function): Add tsubst_flags_t parameter.
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 9 May 2014 19:30:03 +0000 (19:30 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 9 May 2014 19:30:03 +0000 (19:30 +0000)
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

gcc/cp/ChangeLog
gcc/cp/pt.c

index 228fe95..ea813a9 100644 (file)
@@ -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
index d30349c..bfae680 100644 (file)
@@ -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;
     }