From d60cbbfaa9a3ad3bd1f613be95add939c16fc9a1 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 22 Mar 2023 16:11:47 -0400 Subject: [PATCH] c++: local class in nested generic lambda [PR109241] The earlier fix for PR109241 avoided the crash by handling a type with no TREE_BINFO. But we want to move toward doing the partial substitution of classes in generic lambdas, so let's take a step in that direction. PR c++/109241 gcc/cp/ChangeLog: * pt.cc (instantiate_class_template): Do partially instantiate. (tsubst_expr): Do call complete_type for partial instantiations. --- gcc/cp/pt.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index e1c272b9817e..93a055c66a1e 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -12086,7 +12086,8 @@ instantiate_class_template (tree type) return error_mark_node; if (COMPLETE_OR_OPEN_TYPE_P (type) - || uses_template_parms (type)) + || (uses_template_parms (type) + && !TYPE_FUNCTION_SCOPE_P (type))) return type; /* Figure out which template is being instantiated. */ @@ -19356,10 +19357,7 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) case TAG_DEFN: tmp = tsubst (TREE_TYPE (t), args, complain, NULL_TREE); - if (dependent_type_p (tmp)) - /* This is a partial instantiation, try again when full. */ - add_stmt (build_min (TAG_DEFN, tmp)); - else if (CLASS_TYPE_P (tmp)) + if (CLASS_TYPE_P (tmp)) { /* Local classes are not independent templates; they are instantiated along with their containing function. And this @@ -19368,6 +19366,12 @@ tsubst_expr (tree t, tree args, tsubst_flags_t complain, tree in_decl) /* Closures are handled by the LAMBDA_EXPR. */ gcc_assert (!LAMBDA_TYPE_P (TREE_TYPE (t))); complete_type (tmp); + if (dependent_type_p (tmp)) + { + /* This is a partial instantiation, try again when full. */ + add_stmt (build_min (TAG_DEFN, tmp)); + break; + } tree save_ccp = current_class_ptr; tree save_ccr = current_class_ref; for (tree fld = TYPE_FIELDS (tmp); fld; fld = DECL_CHAIN (fld)) -- 2.39.5