From: Mark Mitchell Date: Wed, 14 Oct 1998 20:23:45 +0000 (+0000) Subject: pt.c (lookup_template_class): Add comment. X-Git-Tag: prereleases/libgcj-0.1~2511 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=486e40770d3273c7ab557c879ba39917dbd26cf0;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 87e976232671..0e5b319822e2 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 ea021fa80258..c836fbd45056 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