Commit 28ba38e3 by Kriang Lerdsuwanakij Committed by Kriang Lerdsuwanakij

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
parent 32bb574b
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> 2004-02-13 Giovanni Bajo <giovannibajo@gcc.gnu.org>
PR c++/13927 PR c++/13927
......
...@@ -1035,7 +1035,7 @@ register_specialization (tree spec, tree tmpl, tree args) ...@@ -1035,7 +1035,7 @@ register_specialization (tree spec, tree tmpl, tree args)
the default argument expression is not substituted for in an the default argument expression is not substituted for in an
instantiation unless and until it is actually needed. */ instantiation unless and until it is actually needed. */
return spec; return spec;
/* There should be as many levels of arguments as there are /* There should be as many levels of arguments as there are
levels of parameters. */ levels of parameters. */
my_friendly_assert (TMPL_ARGS_DEPTH (args) my_friendly_assert (TMPL_ARGS_DEPTH (args)
...@@ -3001,6 +3001,13 @@ push_template_decl_real (tree decl, int is_friend) ...@@ -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); info = tree_cons (tmpl, args, NULL_TREE);
if (DECL_IMPLICIT_TYPEDEF_P (decl)) if (DECL_IMPLICIT_TYPEDEF_P (decl))
......
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> 2004-02-13 Giovanni Bajo <giovannibajo@gcc.gnu.org>
PR c++/13927 PR c++/13927
......
// { 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;}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment