cp-tree.h (lookup_template_class): Add complain parm.
authorNathan Sidwell <nathan@codesourcery.com>
Fri, 19 Jan 2001 09:24:20 +0000 (09:24 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Fri, 19 Jan 2001 09:24:20 +0000 (09:24 +0000)
cp:
* cp-tree.h (lookup_template_class): Add complain parm.
* decl.c (lookup_namespace_name): Adjust call to
lookup_template_class.
(make_typename_type): Likewise.
* semantics.c (finish_template_type): Likewise.
* pt.c (lookup_template_class): Add complain parm. Adjust.
(tsubst_aggr_type): Pass COMPLAIN down to lookup_template_class.
(tsubst): Likewise.
testsuite:
* g++.old-deja/g++.pt/deduct3.C: New test.

From-SVN: r39129

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/pt.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.pt/deduct3.C [new file with mode: 0644]

index 9a262f14840df3623ec44a9dcc02dd30839a66a0..69e74738ccaa9ef5c04a555f476c1e205a9d8696 100644 (file)
@@ -1,3 +1,14 @@
+2001-01-19  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * cp-tree.h (lookup_template_class): Add complain parm.
+       * decl.c (lookup_namespace_name): Adjust call to
+       lookup_template_class.
+       (make_typename_type): Likewise.
+       * semantics.c (finish_template_type): Likewise.
+       * pt.c (lookup_template_class): Add complain parm. Adjust.
+       (tsubst_aggr_type): Pass COMPLAIN down to lookup_template_class.
+       (tsubst): Likewise.
+
 2001-01-19  Nathan Sidwell  <nathan@codesourcery.com>
 
        * pt.c (copy_default_args_to_explicit_spec): Preserve
index eea27e0233f83e3998e943cc3c8299858a7b38e8..1df938b814dd5af7f3f265f5aaffa23a80773c79 100644 (file)
@@ -4135,7 +4135,7 @@ extern tree current_template_args         PARAMS ((void));
 extern tree push_template_decl                 PARAMS ((tree));
 extern tree push_template_decl_real             PARAMS ((tree, int));
 extern void redeclare_class_template            PARAMS ((tree, tree));
-extern tree lookup_template_class              PARAMS ((tree, tree, tree, tree, int));
+extern tree lookup_template_class              PARAMS ((tree, tree, tree, tree, int, int));
 extern tree lookup_template_function            PARAMS ((tree, tree));
 extern int uses_template_parms                 PARAMS ((tree));
 extern tree instantiate_class_template         PARAMS ((tree));
index e5fd61e73dca2e3b72d57534fbdfa97ca221dc9d..158407ccf3a76090c5303f856017ef5e0f1caefd 100644 (file)
@@ -5439,7 +5439,8 @@ lookup_namespace_name (namespace, name)
                                         TREE_OPERAND (template_id, 1),
                                         /*in_decl=*/NULL_TREE,
                                         /*context=*/NULL_TREE,
-                                        /*entering_scope=*/0);
+                                        /*entering_scope=*/0,
+                                        /*complain=*/1);
          else if (DECL_FUNCTION_TEMPLATE_P (val)
                   || TREE_CODE (val) == OVERLOAD)
            val = lookup_template_function (val,
@@ -5623,7 +5624,8 @@ make_typename_type (context, name, complain)
          return lookup_template_class (tmpl,
                                        TREE_OPERAND (fullname, 1),
                                        NULL_TREE, context,
-                                       /*entering_scope=*/0);
+                                       /*entering_scope=*/0,
+                                       /*complain=*/1);
        }
       else
        {
index 33c3f2688342f3a6a0abf6e74bb8996937bf002d..cf3b52d33e2304ddcaf588b21bf88ccfaa40268d 100644 (file)
@@ -3813,17 +3813,20 @@ maybe_get_template_decl_from_type_decl (decl)
 
    If ENTERING_SCOPE is non-zero, we are about to enter the scope of
    the class we are looking up.
+   
+   If COMPLAIN is non-zero, issue error messages.
 
    If the template class is really a local class in a template
    function, then the FUNCTION_CONTEXT is the function in which it is
    being instantiated.  */
 
 tree
-lookup_template_class (d1, arglist, in_decl, context, entering_scope)
+lookup_template_class (d1, arglist, in_decl, context, entering_scope, complain)
      tree d1, arglist;
      tree in_decl;
      tree context;
      int entering_scope;
+     int complain;
 {
   tree template = NULL_TREE, parmlist;
   tree t;
@@ -3881,15 +3884,19 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope)
      crash. Alternatively D1 might not be a template type at all.  */
   if (! template)
     {
-      cp_error ("`%T' is not a template", d1);
+      if (complain)
+        cp_error ("`%T' is not a template", d1);
       return error_mark_node;
     }
 
   if (TREE_CODE (template) != TEMPLATE_DECL)
     {
-      cp_error ("non-template type `%T' used as a template", d1);
-      if (in_decl)
-       cp_error_at ("for template declaration `%D'", in_decl);
+      if (complain)
+        {
+          cp_error ("non-template type `%T' used as a template", d1);
+          if (in_decl)
+           cp_error_at ("for template declaration `%D'", in_decl);
+       }
       return error_mark_node;
     }
 
@@ -3903,7 +3910,8 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope)
 
       parmlist = DECL_INNERMOST_TEMPLATE_PARMS (template);
 
