* pt.c (determine_specialization): Ignore functions without
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 13 Oct 2001 13:11:09 +0000 (13:11 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 13 Oct 2001 13:11:09 +0000 (13:11 +0000)
DECL_TEMPLATE_INFO.

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

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/template/spec1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/spec2.C [new file with mode: 0644]

index 50af839..58e1f98 100644 (file)
@@ -1,3 +1,8 @@
+2001-10-12  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       * pt.c (determine_specialization): Ignore functions without
+       DECL_TEMPLATE_INFO.
+
 2001-10-12  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR g++/4476
index e29a738..229bccc 100644 (file)
@@ -1040,6 +1040,12 @@ determine_specialization (template_id, decl, targs_out,
             Here, S<int>::f is a non-template, but S<int> is a
             template class.  If FN has the same type as DECL, we
             might be in business.  */
+
+         if (!DECL_TEMPLATE_INFO (fn))
+           /* Its enclosing class is an explicit specialization
+              of a template class.  This is not a candidate.  */
+           continue;
+
          if (!same_type_p (TREE_TYPE (TREE_TYPE (decl)),
                            TREE_TYPE (TREE_TYPE (fn))))
            /* The return types differ.  */
diff --git a/gcc/testsuite/g++.dg/template/spec1.C b/gcc/testsuite/g++.dg/template/spec1.C
new file mode 100644 (file)
index 0000000..2799637
--- /dev/null
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+// Origin: <schmid@snake.iap.physik.tu-darmstadt.de>
+
+// Bug: ICE during invalid instantiation of member function
+// which enclosing class is specialized.
+
+template <class T>
+struct A
+{
+    void f(T) {}
+};
+
+template<>
+struct A<int>
+{
+    void f(int) {}
+};
+
+template
+void A<int>::f(int);           // { dg-error "not match" }
diff --git a/gcc/testsuite/g++.dg/template/spec2.C b/gcc/testsuite/g++.dg/template/spec2.C
new file mode 100644 (file)
index 0000000..de0fe4c
--- /dev/null
@@ -0,0 +1,22 @@
+// { dg-do compile }
+
+// Origin: <schmid@snake.iap.physik.tu-darmstadt.de>
+
+// Bug: Overloading of ordinary and template member function
+// which enclosing class is specialized is not handled correctly.
+
+template <class T>
+struct A
+{
+    void f(T) {}
+};
+
+template<>
+struct A<int>
+{
+    void f(int) {}
+    template <class T> void f(T) {}
+};
+
+template
+void A<int>::f(int);