feat: execute optional type-valued compile-time storage

Preserve owned optional metadata snapshots, nested presence, captures, checked unwraps and erased specialization identity. Verify imported nominal ownership across repeated compilation. Bootstrap: 299 passed. Native: 1080 programs plus 5 allocator programs passed with a temporary 120-second command deadline; bounded inline expansion exceeds the harness default of 30 seconds.
This commit is contained in:
2026-10-30 19:21:21 +01:00
parent 83b6153e72
commit 0625359d62
5 changed files with 322 additions and 8 deletions
+60
View File
@@ -1148,3 +1148,63 @@ computed_untagged_unions_recompile_without_borrowing_storage_bytes test {
try testing.expect_equal(i64(42), outcome.value.data.integer)
}
}
optional_type_metadata_recompiles_owned_private_nominal_payloads test {
diagnostic_store := diagnostics.init(mem.c_allocator)
defer diagnostics.deinit(&diagnostic_store)
modules [2]mut ir.Module := undefined
{
session := init(mem.c_allocator)
defer deinit(&session)
root :: try add_package(&session)
dependency :: try add_package(&session)
bytes := try owned_text(
`lib :: import "../library"
`Child :: struct { value bool }
`main proc() i16 {
` if (lib.Box(lib.make()) != lib.Box(lib.make())) return -1
` if (lib.Selected() == Child) return -2
` value lib.Selected() :: { value = 42 }
` return value.value
`}
,
)
defer arraylist.deinit(&bytes)
root_source :: try add_source(&session, root, "/optional_types/app/main.hon", &bytes, &diagnostic_store)
imported := try owned_text(
`@hide:file
`Child :: struct { value i16 }
`@hide:file
`Config :: struct { child ?type, count usize }
`make proc() ?Config { return { child = Child, count = 2 } }
`Box proc(input ?Config) type {
` info :: input?
` T :: info.child?
` return struct { values [info.count]T }
`}
`Selected proc() type {
` if make() |info| { return info.child? }
` return bool
`}
,
)
defer arraylist.deinit(&imported)
_ = try add_source(&session, dependency, "/optional_types/library/types.hon", &imported, &diagnostic_store)
try arraylist.append(&session.imports, Import{
node = declaration(&session, root_source, 0).node,
target = dependency,
})
modules[0] = try compile(&session, root, &diagnostic_store)
errdefer ir.deinit(&modules[0])
modules[1] = try compile(&session, root, &diagnostic_store)
}
defer ir.deinit(&modules[0])
defer ir.deinit(&modules[1])
try testing.expect_equal(0, diagnostics.count(&diagnostic_store))
for modules |module| {
outcome := try interpreter.run(mem.c_allocator, &module, &diagnostic_store)
defer interpreter.deinit(&outcome)
try testing.expect(outcome.trap == null)
try testing.expect_equal(i64(42), outcome.value.data.integer)
}
}