-      arglist2 = coerce_template_parms (parmlist, arglist, template, 1, 1);
+      arglist2 = coerce_template_parms (parmlist, arglist, template,
+                                        complain, /*require_all_args=*/1);
       if (arglist2 == error_mark_node)
        return error_mark_node;
 
@@ -3971,7 +3979,8 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope)
               --i, t = TREE_CHAIN (t))
            {
              tree a = coerce_template_parms (TREE_VALUE (t),
-                                             arglist, template, 1, 1);
+                                             arglist, template,
+                                             complain, /*require_all_args=*/1);
              SET_TMPL_ARGS_LEVEL (bound_args, i, a);
 
              /* We temporarily reduce the length of the ARGLIST so
@@ -3990,7 +3999,8 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope)
        arglist
          = coerce_template_parms (INNERMOST_TEMPLATE_PARMS (parmlist),
                                   INNERMOST_TEMPLATE_ARGS (arglist),
-                                  template, 1, 1);
+                                  template,
+                                  complain, /*require_all_args=*/1);
 
       if (arglist == error_mark_node)
        /* We were unable to bind the arguments.  */
@@ -5466,7 +5476,7 @@ tsubst_aggr_type (t, args, complain, in_decl, entering_scope)
            return error_mark_node;
 
          r = lookup_template_class (t, argvec, in_decl, context,
-                                    entering_scope);
+                                    entering_scope, complain);
 
          return cp_build_qualified_type_real (r, TYPE_QUALS (t),
                                               complain);
@@ -6426,7 +6436,8 @@ tsubst (t, args, complain, in_decl)
                    r = lookup_template_class (arg, 
                                               argvec, in_decl, 
                                               DECL_CONTEXT (arg),
-                                              /*entering_scope=*/0);
+                                              /*entering_scope=*/0,
+                                              complain);
                    return cp_build_qualified_type_real (r, 
                                                         TYPE_QUALS (t),
                                                         complain);
index 0c4ed96e1e850c856987e1f7cde8bfc07cf37c9f..e52138ba7ee2bf2d2485f3b10ae7246fa322ffc8 100644 (file)
@@ -2032,7 +2032,8 @@ finish_template_type (name, args, entering_scope)
   tree decl;
 
   decl = lookup_template_class (name, args,
-                               NULL_TREE, NULL_TREE, entering_scope);
+                               NULL_TREE, NULL_TREE,
+                               entering_scope, /*complain=*/1);
   if (decl != error_mark_node)
     decl = TYPE_STUB_DECL (decl);
 
index 4ff21240b9833696748b5f91e2f14906f0603830..9c5b6169fa74d54401446e231ed9ab5c4db4c221 100644 (file)
@@ -1,3 +1,7 @@
+2001-01-19  Nathan Sidwell  <nathan@codesourcery.com>
+
+       * g++.old-deja/g++.pt/deduct3.C: New test.
+
 2001-01-19  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.old-deja/g++.pt/spec34.C: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/deduct3.C b/gcc/testsuite/g++.old-deja/g++.pt/deduct3.C
new file mode 100644 (file)
index 0000000..8b9b76e
--- /dev/null
@@ -0,0 +1,22 @@
+// Build don't link:
+
+// Copyright (C) 2000 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 18 Jan 2001 <nathan@codesourcery.com>
+
+// Bug 1694. We complained during deduction, rather than reject the deduction.
+
+template <class T, T d> class X {};
+
+template <class T> X<T,0> Foo (T *);
+template <class T> int Foo (T const *);
+
+void Baz (int *p1, int const *p2)
+{
+  int i = Foo (p1); // ERROR - cannot convert
+  int j = Foo (p2);
+}
+void Baz (float *p1, float const *p2)
+{
+  int i = Foo (p1); // ok, deduction fails on X<T,0> Foo (T *)
+  int j = Foo (p2);
+}