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