diff options
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/spec11.C | 20 |
4 files changed, 39 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 64018ad..9117cdf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-02-14 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/13635 + * pt.c (push_template_decl_real): Make sure DECL_TI_ARGS of DECL + has full set of arguments. + 2004-02-13 Giovanni Bajo <giovannibajo@gcc.gnu.org> PR c++/13927 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 085fdbd..779347b 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -1035,7 +1035,7 @@ register_specialization (tree spec, tree tmpl, tree args) the default argument expression is not substituted for in an instantiation unless and until it is actually needed. */ return spec; - + /* There should be as many levels of arguments as there are levels of parameters. */ my_friendly_assert (TMPL_ARGS_DEPTH (args) @@ -3001,6 +3001,13 @@ push_template_decl_real (tree decl, int is_friend) } } + /* The DECL_TI_ARGS of DECL contains full set of arguments refering + back to its most general template. If TMPL is a specialization, + ARGS may only have the innermost set of arguments. Add the missing + argument levels if necessary. */ + if (DECL_TEMPLATE_INFO (tmpl)) + args = add_outermost_template_args (DECL_TI_ARGS (tmpl), args); + info = tree_cons (tmpl, args, NULL_TREE); if (DECL_IMPLICIT_TYPEDEF_P (decl)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4b29491..e0ff48e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-02-14 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/13635 + * g++.dg/template/spec11.C: New test. + 2004-02-13 Giovanni Bajo <giovannibajo@gcc.gnu.org> PR c++/13927 diff --git a/gcc/testsuite/g++.dg/template/spec11.C b/gcc/testsuite/g++.dg/template/spec11.C new file mode 100644 index 0000000..36d93a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec11.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: jhbrown@bluefinrobotics.com + +// PR c++/13635: ICE explicit specialization of member function template + +template <class foo> +class bar { +public: + template <class baz> + int func(baz *x); +}; + +template <> +template <class baz> +int bar<double>::func(baz *x) { return 5;} + +template <> +template <> +int bar<double>::func(int *x) { return 5;} |