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