diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2004-02-14 11:29:01 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2004-02-14 11:29:01 +0000 |
commit | 28ba38e39f1fd80713c0c4bb2d5d9cd8b0d4ad0d (patch) | |
tree | 1f8bed12df7b3e50d11c112b02186ce940df7966 /gcc | |
parent | 32bb574bf52ca7e673a4eabf3ab37a50550316cb (diff) | |
download | gcc-28ba38e39f1fd80713c0c4bb2d5d9cd8b0d4ad0d.zip gcc-28ba38e39f1fd80713c0c4bb2d5d9cd8b0d4ad0d.tar.gz gcc-28ba38e39f1fd80713c0c4bb2d5d9cd8b0d4ad0d.tar.bz2 |
re PR c++/13635 (ICE in register_specialization for specific order of template specialization)
PR c++/13635
* pt.c (push_template_decl_real): Make sure DECL_TI_ARGS of DECL
has full set of arguments.
* g++.dg/template/spec11.C: New test.
From-SVN: r77796
Diffstat (limited to 'gcc')
-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;} |