@@ -1630,10 +1630,14 @@ leave_scope (void)
free_binding_level = scope;
}
- /* Find the innermost enclosing class scope, and reset
- CLASS_BINDING_LEVEL appropriately. */
if (scope->kind == sk_class)
{
+ /* Reset DEFINING_CLASS_P to allow for reuse of a
+ class-defining scope in a non-defining context. */
+ scope->defining_class_p = 0;
+
+ /* Find the innermost enclosing class scope, and reset
+ CLASS_BINDING_LEVEL appropriately. */
class_binding_level = NULL;
for (scope = current_binding_level; scope; scope =
scope->level_chain)
if (scope->kind == sk_class)
@@ -255,9 +255,12 @@ struct GTY(()) cp_binding_level {
unsigned more_cleanups_ok : 1;
unsigned have_cleanups : 1;
- /* Set if this scope is of sk_class kind and is the defining
- scope for this_entity. */
- unsigned scope_defines_class_p : 1;
+ /* Transient state set if this scope is of sk_class kind
+ and is in the process of defining 'this_entity'. Reset
+ on leaving the class definition to allow for the scope
+ to be subsequently re-used as a non-defining scope for
+ 'this_entity'. */
+ unsigned defining_class_p : 1;
/* 23 bits left to fill a 32-bit word. */
};
@@ -32027,7 +32027,7 @@ synthesize_implicit_template_parm (cp_parser
*parser)
declarator should be injected into the scope of 'A' as if
the
ill-formed template was specified explicitly. */
- while (scope->kind == sk_class &&
!scope->scope_defines_class_p)
+ while (scope->kind == sk_class && !scope->defining_class_p)
{
parent_scope = scope;
scope = scope->level_chain;
@@ -8905,12 +8905,9 @@ instantiate_class_template_1 (tree type)
return type;
/* Now we're really doing the instantiation. Mark the type as in
- the process of being defined... */
+ the process of being defined. */
TYPE_BEING_DEFINED (type) = 1;
- /* ... and the scope defining it. */
- class_binding_level->scope_defines_class_p = 1;
-
/* We may be in the middle of deferred access check. Disable
it now. */
push_deferring_access_checks (dk_no_deferred);
@@ -2777,7 +2777,7 @@ begin_class_definition (tree t)
maybe_process_partial_specialization (t);
pushclass (t);
TYPE_BEING_DEFINED (t) = 1;
- class_binding_level->scope_defines_class_p = 1;
+ class_binding_level->defining_class_p = 1;
if (flag_pack_struct)
{