mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-25 04:29:16 +08:00
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:
parent
2afced1191
commit
353b4fc0d7
@ -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>
|
||||
|
||||
PR c++/9778
|
||||
|
@ -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) \
|
||||
|
@ -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))
|
||||
|
@ -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. */
|
||||
|
@ -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>
|
||||
|
||||
* gcc.c-torture/compile/20030224-1.c: New test for ia32 backend bug.
|
||||
|
10
gcc/testsuite/g++.dg/template/spec6.C
Normal file
10
gcc/testsuite/g++.dg/template/spec6.C
Normal 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 {}
|
Loading…
Reference in New Issue
Block a user