The last frontend-gap pin: wwstage had no Hare struct embedding
(struct { hash.hash, ... }), rejecting lib/crypto/sha256 at parse.
- parse.ww: the three member forms (named / anonymous struct / bare
dotted-ident embed), consume-then-branch since this parser has no
peek; embeds carry f.str == "" and the type in f.lhs.
- check.ww N_TSTRUCT flatten: promote the inner struct's flattened
fields at base+src.offset (check.c:961-990); the embed is one
nested-struct unit in the slot ladder; the resolved inner AST is
planted on the TFIELD rhs for cgen.
- check.ww walkers: astoffset / exprtype N_DOT / #251 struct-lit
field lookups descend embeds through shared helpers; the collision
and non-struct-embed rejects live in validatestructfields (the
once-per-decl diagnostic site).
- cgenutil.ww registerstruct: regfieldrun walks the AST against the
flattened tfield cursor, descending embeds via the planted inner
AST so promoted fieldinfo entries keep the inner field's own name
and type node.
- wwi printers unchanged (both stages already emit nameless fields).
sha256_test compiles byte-identically end to end and its 6 tests
pass; 989_lib_byteid is now 44 id / 0 divergent / 0 wwreject.
Fixtures r5913_* (promoted rw, offset shift, anonymous embed,
two-level embed + promoted fn-ptr callee, three rejects); corpus pin
1485/2970.
35 lines
612 B
Plaintext
35 lines
612 B
Plaintext
//ww:run-exit 33
|
|
package main;
|
|
|
|
// #59.13: two-level embedding (outer2 embeds deep embeds cbs) — the
|
|
// promotion flattens transitively, and a promoted `*fn(...)` field
|
|
// still resolves as an indirect callee (the fieldinfo run keeps the
|
|
// inner field's own type node).
|
|
|
|
type cbs = struct {
|
|
cb: *fn(x: i32) i32,
|
|
k: i32,
|
|
};
|
|
|
|
type deep = struct {
|
|
cbs,
|
|
extra: i32,
|
|
};
|
|
|
|
type outer2 = struct {
|
|
deep,
|
|
tail: i32,
|
|
};
|
|
|
|
fn twice(x: i32) i32 = { return x * 2; };
|
|
|
|
fn main() i32 = {
|
|
let o: outer2;
|
|
o.cb = &twice;
|
|
o.k = 4;
|
|
o.extra = 5;
|
|
o.tail = 6;
|
|
let r: i32 = o.cb(9);
|
|
return r + o.k + o.extra + o.tail;
|
|
};
|