zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit c4fd3fc270c38610df1e10ada4d3c2e4ef263e52 (tree)
parent ab4b34f75f5762b4bc87ccc49df73ebf0f633c5a
Author: LemonBoy <thatlemon@gmail.com>
Date:   Fri,  6 Nov 2020 19:35:23 +0100

stage1: Resolve ErrorUnion children types

Since the code is accessing the abi_size field compute the full type
size for both err_set_type and payload_type, not only for the latter.

Diffstat:
Msrc/stage1/analyze.cpp | 8+++++++-
Mtest/stage1/behavior.zig | 1+
Atest/stage1/behavior/bugs/7003.zig | 8++++++++
3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/stage1/analyze.cpp b/src/stage1/analyze.cpp @@ -745,8 +745,14 @@ ZigType *get_error_union_type(CodeGen *g, ZigType *err_set_type, ZigType *payloa return existing_entry->value; } + Error err; + if ((err = type_resolve(g, err_set_type, ResolveStatusSizeKnown))) + return g->builtin_types.entry_invalid; + + if ((err = type_resolve(g, payload_type, ResolveStatusSizeKnown))) + return g->builtin_types.entry_invalid; + ZigType *entry = new_type_table_entry(ZigTypeIdErrorUnion); - assert(type_is_resolved(payload_type, ResolveStatusSizeKnown)); buf_resize(&entry->name, 0); buf_appendf(&entry->name, "%s!%s", buf_ptr(&err_set_type->name), buf_ptr(&payload_type->name)); diff --git a/test/stage1/behavior.zig b/test/stage1/behavior.zig @@ -58,6 +58,7 @@ comptime { _ = @import("behavior/bugs/6850.zig"); _ = @import("behavior/bugs/7027.zig"); _ = @import("behavior/bugs/7047.zig"); + _ = @import("behavior/bugs/7003.zig"); _ = @import("behavior/bugs/394.zig"); _ = @import("behavior/bugs/421.zig"); _ = @import("behavior/bugs/529.zig"); diff --git a/test/stage1/behavior/bugs/7003.zig b/test/stage1/behavior/bugs/7003.zig @@ -0,0 +1,8 @@ +test "@Type should resolve its children types" { + const sparse = enum(u2) { a, b, c }; + const dense = enum(u2) { a, b, c, d }; + + comptime var sparse_info = @typeInfo(anyerror!sparse); + sparse_info.ErrorUnion.payload = dense; + const B = @Type(sparse_info); +}