diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2001-10-13 13:11:09 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2001-10-13 13:11:09 +0000 |
commit | f5d47abdf7cebc497d2ee475dfc2e00e8125e879 (patch) | |
tree | 439d6c2f1c1c4b29089040da0d1474c529c38ba5 | |
parent | 45701819ced83ee12c0b3a1aecf47a30815517a5 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/pt.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec1.C | 21 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec2.C | 22 |
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); |