@@ -12285,21 +12285,13 @@ instantiate_class_template (tree type)
Ignore it; it will be regenerated when needed. */
continue;
- bool class_template_p = (TREE_CODE (t) != ENUMERAL_TYPE
- && TYPE_LANG_SPECIFIC (t)
- && CLASSTYPE_IS_TEMPLATE (t));
+ /* If the member is a class template, we've
+ already substituted its type. */
+ if (CLASS_TYPE_P (t)
+ && CLASSTYPE_IS_TEMPLATE (t))
+ continue;
- /* If the member is a class template, then -- even after
- substitution -- there may be dependent types in the
- template argument list for the class. We increment
- PROCESSING_TEMPLATE_DECL so that dependent_type_p, as
- that function will assume that no types are dependent
- when outside of a template. */
- if (class_template_p)
- ++processing_template_decl;
tree newtag = tsubst (t, args, tf_error, NULL_TREE);
- if (class_template_p)
- --processing_template_decl;
if (newtag == error_mark_node)
continue;
@@ -12307,19 +12299,6 @@ instantiate_class_template (tree type)
{
tree name = TYPE_IDENTIFIER (t);
- if (class_template_p)
- /* 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, install the tag. We don't use pushtag
because that does too much work -- creating an
implicit typedef, which we've already done. */
@@ -14750,7 +14729,10 @@ tsubst_template_decl (tree t, tree args, tsubst_flags_t complain,
/* For a partial specialization, we need to keep pointing to
the primary template. */
if (!DECL_TEMPLATE_SPECIALIZATION (t))
- CLASSTYPE_TI_TEMPLATE (inner) = r;
+ {
+ CLASSTYPE_TI_TEMPLATE (inner) = r;
+ CLASSTYPE_USE_TEMPLATE (inner) = 0;
+ }
DECL_TI_ARGS (r) = CLASSTYPE_TI_ARGS (inner);
inner = TYPE_MAIN_DECL (inner);