diff options
author | Mark Mitchell <mark@codesourcery.com> | 2003-02-24 07:43:23 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-02-24 07:43:23 +0000 |
commit | ca099ac8c57c9858373cf83befdfae7bab8e4a4e (patch) | |
tree | 85612b52e4377cb1291b4fccdef603a8f787b9cb /gcc/cp | |
parent | 463f02cd037fbf3af66cdbfff526fcb48d2ba746 (diff) | |
download | gcc-ca099ac8c57c9858373cf83befdfae7bab8e4a4e.zip gcc-ca099ac8c57c9858373cf83befdfae7bab8e4a4e.tar.gz gcc-ca099ac8c57c9858373cf83befdfae7bab8e4a4e.tar.bz2 |
re PR c++/5333 (ICE on nested template classes using other nested template classes)
PR c++/5333
* cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE): New macro.
* parser.c (cp_parser_diagnose_invalid_type_name): Use it.
* pt.c (instantiate_class_template): Don't try to instantiate
dependent types.
(resolve_typename_type): Use CLASSTYPE_PRIMARY_TEMPLATE.
PR c++/5333
* g++.dg/parse/fused-params1.C: Adjust error messages.
* g++.dg/template/nested3.C: New test.
From-SVN: r63354
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 8 |
4 files changed, 24 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 00be1dd..20e1f22 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2003-02-23 Mark Mitchell <mark@codesourcery.com> + + PR c++/5333 + * cp-tree.h (CLASSTYPE_PRIMARY_TEMPLATE): New macro. + * parser.c (cp_parser_diagnose_invalid_type_name): Use it. + * pt.c (instantiate_class_template): Don't try to instantiate + dependent types. + (resolve_typename_type): Use CLASSTYPE_PRIMARY_TEMPLATE. + 2003-02-21 Mark Mitchell <mark@codesourcery.com> PR c++/9749 diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index e463fb4..919e529 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -2316,6 +2316,12 @@ struct lang_decl GTY(()) #define ENUM_TI_ARGS(NODE) \ 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))))) + /* Like DECL_TI_TEMPLATE, but for an ENUMERAL_, RECORD_, or UNION_TYPE. */ #define TYPE_TI_TEMPLATE(NODE) \ (TI_TEMPLATE (TYPE_TEMPLATE_INFO (NODE))) diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 79ec8be..0688cdc 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -1954,10 +1954,7 @@ cp_parser_diagnose_invalid_type_name (cp_parser *parser) template (which will have an empty TYPE_FIELDs), to the main version. */ if (CLASSTYPE_USE_TEMPLATE (base_type)) - base_type = (TREE_TYPE - (DECL_TEMPLATE_RESULT - (DECL_PRIMARY_TEMPLATE - (CLASSTYPE_TI_TEMPLATE (base_type))))); + base_type = CLASSTYPE_PRIMARY_TEMPLATE_TYPE (base_type); for (field = TYPE_FIELDS (base_type); field; field = TREE_CHAIN (field)) @@ -4526,6 +4523,7 @@ cp_parser_unary_operator (cp_token* token) /* Parse a new-expression. + new-expression: :: [opt] new new-placement [opt] new-type-id new-initializer [opt] :: [opt] new new-placement [opt] ( type-id ) new-initializer [opt] diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index add427d..36ae04d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5151,7 +5151,9 @@ instantiate_class_template (type) if (type == error_mark_node) return error_mark_node; - if (TYPE_BEING_DEFINED (type) || COMPLETE_TYPE_P (type)) + if (TYPE_BEING_DEFINED (type) + || COMPLETE_TYPE_P (type) + || dependent_type_p (type)) return type; /* Figure out which template is being instantiated. */ @@ -11526,6 +11528,10 @@ resolve_typename_type (tree type, bool only_current_p) to look inside it. */ if (only_current_p && !currently_open_class (scope)) 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); /* 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. */ |