From 92dba9078c63175d5b911afc2991b70d647c8cc9 Mon Sep 17 00:00:00 2001 From: agra Date: Tue, 2 Jun 2026 09:31:18 +0300 Subject: [PATCH] =?UTF-8?q?issues/0065:=20RESOLVED=20=E2=80=94=20value-blo?= =?UTF-8?q?ck=20destructure=20parses?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The block-value rework routes value-position `{ … }` through the same statement parser as every other block, so a destructure decl (and any statement form) inside a value-bound block now parses, with the trailing expression as the block's value. The `defer { … }` half was fixed earlier (634cf9b). Regression: examples/0042-basic-block-value-destructure.sx. Gates: zig build test, run_examples.sh -> 344 passed. --- .../0042-basic-block-value-destructure.sx | 25 +++++++++++++++++++ .../0042-basic-block-value-destructure.exit | 1 + .../0042-basic-block-value-destructure.stderr | 1 + .../0042-basic-block-value-destructure.stdout | 2 ++ .../0065-block-expr-destructure-decl-parse.md | 18 ++++++------- 5 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 examples/0042-basic-block-value-destructure.sx create mode 100644 examples/expected/0042-basic-block-value-destructure.exit create mode 100644 examples/expected/0042-basic-block-value-destructure.stderr create mode 100644 examples/expected/0042-basic-block-value-destructure.stdout diff --git a/examples/0042-basic-block-value-destructure.sx b/examples/0042-basic-block-value-destructure.sx new file mode 100644 index 0000000..20d7efb --- /dev/null +++ b/examples/0042-basic-block-value-destructure.sx @@ -0,0 +1,25 @@ +// A value-position block (`x := { … }`, a call argument, …) parses any +// statement form in its body — including a destructure decl — and yields its +// trailing expression as the value. Previously a braced value block routed +// through a restricted expression parser that rejected destructures with +// "expected ';'". +// +// Regression (issue 0065). + +#import "modules/std.sx"; + +pair :: () -> (s32, s32) { (5, 7) } + +main :: () -> s32 { + // destructure decl inside a value-bound block + sum := { + a, b := pair(); + a + b // trailing expression → the block's value + }; + print("sum: {}\n", sum); // 12 + + // block expression directly as a call argument + print("sq: {}\n", { x := 4; x * x }); // 16 + + sum +} diff --git a/examples/expected/0042-basic-block-value-destructure.exit b/examples/expected/0042-basic-block-value-destructure.exit new file mode 100644 index 0000000..48082f7 --- /dev/null +++ b/examples/expected/0042-basic-block-value-destructure.exit @@ -0,0 +1 @@ +12 diff --git a/examples/expected/0042-basic-block-value-destructure.stderr b/examples/expected/0042-basic-block-value-destructure.stderr new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/examples/expected/0042-basic-block-value-destructure.stderr @@ -0,0 +1 @@ + diff --git a/examples/expected/0042-basic-block-value-destructure.stdout b/examples/expected/0042-basic-block-value-destructure.stdout new file mode 100644 index 0000000..faae15a --- /dev/null +++ b/examples/expected/0042-basic-block-value-destructure.stdout @@ -0,0 +1,2 @@ +sum: 12 +sq: 16 diff --git a/issues/0065-block-expr-destructure-decl-parse.md b/issues/0065-block-expr-destructure-decl-parse.md index da8fd35..f69587c 100644 --- a/issues/0065-block-expr-destructure-decl-parse.md +++ b/issues/0065-block-expr-destructure-decl-parse.md @@ -1,14 +1,14 @@ # 0065 — block-expression body does not parse a destructure decl (`v, e := f();`) -> **PARTIALLY RESOLVED (defer manifestation, this session).** A braced -> `defer { … }` body now parses via `parseBlock` (src/parser.zig, the -> `kw_defer` arm) instead of `parseExpr`, mirroring `onfail`. So -> `defer { v, e := f(); … }`, `defer { x() catch e … }`, and plain -> `defer { stmt; }` all parse and run. Regression: -> `examples/1050-errors-defer-block-body.sx`. **Still open:** the -> general *value-producing block in binding position* -> (`y := { v, e := f(); v };`) — a distinct parser path — does not parse -> a destructure decl; see the second reproduction below. +> **RESOLVED.** Two fixes landed: +> - The braced `defer { … }` body now parses via `parseBlock` (src/parser.zig, +> the `kw_defer` arm) instead of `parseExpr`, mirroring `onfail`. Regression: +> `examples/1050-errors-defer-block-body.sx` (commit `634cf9b`). +> - The general *value-producing block in binding position* fell out of the +> trailing-`;` block-value rework: value-position `{ … }` now routes through +> the same statement parser as every other block, so a destructure decl (and +> any statement form) parses, and the trailing expression is the block's +> value. Regression: `examples/0042-basic-block-value-destructure.sx`. ## Symptom