OSDN Git Service

* pt.c (fn_type_unification): Allow incomplete unification without
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Mar 1998 12:17:01 +0000 (12:17 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 30 Mar 1998 12:17:01 +0000 (12:17 +0000)
an immediate error message.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@18912 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.old-deja/g++.pt/unify2.C [new file with mode: 0644]

index f7d586f..7fdc60b 100644 (file)
@@ -1,3 +1,8 @@
+Mon Mar 30 12:15:00 1998  Mark Mitchell  <mmitchell@usa.net>
+
+       * pt.c (fn_type_unification): Allow incomplete unification without 
+       an immediate error message.
+
 Mon Mar 30 08:55:42 1998  Jason Merrill  <jason@yorick.cygnus.com>
 
        * tree.c (member_p): New fn.
index 4f87928..779d06c 100644 (file)
@@ -5325,12 +5325,16 @@ fn_type_unification (fn, explicit_targs, targs, args, return_type,
     fn_arg_types = scratch_tree_cons (NULL_TREE, extra_fn_arg,
                                      fn_arg_types); 
 
+  /* We allow incomplete unification without an error message here
+     because the standard doesn't seem to explicitly prohibit it.  Our
+     callers must be ready to deal with unification failures in any
+     event.  */
   i = type_unification (DECL_INNERMOST_TEMPLATE_PARMS (fn), 
                        targs,
                        fn_arg_types,
                        decl_arg_types,
                        explicit_targs,
-                       strict, 0);
+                       strict, 1);
 
   return i;
 }
diff --git a/gcc/testsuite/g++.old-deja/g++.pt/unify2.C b/gcc/testsuite/g++.old-deja/g++.pt/unify2.C
new file mode 100644 (file)
index 0000000..89b043d
--- /dev/null
@@ -0,0 +1,27 @@
+// Build don't link:
+
+template <class T>
+struct S
+{
+  typedef T S_Type;
+};
+
+
+template <class T>
+void foo(typename S<T>::S_Type)
+{
+}
+
+
+template <class T>
+void foo(T)
+{
+}
+
+
+struct S2 {};
+
+void bar()
+{
+  foo(S2()); // We can't unify with the first foo, so we get the second.
+}