re PR c++/9836 (Error with typdefs in partial specializations of classes)

PR c++/9836
	* cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE): Do not skip from
	specializations back to the main template.
	* parser.c (cp_parser_diagnose_invalid_type_name):Adjust use.
	* pt.c (resolve_typename_type): Likewise.

	PR c++/9836
	* g++.dg/template/spec6.C: New test.

From-SVN: r63383
This commit is contained in:
Mark Mitchell 2003-02-24 21:52:00 +00:00 committed by Mark Mitchell
parent 2afced1191
commit 353b4fc0d7
6 changed files with 31 additions and 8 deletions

View File

@ -1,3 +1,11 @@
2003-02-24 Mark Mitchell <mark@codesourcery.com>
PR c++/9836
* cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE): Do not skip from
specializations back to the main template.
* parser.c (cp_parser_diagnose_invalid_type_name):Adjust use.
* pt.c (resolve_typename_type): Likewise.
2003-02-24 Jeffrey D. Oldham <oldham@codesourcery.com> 2003-02-24 Jeffrey D. Oldham <oldham@codesourcery.com>
PR c++/9778 PR c++/9778

View File

@ -2317,10 +2317,12 @@ struct lang_decl GTY(())
TI_ARGS (ENUM_TEMPLATE_INFO (NODE)) TI_ARGS (ENUM_TEMPLATE_INFO (NODE))
/* For a template instantiation TYPE, returns the TYPE corresponding /* For a template instantiation TYPE, returns the TYPE corresponding
to the primary template. */ to the primary template. Otherwise returns TYPE itself. */
#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \ #define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \
TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \ ((CLASSTYPE_USE_TEMPLATE ((TYPE)) && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((TYPE))) \
(CLASSTYPE_TI_TEMPLATE ((TYPE))))) ? TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \
(CLASSTYPE_TI_TEMPLATE ((TYPE))))) \
: (TYPE))
/* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */ /* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */
#define TYPE_TI_TEMPLATE(NODE) \ #define TYPE_TI_TEMPLATE(NODE) \

View File

@ -1953,8 +1953,7 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser)
/* Go from a particular instantiation of the /* Go from a particular instantiation of the
template (which will have an empty TYPE_FIELDs), template (which will have an empty TYPE_FIELDs),
to the main version. */ to the main version. */
if (CLASSTYPE_USE_TEMPLATE (base_type)) base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type);
for (field = TYPE_FIELDS (base_type); for (field = TYPE_FIELDS (base_type);
field; field;
field = TREE_CHAIN (field)) field = TREE_CHAIN (field))

View File

@ -11530,8 +11530,7 @@ resolve_typename_type (tree type, bool only_current_p)
return error_mark_node; return error_mark_node;
/* If SCOPE is a partial instantiation, it will not have a valid /* If SCOPE is a partial instantiation, it will not have a valid
TYPE_FIELDS list, so use the original template. */ TYPE_FIELDS list, so use the original template. */
if (CLASSTYPE_USE_TEMPLATE (scope)) scope = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope);
scope = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (scope);
/* Enter the SCOPE so that name lookup will be resolved as if we /* Enter the SCOPE so that name lookup will be resolved as if we
were in the class definition. In particular, SCOPE will no were in the class definition. In particular, SCOPE will no
longer be considered a dependent type. */ longer be considered a dependent type. */

View File

@ -1,3 +1,8 @@
2003-02-24 Mark Mitchell <mark@codesourcery.com>
PR c++/9836
* g++.dg/template/spec6.C: New test.
2003-02-24 Jeff Law <law@redhat.com> 2003-02-24 Jeff Law <law@redhat.com>
* gcc.c-torture/compile/20030224-1.c: New test for ia32 backend bug. * gcc.c-torture/compile/20030224-1.c: New test for ia32 backend bug.

View File

@ -0,0 +1,10 @@
template <bool, int> struct X {};
template <bool C> struct X<C,1> {
typedef double* type;
type foo () const;
};
template <bool C>
typename X<C,1>::type
X<C,1>::foo () const {}