zig

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

commit 8e3c56b912b7eb6ee551b7e427adbaae0bdcd408 (tree)
parent 0107b19124255179a48cd605f31ed57d5ade28e7
Author: LemonBoy <thatlemon@gmail.com>
Date:   Sun,  1 Sep 2019 19:47:58 +0200

Always resolve the struct field types

Packed structs used to skip the zero-sized types and trip some
assertions that expected the type reference not to be null.

Fixes #3143

Diffstat:
Msrc/analyze.cpp | 42+++++++++++++++++++-----------------------
Mtest/stage1/behavior/struct.zig | 8++++++++
2 files changed, 27 insertions(+), 23 deletions(-)

diff --git a/src/analyze.cpp b/src/analyze.cpp @@ -2043,34 +2043,30 @@ static Error resolve_struct_type(CodeGen *g, ZigType *struct_type) { // Resolve types for fields - if (!packed) { - for (size_t i = 0; i < field_count; i += 1) { - TypeStructField *field = &struct_type->data.structure.fields[i]; - ZigType *field_type = resolve_struct_field_type(g, field); - if (field_type == nullptr) { - struct_type->data.structure.resolve_status = ResolveStatusInvalid; - return err; - } - - if ((err = type_resolve(g, field_type, ResolveStatusSizeKnown))) { - struct_type->data.structure.resolve_status = ResolveStatusInvalid; - return err; - } + for (size_t i = 0; i < field_count; i += 1) { + TypeStructField *field = &struct_type->data.structure.fields[i]; + ZigType *field_type = resolve_struct_field_type(g, field); + if (field_type == nullptr) { + struct_type->data.structure.resolve_status = ResolveStatusInvalid; + return err; + } - if (struct_type->data.structure.layout == ContainerLayoutExtern && - !type_allowed_in_extern(g, field_type)) - { - add_node_error(g, field->decl_node, - buf_sprintf("extern structs cannot contain fields of type '%s'", - buf_ptr(&field_type->name))); - struct_type->data.structure.resolve_status = ResolveStatusInvalid; - return ErrorSemanticAnalyzeFail; - } + if ((err = type_resolve(g, field_type, ResolveStatusSizeKnown))) { + struct_type->data.structure.resolve_status = ResolveStatusInvalid; + return err; + } + if (struct_type->data.structure.layout == ContainerLayoutExtern && + !type_allowed_in_extern(g, field_type)) + { + add_node_error(g, field->decl_node, + buf_sprintf("extern structs cannot contain fields of type '%s'", + buf_ptr(&field_type->name))); + struct_type->data.structure.resolve_status = ResolveStatusInvalid; + return ErrorSemanticAnalyzeFail; } } - return ErrorNone; } diff --git a/test/stage1/behavior/struct.zig b/test/stage1/behavior/struct.zig @@ -632,3 +632,11 @@ test "for loop over pointers to struct, getting field from struct pointer" { }; S.doTheTest(); } + +test "zero-bit field in packed struct" { + const S = packed struct { + x: u10, + y: void, + }; + var x: S = undefined; +}