Tested x86_64-pc-linux-gnu, applying to trunk.

-- 8< --

While looking at the PR127132 patch, I noticed that this seems like another
place for maybe_push_to_top_level.  The lambda handling removed here (from
PR58761) is very different from that in maybe_push_to_top_level, but
lambda-nsdmi6.C still passes.

gcc/cp/ChangeLog:

        * pt.cc (instantiate_class_template): Use maybe_push_to_top_level.
---
 gcc/cp/pt.cc | 30 ++----------------------------
 1 file changed, 2 insertions(+), 28 deletions(-)

diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 28845214eed..2fc0e06380d 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -12900,7 +12900,6 @@ instantiate_class_template (tree type)
   tree pbinfo;
   tree base_list;
   unsigned int saved_maximum_field_alignment;
-  tree fn_context;
 
   if (type == error_mark_node)
     return error_mark_node;
@@ -12961,22 +12960,7 @@ instantiate_class_template (tree type)
 
   maybe_diagnose_erroneous_template (t ? TI_TEMPLATE (t) : templ);
 
-  int saved_unevaluated_operand = cp_unevaluated_operand;
-  int saved_unevaluated_typeid_cutoff = cp_unevaluated_typeid_cutoff;
-  int saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
-
-  fn_context = decl_function_context (TYPE_MAIN_DECL (type));
-  /* Also avoid push_to_top_level for a lambda in an NSDMI.  */
-  if (!fn_context && LAMBDA_TYPE_P (type) && TYPE_CLASS_SCOPE_P (type))
-    fn_context = error_mark_node;
-  if (!fn_context)
-    push_to_top_level ();
-  else
-    {
-      cp_unevaluated_operand = 0;
-      cp_unevaluated_typeid_cutoff = 0;
-      c_inhibit_evaluation_warnings = 0;
-    }
+  bool push_to_top = maybe_push_to_top_level (TYPE_MAIN_DECL (type));
 
   mark_template_arguments_used (templ, CLASSTYPE_TI_ARGS (type));
 
@@ -13387,15 +13371,6 @@ instantiate_class_template (tree type)
        }
     }
 
-  if (fn_context)
-    {
-      /* Restore these before substituting into the lambda capture
-        initializers.  */
-      cp_unevaluated_operand = saved_unevaluated_operand;
-      cp_unevaluated_typeid_cutoff = saved_unevaluated_typeid_cutoff;
-      c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
-    }
-
   /* Set the file and line number information to whatever is given for
      the class itself.  This puts error messages involving generated
      implicit functions at a predictable point, and the same point
@@ -13435,8 +13410,7 @@ instantiate_class_template (tree type)
   popclass ();
   pop_scope (pushed_scope);
   maximum_field_alignment = saved_maximum_field_alignment;
-  if (!fn_context)
-    pop_from_top_level ();
+  maybe_pop_from_top_level (push_to_top);
   pop_tinst_level ();
 
   /* The vtable for a template class can be emitted in any translation

base-commit: f300960ef2b7c205822ef460e302cf593b39cd81
-- 
2.55.0

Reply via email to