aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2001-10-13 13:11:09 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2001-10-13 13:11:09 +0000
commitf5d47abdf7cebc497d2ee475dfc2e00e8125e879 (patch)
tree439d6c2f1c1c4b29089040da0d1474c529c38ba5
parent45701819ced83ee12c0b3a1aecf47a30815517a5 (diff)
downloadgcc-f5d47abdf7cebc497d2ee475dfc2e00e8125e879.zip
gcc-f5d47abdf7cebc497d2ee475dfc2e00e8125e879.tar.gz
gcc-f5d47abdf7cebc497d2ee475dfc2e00e8125e879.tar.bz2
pt.c (determine_specialization): Ignore functions without DECL_TEMPLATE_INFO.
* pt.c (determine_specialization): Ignore functions without DECL_TEMPLATE_INFO. From-SVN: r46243
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c6
-rw-r--r--gcc/testsuite/g++.dg/template/spec1.C21
-rw-r--r--gcc/testsuite/g++.dg/template/spec2.C22
4 files changed, 54 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 50af839..58e1f98 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index e29a738..229bccc 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -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
index 0000000..2799637
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/spec1.C
@@ -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
index 0000000..de0fe4c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/spec2.C
@@ -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);