Commit 1ca939e5 by Mark Mitchell Committed by Mark Mitchell

re PR c++/17936 (Declaration of specialization rejected)

	PR c++/17936
	* cp-tree.h (CLASSTYPE_TEMPLATE_SPECIALIZATION): Add a comment.
	* pt.c (optimize_specialization_lookup_p): Do not optimize lookups
	for members of partial or explicit specializations.

	PR c++/17936
	* g++.dg/template/spec18.C: New test.

From-SVN: r88905
parent f713f229
2004-10-11 Mark Mitchell <mark@codesourcery.com> 2004-10-11 Mark Mitchell <mark@codesourcery.com>
PR c++/17936
* cp-tree.h (CLASSTYPE_TEMPLATE_SPECIALIZATION): Add a comment.
* pt.c (optimize_specialization_lookup_p): Do not optimize lookups
for members of partial or explicit specializations.
PR c++/17929 PR c++/17929
* decl2.c (finish_anon_union): Robustify. * decl2.c (finish_anon_union): Robustify.
......
...@@ -2713,6 +2713,9 @@ struct lang_decl GTY(()) ...@@ -2713,6 +2713,9 @@ struct lang_decl GTY(())
#define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2) #define DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) == 2)
#define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2) #define SET_DECL_TEMPLATE_SPECIALIZATION(NODE) (DECL_USE_TEMPLATE (NODE) = 2)
/* Returns true for an explicit or partial specialization of a class
template. */
#define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \ #define CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
(CLASSTYPE_USE_TEMPLATE (NODE) == 2) (CLASSTYPE_USE_TEMPLATE (NODE) == 2)
#define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \ #define SET_CLASSTYPE_TEMPLATE_SPECIALIZATION(NODE) \
......
...@@ -774,6 +774,12 @@ optimize_specialization_lookup_p (tree tmpl) ...@@ -774,6 +774,12 @@ optimize_specialization_lookup_p (tree tmpl)
/* DECL_CLASS_SCOPE_P holds of T::f even if T is a template /* DECL_CLASS_SCOPE_P holds of T::f even if T is a template
parameter. */ parameter. */
&& CLASS_TYPE_P (DECL_CONTEXT (tmpl)) && CLASS_TYPE_P (DECL_CONTEXT (tmpl))
/* The optimized lookup depends on the fact that the
template arguments for the member function template apply
purely to the containing class, which is not true if the
containing class is an explicit or partial
specialization. */
&& !CLASSTYPE_TEMPLATE_SPECIALIZATION (DECL_CONTEXT (tmpl))
&& !DECL_MEMBER_TEMPLATE_P (tmpl) && !DECL_MEMBER_TEMPLATE_P (tmpl)
&& !DECL_CONV_FN_P (tmpl) && !DECL_CONV_FN_P (tmpl)
/* It is possible to have a template that is not a member /* It is possible to have a template that is not a member
......
2004-10-11 Mark Mitchell <mark@codesourcery.com>
PR c++/17936
* g++.dg/template/spec18.C: New test.
2004-10-11 Steve Ellcey <sje@cup.hp.com> 2004-10-11 Steve Ellcey <sje@cup.hp.com>
* testsuite/gcc.dg/ia64-asm-1.c: Add prototype for abort * testsuite/gcc.dg/ia64-asm-1.c: Add prototype for abort
......
// PR c++/17936
template<int, int N> struct A
{
void foo();
};
template<int N> struct A<1, N>
{
void foo();
};
template<> void A<1, 2>::foo();
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