Result: done Files: crates/nikaia-std/src/tools/check_core_call_on.nika crates/nikaia-std/src/tools/check_core_flow.nika crates/nikaia-std/src/tools/check_state.nika crates/nikaia-std/src/tools/node_numbers.nika crates/nikaia-std/src/tools/text_tiers.nika crates/nikaia/src/check/core.rs crates/nikaia-std/src/tools/lowered/check_core_call_on.rs crates/nikaia-std/src/tools/lowered/check_core_flow.rs crates/nikaia-std/src/tools/lowered/check_state.rs crates/nikaia-std/src/tools/lowered/node_numbers.rs crates/nikaia-std/src/tools/lowered/text_tiers.rs tests/compiler/tests/a_struct_pattern_field_an_arm_returns_is_owned.nika tests/compiler/tests/a_struct_pattern_field_an_arm_returns_is_owned.stdout tests/compiler/tests/a_variant_list_part_a_match_value_takes_is_owned.nika tests/compiler/tests/a_variant_list_part_a_match_value_takes_is_owned.stdout tests/compiler/tests/a_variant_list_part_an_arm_drains_is_owned.nika tests/compiler/tests/a_variant_list_part_an_arm_drains_is_owned.stdout tests/compiler/tests/a_variant_list_part_an_arm_hands_on_is_owned.nika tests/compiler/tests/a_variant_list_part_an_arm_hands_on_is_owned.stdout tests/compiler/tests/a_variant_list_part_an_arm_only_reads_stays_a_view.nika tests/compiler/tests/a_variant_list_part_an_arm_only_reads_stays_a_view.stdout tests/compiler/tests/a_variant_list_part_an_arm_returns_is_owned.nika tests/compiler/tests/a_variant_list_part_an_arm_returns_is_owned.stdout tests/compiler/tests/a_variant_list_part_of_literals_walked_by_for_runs.nika tests/compiler/tests/a_variant_list_part_of_literals_walked_by_for_runs.stdout tests/compiler/tests/a_variant_text_or_number_list_part_an_arm_returns.nika tests/compiler/tests/a_variant_text_or_number_list_part_an_arm_returns.stdout Commit: check: a variant’s or struct’s list-of-text part an arm takes is owned; a drained part asks no mut Body: text_tiers made a variant payload (and a struct pattern’s field) static text where only literals built it, but never followed the name a match arm binds: so the part was Vec[ref String] in the arm while the result it was handed to stayed Vec[String]. bind_static_payloads now binds a list of text a variant or struct pattern binds as that part’s position (as let xs = s.xs is, ADR-282 D16) and a struct field of static text as its view (as a variant payload already was). A whole name drained is recorded as taken (CheckState.drained), not as a change, so no let mut xs = xs is written before the into_iter(). node_numbers.nika: the seven single-use list helpers are folded back into their arms; lower-std changes check_core_call_on, check_core_flow, check_state, node_numbers, text_tiers only. Note: fields[(a, b)] lowers to &((a, b)) (clippy double_parens), so the key is bound first, as field_place does. Fixes: #905 Pushed: e3b8c74576553c9b14b0463764dbb496c96e306f Tests: 8 new programs in tests/compiler (returns, hands on, drains, match value, read-only stays a view, for over literal part, struct pattern fields, String/Vec[i64] baseline); 6 failed on the unfixed compiler (checker or rustc), the baseline and read-only ones passed there; nikaia test –both-settings –project tests/compiler 203 passed; it errors_lowering:: samples:: diagnostics:: lower:: + guard set 60 passed; clippy clean; pre-push-check ok; lower-std fixpoint Gate: green Deviation: the brief’s row for x in xs { out.push(x) } runs only where the part holds static text; with owned text it stays NK1102, as for any list (see Owner) Found: none Needs: none Changelog: A variant’s Vec[String] part taken in a match arm is owned - returned, handed on, drained or made the match’s value, it is Vec[String] even where only literals built the variant (also a struct pattern’s fields); a drained part no longer lowers to an unused let mut (#905). Owner: none (settled by ADR-094 D4: a for lends, for x in xs.drain() takes; the supervisor, 2026-10-28) Disk freed: 0 (no clone; project-test cache 3.8G, 17G free, no new entry over 100 MB) Rs2nika: none

This site is open source. Improve this page.