From 547561795ed7e97874f0dbdcc14731bf2bf40fa8 Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Wed, 19 Aug 2026 19:25:58 +0000 Subject: [PATCH 1/2] WIP: RC-aware pattern emission guard (held, pre-sync) --- src/v1/05_emit_rust.dag | 125 ++++++++++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 42 deletions(-) diff --git a/src/v1/05_emit_rust.dag b/src/v1/05_emit_rust.dag index 5d80de1965a..7ff700a742d 100644 --- a/src/v1/05_emit_rust.dag +++ b/src/v1/05_emit_rust.dag @@ -6468,6 +6468,16 @@ fn variant_pattern_shape_key(rust_name: String, resolved_parent: String?) -> Str } } +fn variant_pattern_shape_str(qualified: String, rust_name: String, resolved_parent: String?, emit_info: EmitGraphInfo) -> String { + let shape_key = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) + let is_positional = set_contains(emit_info.positional_payload_variants, shape_key) + || set_contains(emit_info.positional_payload_variants, qualified) + let is_fielded = set_contains(emit_info.fielded_variants, shape_key) + || set_contains(emit_info.fielded_variants, qualified) + if is_positional { concat(qualified, "(_)") } + else if is_fielded { concat(qualified, " { .. }") } else { qualified } +} + fn emit_variant_pattern(name: String, parent_enum: String?, field_bindings: List, path_prefix: List, shared_types: Set, scrut_type: String, source_indices: Map, emit_info: EmitGraphInfo) -> String { let bare_name = qualified_last_segment(name: name) let resolved_parent = pattern_parent_enum(name: bare_name, parent_enum: parent_enum, scrut_type: scrut_type, type_summaries: emit_info.type_summaries) @@ -6521,25 +6531,13 @@ fn emit_variant_pattern(name: String, parent_enum: String?, field_bindings: List Absent => qualified } } else if field_bindings |> count == 0 { - let shape_key = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) - let is_positional = set_contains(emit_info.positional_payload_variants, shape_key) - || set_contains(emit_info.positional_payload_variants, qualified) - let is_fielded = set_contains(emit_info.fielded_variants, shape_key) - || set_contains(emit_info.fielded_variants, qualified) - if is_positional { concat(qualified, "(_)") } - else if is_fielded { concat(qualified, " { .. }") } else { qualified } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) } else { let effective_bindings = field_bindings |> filter(fb => match field_binding_pattern(n: fb) { Wildcard => false _ => true } ) if effective_bindings |> count == 0 { - let shape_key2 = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) - let is_positional2 = set_contains(emit_info.positional_payload_variants, shape_key2) - || set_contains(emit_info.positional_payload_variants, qualified) - let is_fielded2 = set_contains(emit_info.fielded_variants, shape_key2) - || set_contains(emit_info.fielded_variants, qualified) - if is_positional2 { concat(qualified, "(_)") } - else if is_fielded2 { concat(qualified, " { .. }") } else { qualified } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) } else { let binding_strs = effective_bindings |> map(fb => let fb_name = field_binding_name_at(n: fb, source_indices: source_indices) @@ -6783,25 +6781,13 @@ fn emit_variant_pattern_rc_aware(name: String, parent_enum: String?, field_bindi Absent => qualified } } else if field_bindings |> count == 0 { - let shape_key = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) - let is_positional = set_contains(emit_info.positional_payload_variants, shape_key) - || set_contains(emit_info.positional_payload_variants, qualified) - let is_fielded = set_contains(emit_info.fielded_variants, shape_key) - || set_contains(emit_info.fielded_variants, qualified) - if is_positional { concat(qualified, "(_)") } - else if is_fielded { concat(qualified, " { .. }") } else { qualified } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) } else { let effective_bindings = field_bindings |> filter(fb => match field_binding_pattern(n: fb) { Wildcard => false _ => true } ) if effective_bindings |> count == 0 { - let shape_key2 = variant_pattern_shape_key(rust_name: rust_name, resolved_parent: resolved_parent) - let is_positional2 = set_contains(emit_info.positional_payload_variants, shape_key2) - || set_contains(emit_info.positional_payload_variants, qualified) - let is_fielded2 = set_contains(emit_info.fielded_variants, shape_key2) - || set_contains(emit_info.fielded_variants, qualified) - if is_positional2 { concat(qualified, "(_)") } - else if is_fielded2 { concat(qualified, " { .. }") } else { qualified } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) } else { let binding_strs = effective_bindings |> map(fb => let fb_name = field_binding_name_at(n: fb, source_indices: source_indices) @@ -6847,6 +6833,65 @@ fn match_pattern_is_irrefutable(pattern: MatchPattern) -> Bool { } } +fn variant_pattern_shape_for(name: String, parent_enum: String?, scrut_type: String, emit_info: EmitGraphInfo) -> String { + let bare_name = qualified_last_segment(name: name) + let resolved_parent = pattern_parent_enum(name: bare_name, parent_enum: parent_enum, scrut_type: scrut_type, type_summaries: emit_info.type_summaries) + let optional_variant = is_optional_variant_name(name: bare_name) + && (is_optional_parent(parent_enum: resolved_parent) || resolved_parent == none) + let rust_name = if optional_variant { + if is_some_like_variant_name(name: bare_name) { "Some" } else { "None" } + } else { bare_name } + let qualified = if optional_variant { + rust_name + } else { + variant_pattern_qualified_path(rust_name: rust_name, resolved_parent: resolved_parent) + } + variant_pattern_shape_str(qualified: qualified, rust_name: rust_name, resolved_parent: resolved_parent, emit_info: emit_info) +} + +fn collect_pattern_rc_variant_guards(pattern: MatchPattern, rc_analysis: RcPatternAnalysis, shared_types: Set, source_indices: Map, emit_info: EmitGraphInfo) -> String { + match pattern { + VariantPattern { name: n, parent_enum: parent_enum, field_bindings: fbs } => + let bare_n = qualified_last_segment(name: n) + if is_optional_variant_name(name: bare_n) && is_optional_parent(parent_enum: parent_enum) { + if fbs |> count == 1 { + match fbs |> first { + Present { value: fb } => + let fb_pat = field_binding_pattern(n: fb) + let inner_analysis = analyze_rc_pattern(pattern: fb_pat, scrut_type: "", shared_types: shared_types, emit_info: emit_info, source_indices: source_indices) + collect_pattern_rc_variant_guards(pattern: fb_pat, rc_analysis: inner_analysis, shared_types: shared_types, source_indices: source_indices, emit_info: emit_info) + Absent => "" + } + } else { "" } + } else { + let resolved_parent = pattern_parent_enum(name: bare_n, parent_enum: parent_enum, scrut_type: "", type_summaries: emit_info.type_summaries) + let parts = fbs |> flat_map(fb => + let fb_name = field_binding_name_at(n: fb, source_indices: source_indices) + if fb_name == "0" { + let fb_pat = field_binding_pattern(n: fb) + let payload_scrut = positional_payload_scrut_type(parent_enum: resolved_parent, variant_name: bare_n, field_binding: fb, emit_info: emit_info, source_indices: source_indices) + let inner_analysis = analyze_rc_pattern(pattern: fb_pat, scrut_type: payload_scrut, shared_types: shared_types, emit_info: emit_info, source_indices: source_indices) + let inner = collect_pattern_rc_variant_guards(pattern: fb_pat, rc_analysis: inner_analysis, shared_types: shared_types, source_indices: source_indices, emit_info: emit_info) + if inner == "" { [] } else { [inner] } + } else if field_needs_rc_ref(field_name: fb_name, rc_analysis: rc_analysis) { + let fb_pat = field_binding_pattern(n: fb) + if match_pattern_is_irrefutable(pattern: fb_pat) { [] } + else { + match fb_pat { + VariantPattern { name: inner_n, parent_enum: inner_parent, field_bindings: _ } => + let shape = variant_pattern_shape_for(name: inner_n, parent_enum: inner_parent, scrut_type: "", emit_info: emit_info) + [concat("matches!(", emit_ident(name: fb_name, target: Rust), ".as_ref(), ", shape, ")")] + _ => [] + } + } + } else { [] } + ) + parts |> join(separator: " && ") + } + _ => "" + } +} + fn rc_pattern_preludes(pattern: MatchPattern, rc_analysis: RcPatternAnalysis, shared_types: Set, source_indices: Map, emit_info: EmitGraphInfo) -> String { match pattern { VariantPattern { name: n, parent_enum: parent_enum, field_bindings: fbs } => @@ -8734,17 +8779,15 @@ fn emit_typed_match_arm(arm: Node, registry: Map, scope: Infer emit_pattern(pattern: arm_pat, path_prefix: [], shared_types: shared_types, scrut_type: scrut_type, source_indices: si, emit_info: emit_info) } let field_guards = collect_pattern_string_guards(pattern: arm_pat, path_prefix: [], source_indices: si) + let rc_variant_guards = if rc_analysis.needs_rc_pattern { + collect_pattern_rc_variant_guards(pattern: arm_pat, rc_analysis: rc_analysis, shared_types: shared_types, source_indices: si, emit_info: emit_info) + } else { "" } let arm_guard_str = match arm_g { Present { value: g } => emit_typed_expr(texpr: g, registry: registry, scope: scope, depth: depth, shared_types: shared_types, emit_info: emit_info, fuel: 1024) Absent => "" } - let guard_str = if field_guards != "" && arm_guard_str != "" { - concat(" if ", field_guards, " && ", arm_guard_str) - } else if field_guards != "" { - concat(" if ", field_guards) - } else if arm_guard_str != "" { - concat(" if ", arm_guard_str) - } else { "" } + let guard_parts = [field_guards, rc_variant_guards, arm_guard_str] |> filter(g => g != "") + let guard_str = if guard_parts |> count == 0 { "" } else { concat(" if ", guard_parts |> join(separator: " && ")) } let body_str = match arm_b.expr_data { ExprVar { binding_kind: body_binding_kind } => let body_name = expr_var_name_at(texpr: arm_b, source_indices: si) @@ -9637,17 +9680,15 @@ fn emit_typed_tco_match_arm(arm: Node, fn_name: String, params: List, regi emit_pattern(pattern: arm_pat, path_prefix: [], shared_types: shared_types, scrut_type: scrut_type, source_indices: si, emit_info: emit_info) } let field_guards = collect_pattern_string_guards(pattern: arm_pat, path_prefix: [], source_indices: si) + let rc_variant_guards = if rc_analysis.needs_rc_pattern { + collect_pattern_rc_variant_guards(pattern: arm_pat, rc_analysis: rc_analysis, shared_types: shared_types, source_indices: si, emit_info: emit_info) + } else { "" } let arm_guard_str = match arm_g { Present { value: g } => emit_typed_expr(texpr: g, registry: registry, scope: scope, depth: depth, shared_types: shared_types, emit_info: emit_info, fuel: 1024) Absent => "" } - let guard_str = if field_guards != "" && arm_guard_str != "" { - concat(" if ", field_guards, " && ", arm_guard_str) - } else if field_guards != "" { - concat(" if ", field_guards) - } else if arm_guard_str != "" { - concat(" if ", arm_guard_str) - } else { "" } + let guard_parts = [field_guards, rc_variant_guards, arm_guard_str] |> filter(g => g != "") + let guard_str = if guard_parts |> count == 0 { "" } else { concat(" if ", guard_parts |> join(separator: " && ")) } let body_str = emit_typed_tco_expr(texpr: arm_b, fn_name: fn_name, params: params, registry: registry, scope: scope, depth: depth, shared_types: shared_types, emit_info: emit_info) if rc_analysis.needs_rc_pattern { let prelude = rc_pattern_preludes(pattern: arm_pat, rc_analysis: rc_analysis, shared_types: shared_types, source_indices: si, emit_info: emit_info) From c1ce5bc73b44749d66a2d0a370d9a3dc814887af Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Wed, 19 Aug 2026 20:08:01 +0000 Subject: [PATCH 2/2] Regenerate stage0: v1_compiler_emit_rust.rs for RC-aware pattern guard fix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --required-regen refuses corpus-wide on the pre-existing #8544 population mismatch, so this projection was obtained by invoking compile_stage0 directly (rustfmt applied exactly as write_emitted_tree does), ahead of the population-comparison gate that #8544 blocks on, per an operator ruling sanctioning that narrower path for this fix. Diffed the whole emitted stage0 tree against committed. Six other files differ from committed stage0 for reasons unrelated to this change and are intentionally left untouched: - lib.rs: two missing `pub mod` lines, a direct consequence of #8544's own population gap (three files not yet in the emit population). - v1_compiler_infer.rs, v1_std_core.rs: also #8544's subject (expr_is_any_literal / where-refinement work not yet landed on main). - std_measure.rs, std_pareto.rs, std_witness_admission.rs: unowned regen backlog — stale committed projections of other sessions' .dag authority changes that were never regenerated, unrelated to pattern/Rc/match-arm emission. Discovered as a byproduct of this verification; flagged separately, not carried by this PR. Only v1_compiler_emit_rust.rs is shipped here. --- src/v1/stage0/src/v1_compiler_emit_rust.rs | 444 +++++++++++++-------- 1 file changed, 271 insertions(+), 173 deletions(-) diff --git a/src/v1/stage0/src/v1_compiler_emit_rust.rs b/src/v1/stage0/src/v1_compiler_emit_rust.rs index 571dec5b125..3775902e6f1 100644 --- a/src/v1/stage0/src/v1_compiler_emit_rust.rs +++ b/src/v1/stage0/src/v1_compiler_emit_rust.rs @@ -16692,6 +16692,36 @@ pub fn variant_pattern_shape_key(rust_name: String, resolved_parent: Option, + emit_info: Rc, +) -> String { + { + let shape_key = variant_pattern_shape_key(rust_name.clone(), resolved_parent.clone()); + let is_positional = (v1_rt::set_contains( + &emit_info.positional_payload_variants.clone(), + shape_key.clone(), + ) || v1_rt::set_contains( + &emit_info.positional_payload_variants.clone(), + qualified.clone(), + )); + let is_fielded = + (v1_rt::set_contains(&emit_info.fielded_variants.clone(), shape_key.clone()) + || v1_rt::set_contains(&emit_info.fielded_variants.clone(), qualified.clone())); + if is_positional.clone() { + v1_rt::concat(qualified.clone(), "(_)".to_string()) + } else { + if is_fielded.clone() { + v1_rt::concat(qualified.clone(), " { .. }".to_string()) + } else { + qualified.clone() + } + } + } +} + pub fn emit_variant_pattern( name: String, parent_enum: Option, @@ -16751,7 +16781,7 @@ pub fn emit_variant_pattern( } } } - None => qualified.clone(), + None => qualified, } } else { if ((field_bindings.clone().len() as i64) == 1) { @@ -16770,7 +16800,7 @@ pub fn emit_variant_pattern( if is_string_lit_pattern(fb_pat.clone()) { v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), "(ref ".to_string()), + v1_rt::concat(qualified, "(ref ".to_string()), bind_name.clone(), ), ")".to_string(), @@ -16794,7 +16824,7 @@ pub fn emit_variant_pattern( ); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), "(".to_string()), + v1_rt::concat(qualified, "(".to_string()), inner_pat.clone(), ), ")".to_string(), @@ -16819,10 +16849,7 @@ pub fn emit_variant_pattern( )); v1_rt::concat( v1_rt::concat( - v1_rt::concat( - qualified.clone(), - " { ref ".to_string(), - ), + v1_rt::concat(qualified, " { ref ".to_string()), bind_name.clone(), ), ", .. }".to_string(), @@ -16846,7 +16873,7 @@ pub fn emit_variant_pattern( ); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), " { ".to_string()), + v1_rt::concat(qualified, " { ".to_string()), v1_rt::concat( v1_rt::concat( emit_ident( @@ -16865,37 +16892,16 @@ pub fn emit_variant_pattern( } } } - None => qualified.clone(), + None => qualified, } } else { if ((field_bindings.clone().len() as i64) == 0) { - { - let shape_key = - variant_pattern_shape_key(rust_name.clone(), resolved_parent.clone()); - let is_positional = (v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - shape_key.clone(), - ) || v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - qualified.clone(), - )); - let is_fielded = (v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - shape_key.clone(), - ) || v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - qualified.clone(), - )); - if is_positional.clone() { - v1_rt::concat(qualified.clone(), "(_)".to_string()) - } else { - if is_fielded.clone() { - v1_rt::concat(qualified.clone(), " { .. }".to_string()) - } else { - qualified.clone() - } - } - } + variant_pattern_shape_str( + qualified, + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) } else { { let effective_bindings = Rc::new({ @@ -16911,35 +16917,12 @@ pub fn emit_variant_pattern( __result }); if ((effective_bindings.clone().len() as i64) == 0) { - { - let shape_key2 = variant_pattern_shape_key( - rust_name.clone(), - resolved_parent.clone(), - ); - let is_positional2 = (v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - shape_key2.clone(), - ) || v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - qualified.clone(), - )); - let is_fielded2 = (v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - shape_key2.clone(), - ) || v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - qualified.clone(), - )); - if is_positional2.clone() { - v1_rt::concat(qualified.clone(), "(_)".to_string()) - } else { - if is_fielded2.clone() { - v1_rt::concat(qualified.clone(), " { .. }".to_string()) - } else { - qualified.clone() - } - } - } + variant_pattern_shape_str( + qualified, + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) } else { { let binding_strs = Rc::new({ @@ -17047,7 +17030,7 @@ pub fn emit_variant_pattern( let bindings_str = binding_strs.clone().join(&", ".to_string()); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), " { ".to_string()), + v1_rt::concat(qualified, " { ".to_string()), bindings_str.clone(), ), ", .. }".to_string(), @@ -17497,7 +17480,7 @@ pub fn emit_variant_pattern_rc_aware( } } } - None => qualified.clone(), + None => qualified, } } else { if ((field_bindings.clone().len() as i64) == 1) { @@ -17516,7 +17499,7 @@ pub fn emit_variant_pattern_rc_aware( if is_string_lit_pattern(fb_pat.clone()) { v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), "(ref ".to_string()), + v1_rt::concat(qualified, "(ref ".to_string()), bind_name.clone(), ), ")".to_string(), @@ -17548,7 +17531,7 @@ pub fn emit_variant_pattern_rc_aware( ); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), "(".to_string()), + v1_rt::concat(qualified, "(".to_string()), inner_pat.clone(), ), ")".to_string(), @@ -17573,10 +17556,7 @@ pub fn emit_variant_pattern_rc_aware( )); v1_rt::concat( v1_rt::concat( - v1_rt::concat( - qualified.clone(), - " { ref ".to_string(), - ), + v1_rt::concat(qualified, " { ref ".to_string()), bind_name.clone(), ), ", .. }".to_string(), @@ -17586,10 +17566,7 @@ pub fn emit_variant_pattern_rc_aware( if field_needs_rc_ref(fb_name.clone(), rc_analysis.clone()) { v1_rt::concat( v1_rt::concat( - v1_rt::concat( - qualified.clone(), - " { ref ".to_string(), - ), + v1_rt::concat(qualified, " { ref ".to_string()), emit_ident(fb_name.clone(), RenderTarget::Rust), ), ", .. }".to_string(), @@ -17620,10 +17597,7 @@ pub fn emit_variant_pattern_rc_aware( ); v1_rt::concat( v1_rt::concat( - v1_rt::concat( - qualified.clone(), - " { ".to_string(), - ), + v1_rt::concat(qualified, " { ".to_string()), v1_rt::concat( v1_rt::concat( emit_ident( @@ -17643,37 +17617,16 @@ pub fn emit_variant_pattern_rc_aware( } } } - None => qualified.clone(), + None => qualified, } } else { if ((field_bindings.clone().len() as i64) == 0) { - { - let shape_key = - variant_pattern_shape_key(rust_name.clone(), resolved_parent.clone()); - let is_positional = (v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - shape_key.clone(), - ) || v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - qualified.clone(), - )); - let is_fielded = (v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - shape_key.clone(), - ) || v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - qualified.clone(), - )); - if is_positional.clone() { - v1_rt::concat(qualified.clone(), "(_)".to_string()) - } else { - if is_fielded.clone() { - v1_rt::concat(qualified.clone(), " { .. }".to_string()) - } else { - qualified.clone() - } - } - } + variant_pattern_shape_str( + qualified, + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) } else { { let effective_bindings = Rc::new({ @@ -17689,35 +17642,12 @@ pub fn emit_variant_pattern_rc_aware( __result }); if ((effective_bindings.clone().len() as i64) == 0) { - { - let shape_key2 = variant_pattern_shape_key( - rust_name.clone(), - resolved_parent.clone(), - ); - let is_positional2 = (v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - shape_key2.clone(), - ) || v1_rt::set_contains( - &emit_info.positional_payload_variants.clone(), - qualified.clone(), - )); - let is_fielded2 = (v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - shape_key2.clone(), - ) || v1_rt::set_contains( - &emit_info.fielded_variants.clone(), - qualified.clone(), - )); - if is_positional2.clone() { - v1_rt::concat(qualified.clone(), "(_)".to_string()) - } else { - if is_fielded2.clone() { - v1_rt::concat(qualified.clone(), " { .. }".to_string()) - } else { - qualified.clone() - } - } - } + variant_pattern_shape_str( + qualified, + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) } else { { let binding_strs = Rc::new({ @@ -17848,7 +17778,7 @@ pub fn emit_variant_pattern_rc_aware( let bindings_str = binding_strs.clone().join(&", ".to_string()); v1_rt::concat( v1_rt::concat( - v1_rt::concat(qualified.clone(), " { ".to_string()), + v1_rt::concat(qualified, " { ".to_string()), bindings_str.clone(), ), ", .. }".to_string(), @@ -17870,6 +17800,146 @@ pub fn match_pattern_is_irrefutable(pattern: Rc) -> bool { } } +pub fn variant_pattern_shape_for( + name: String, + parent_enum: Option, + scrut_type: String, + emit_info: Rc, +) -> String { + { + let bare_name = qualified_last_segment(name.clone()); + let resolved_parent = pattern_parent_enum( + bare_name.clone(), + parent_enum.clone(), + scrut_type.clone(), + emit_info.type_summaries.clone(), + ); + let optional_variant = (is_optional_variant_name(bare_name.clone()) + && (is_optional_parent(resolved_parent.clone()) || (resolved_parent.clone() == None))); + let rust_name = if optional_variant.clone() { + if is_some_like_variant_name(bare_name.clone()) { + "Some".to_string() + } else { + "None".to_string() + } + } else { + bare_name.clone() + }; + let qualified = if optional_variant.clone() { + rust_name.clone() + } else { + variant_pattern_qualified_path(rust_name.clone(), resolved_parent.clone()) + }; + variant_pattern_shape_str( + qualified.clone(), + rust_name.clone(), + resolved_parent.clone(), + emit_info.clone(), + ) + } +} + +pub fn collect_pattern_rc_variant_guards( + pattern: Rc, + rc_analysis: Rc, + shared_types: Rc>, + source_indices: Rc>>, + emit_info: Rc, +) -> String { + stacker::maybe_grow(512 * 1024, 2 * 1024 * 1024, || { + match (*pattern.clone()).clone() { + MatchPattern::VariantPattern { + name: n, + parent_enum, + field_bindings: fbs, + .. + } => { + let bare_n = qualified_last_segment(n.clone()); + if (is_optional_variant_name(bare_n.clone()) + && is_optional_parent(parent_enum.clone())) + { + if ((fbs.clone().len() as i64) == 1) { + match fbs.clone().first().cloned() { + Some(fb) => { + let fb_pat = field_binding_pattern(fb.clone()); + let inner_analysis = analyze_rc_pattern( + fb_pat.clone(), + "".to_string(), + shared_types.clone(), + emit_info.clone(), + source_indices.clone(), + ); + collect_pattern_rc_variant_guards( + fb_pat.clone(), + inner_analysis.clone(), + shared_types.clone(), + source_indices.clone(), + emit_info.clone(), + ) + } + None => "".to_string(), + } + } else { + "".to_string() + } + } else { + { + let resolved_parent = pattern_parent_enum( + bare_n.clone(), + parent_enum.clone(), + "".to_string(), + emit_info.type_summaries.clone(), + ); + let parts = Rc::new({ + let mut __result = Vec::new(); + for fb in fbs.clone().iter().cloned() { + __result.extend((*{ + let fb_name = field_binding_name_at(fb.clone(), source_indices.clone()); +if (fb_name.clone() == "0".to_string()) { + { + let fb_pat = field_binding_pattern(fb.clone()); +let payload_scrut = positional_payload_scrut_type(resolved_parent.clone(), bare_n.clone(), fb.clone(), emit_info.clone(), source_indices.clone()); +let inner_analysis = analyze_rc_pattern(fb_pat.clone(), payload_scrut.clone(), shared_types.clone(), emit_info.clone(), source_indices.clone()); +let inner = collect_pattern_rc_variant_guards(fb_pat.clone(), inner_analysis.clone(), shared_types.clone(), source_indices.clone(), emit_info.clone()); +if (inner.clone() == "".to_string()) { + Rc::new(vec![]) + } else { + Rc::new(vec![inner.clone()]) + } +} + } else { + if field_needs_rc_ref(fb_name.clone(), rc_analysis.clone()) { + { + let fb_pat = field_binding_pattern(fb.clone()); +if match_pattern_is_irrefutable(fb_pat.clone()) { + Rc::new(vec![]) + } else { + match (*fb_pat.clone()).clone() { + MatchPattern::VariantPattern { name: inner_n, parent_enum: inner_parent, .. } => { + let shape = variant_pattern_shape_for(inner_n.clone(), inner_parent.clone(), "".to_string(), emit_info.clone()); +Rc::new(vec![v1_rt::concat(v1_rt::concat(v1_rt::concat(v1_rt::concat("matches!(".to_string(), emit_ident(fb_name.clone(), RenderTarget::Rust)), ".as_ref(), ".to_string()), shape.clone()), ")".to_string())]) +}, + _ => Rc::new(vec![]), +} + } +} + } else { + Rc::new(vec![]) + } + } +}).iter().cloned()); + } + __result + }); + parts.clone().join(&" && ".to_string()) + } + } + } + _ => "".to_string(), + } + }) +} + pub fn rc_pattern_preludes( pattern: Rc, rc_analysis: Rc, @@ -23844,6 +23914,17 @@ pub fn emit_typed_match_arm( }; let field_guards = collect_pattern_string_guards(arm_pat.clone(), Rc::new(vec![]), si.clone()); + let rc_variant_guards = if rc_analysis.needs_rc_pattern.clone() { + collect_pattern_rc_variant_guards( + arm_pat.clone(), + rc_analysis.clone(), + shared_types.clone(), + si.clone(), + emit_info.clone(), + ) + } else { + "".to_string() + }; let arm_guard_str = match arm_g.clone() { Some(g) => emit_typed_expr( g.clone(), @@ -23856,26 +23937,29 @@ pub fn emit_typed_match_arm( ), None => "".to_string(), }; - let guard_str = if ((field_guards.clone() != "".to_string()) - && (arm_guard_str.clone() != "".to_string())) - { - v1_rt::concat( - v1_rt::concat( - v1_rt::concat(" if ".to_string(), field_guards.clone()), - " && ".to_string(), - ), + let guard_parts = Rc::new({ + let mut __result = Vec::new(); + for g in Rc::new(vec![ + field_guards.clone(), + rc_variant_guards.clone(), arm_guard_str.clone(), - ) - } else { - if (field_guards.clone() != "".to_string()) { - v1_rt::concat(" if ".to_string(), field_guards.clone()) - } else { - if (arm_guard_str.clone() != "".to_string()) { - v1_rt::concat(" if ".to_string(), arm_guard_str.clone()) - } else { - "".to_string() + ]) + .iter() + .cloned() + { + if (g.clone() != "".to_string()) { + __result.push(g); } } + __result + }); + let guard_str = if ((guard_parts.clone().len() as i64) == 0) { + "".to_string() + } else { + v1_rt::concat( + " if ".to_string(), + guard_parts.clone().join(&" && ".to_string()), + ) }; let body_str = match (*arm_b.expr_data.clone()).clone() { ExprData::ExprVar { @@ -26827,6 +26911,17 @@ pub fn emit_typed_tco_match_arm( }; let field_guards = collect_pattern_string_guards(arm_pat.clone(), Rc::new(vec![]), si.clone()); + let rc_variant_guards = if rc_analysis.needs_rc_pattern.clone() { + collect_pattern_rc_variant_guards( + arm_pat.clone(), + rc_analysis.clone(), + shared_types.clone(), + si.clone(), + emit_info.clone(), + ) + } else { + "".to_string() + }; let arm_guard_str = match arm_g.clone() { Some(g) => emit_typed_expr( g.clone(), @@ -26839,26 +26934,29 @@ pub fn emit_typed_tco_match_arm( ), None => "".to_string(), }; - let guard_str = if ((field_guards.clone() != "".to_string()) - && (arm_guard_str.clone() != "".to_string())) - { - v1_rt::concat( - v1_rt::concat( - v1_rt::concat(" if ".to_string(), field_guards.clone()), - " && ".to_string(), - ), + let guard_parts = Rc::new({ + let mut __result = Vec::new(); + for g in Rc::new(vec![ + field_guards.clone(), + rc_variant_guards.clone(), arm_guard_str.clone(), - ) - } else { - if (field_guards.clone() != "".to_string()) { - v1_rt::concat(" if ".to_string(), field_guards.clone()) - } else { - if (arm_guard_str.clone() != "".to_string()) { - v1_rt::concat(" if ".to_string(), arm_guard_str.clone()) - } else { - "".to_string() + ]) + .iter() + .cloned() + { + if (g.clone() != "".to_string()) { + __result.push(g); } } + __result + }); + let guard_str = if ((guard_parts.clone().len() as i64) == 0) { + "".to_string() + } else { + v1_rt::concat( + " if ".to_string(), + guard_parts.clone().join(&" && ".to_string()), + ) }; let body_str = emit_typed_tco_expr( arm_b.clone(),