From 486e40770d3273c7ab557c879ba39917dbd26cf0 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 14 Oct 1998 20:23:45 +0000 Subject: [PATCH] pt.c (lookup_template_class): Add comment. * pt.c (lookup_template_class): Add comment. (instantiate_class_template): Don't mark the _TYPE node for member class templates as an instantiation. From-SVN: r23092 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 87e97623267..0e5b319822e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +1998-10-14 Mark Mitchell + + * pt.c (lookup_template_class): Add comment. + (instantiate_class_template): Don't mark the _TYPE node for + member class templates as an instantiation. + 1998-10-14 Jason Merrill * decl.c (grokfndecl): Fix my thinko. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index ea021fa8025..c836fbd4505 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -3547,7 +3547,9 @@ lookup_template_class (d1, arglist, in_decl, context, entering_scope) push_obstacks (&permanent_obstack, &permanent_obstack); /* This type is a "partial instantiation" if any of the template - arguments still inolve template parameters. */ + arguments still inolve template parameters. Note that we set + IS_PARTIAL_INSTANTIATION for partial specializations as + well. */ is_partial_instantiation = uses_template_parms (arglist); /* Create the type. */ @@ -4519,6 +4521,17 @@ instantiate_class_template (type) newtag = tsubst (tag, args, NULL_TREE); if (TREE_CODE (newtag) != ENUMERAL_TYPE) { + if (TYPE_LANG_SPECIFIC (tag) && CLASSTYPE_IS_TEMPLATE (tag)) + /* Unfortunately, lookup_template_class sets + CLASSTYPE_IMPLICIT_INSTANTIATION for a partial + instantiation (i.e., for the type of a member template + class nested within a template class.) This behavior is + required for maybe_process_partial_specialization to work + correctly, but is not accurate in this case; the TAG is not + an instantiation of anything. (The corresponding + TEMPLATE_DECL is an instantiation, but the TYPE is not.) */ + CLASSTYPE_USE_TEMPLATE (newtag) = 0; + /* Now, we call pushtag to put this NEWTAG into the scope of TYPE. We first set up the IDENTIFIER_TYPE_VALUE to avoid pushtag calling push_template_decl. We don't have to do -- 2.30.2