cmd+selfhost+test: predeclare nomem in universe scope
Per Hare convention, `nomem` is a language-level error type — no
import required, in scope alongside void/done/rune/str. ref/hare uses
it bare at errors/string.ha:14, types/c/strings.ha:89, net/uri/parse.ha:17
with no `use`. Precondition for graduating the `alloc` builtin to
`(*T | nomem)` returns.
cstage: ty_nomem is NAMED{under=ty_void, iserror=1}, installed by
typesinit and surfaced via lookup_builtin. wwstage seeds the same
shape in both check.ww (scope) and cgen.ww (aliases) — separate
tables, both consulted; without the cgen seed wwstage drops the
zero-init for `let e: nomem;` locals and breaks byte-identity.
Tests: tagged_ptr_ret.ww and trypromote.ww drop their local
`type nomem = !void;` aliases. 990_selfhost.c adds a regression that
a value named `nomem` does not collide with the predeclared type.
This commit is contained in:
@@ -16,6 +16,7 @@ Type *ty_int, *ty_uint, *ty_uintptr;
|
||||
Type *ty_f32, *ty_f64, *ty_str;
|
||||
Type *ty_err;
|
||||
Type *ty_never;
|
||||
Type *ty_nomem;
|
||||
Type *ty_untyped_int, *ty_untyped_float, *ty_untyped_str;
|
||||
Type *ty_untyped_rune, *ty_untyped_bool, *ty_untyped_nil;
|
||||
|
||||
@@ -63,6 +64,16 @@ typesinit(Arena *a)
|
||||
ty_str = prim(a, TY_STR, "str", 16, 8);
|
||||
ty_err = prim(a, TY_ERR, "<err>", 0, 1);
|
||||
ty_never = prim(a, TY_NEVER, "never", 0, 1);
|
||||
/* #29: predeclared `type nomem = !void;`. NAMED so variant_match
|
||||
* compares by pointer identity (singleton across all references);
|
||||
* under=ty_void + iserror=1 triggers the `!T` error-tag machinery
|
||||
* the same way a user-declared alias would. */
|
||||
ty_nomem = newtype(a, TY_NAMED);
|
||||
ty_nomem->name = "nomem";
|
||||
ty_nomem->under = ty_void;
|
||||
ty_nomem->size = ty_void->size;
|
||||
ty_nomem->align = ty_void->align;
|
||||
ty_nomem->iserror = 1;
|
||||
|
||||
ty_untyped_int = prim(a, TY_UNTYPED_INT, "untyped_int", 0, 1);
|
||||
ty_untyped_float = prim(a, TY_UNTYPED_FLOAT, "untyped_float", 0, 1);
|
||||
|
||||
Reference in New Issue
Block a user