diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index dff7c4f667df..e793ab108933 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2003-02-24 Mark Mitchell + + 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 PR c++/9778 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 919e5291f1ab..8e44bbb9efc9 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2317,10 +2317,12 @@ struct lang_decl GTY(()) TI_ARGS (ENUM_TEMPLATE_INFO (NODE)) /* For a template instantiation TYPE, returns the TYPE corresponding - to the primary template. */ -#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \ - TREE_TYPE (DECL_TEMPLATE_RESULT (DECL_PRIMARY_TEMPLATE \ - (CLASSTYPE_TI_TEMPLATE ((TYPE))))) + to the primary template. Otherwise returns TYPE itself. */ +#define CLASSTYPE_PRIMARY_TEMPLATE_TYPE(TYPE) \ + ((CLASSTYPE_USE_TEMPLATE ((TYPE)) && !CLASSTYPE_TEMPLATE_SPECIALIZATION ((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. */ #define TYPE_TI_TEMPLATE(NODE) \ diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 0688cdcc86cb..17b7224cb6e1 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1953,8 +1953,7 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser) /* Go from a particular instantiation of the template (which will have an empty TYPE_FIELDs), 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); field; field = TREE_CHAIN (field)) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 053a96707798..a5425f34b4ab 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11530,8 +11530,7 @@ resolve_typename_type (tree type, bool only_current_p) return error_mark_node; /* If SCOPE is a partial instantiation, it will not have a valid 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 were in the class definition. In particular, SCOPE will no longer be considered a dependent type. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3f847eff9352..b88756febc79 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-02-24 Mark Mitchell + + PR c++/9836 + * g++.dg/template/spec6.C: New test. + 2003-02-24 Jeff Law * gcc.c-torture/compile/20030224-1.c: New test for ia32 backend bug. diff --git a/gcc/testsuite/g++.dg/template/spec6.C b/gcc/testsuite/g++.dg/template/spec6.C new file mode 100644 index 000000000000..915b83312521 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/spec6.C @@ -0,0 +1,10 @@ +template struct X {}; + +template struct X { + typedef double* type; + type foo () const; +}; + +template +typename X::type +X::foo () const {}