From b3314a8be6c902c4da3ccef4b29f2ca3ae22061c Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Wed, 28 Oct 2020 22:54:10 +0100 Subject: [PATCH] stage1: Fix small bug in pointer type analysis A flag meant to catch recursively-defined types was never reset, leading the compiler to generate wrong answers when asked for its type/alignment. Closes #6850 --- src/stage1/analyze.cpp | 5 +++++ test/stage1/behavior.zig | 1 + test/stage1/behavior/bugs/6850.zig | 12 ++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 test/stage1/behavior/bugs/6850.zig diff --git a/src/stage1/analyze.cpp b/src/stage1/analyze.cpp index 0da3ec58dc..f942e06cb8 100644 --- a/src/stage1/analyze.cpp +++ b/src/stage1/analyze.cpp @@ -6821,9 +6821,12 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) { TypeStructField *field = find_struct_type_field(isf->inferred_struct_type, isf->field_name); assert(field != nullptr); if (field->is_comptime) { + ty->data.pointer.resolve_loop_flag_zero_bits = false; + ty->abi_size = 0; ty->size_in_bits = 0; ty->abi_align = 0; + return ErrorNone; } elem_type = field->type_entry; @@ -6835,6 +6838,8 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) { if ((err = type_has_bits2(g, elem_type, &has_bits))) return err; + ty->data.pointer.resolve_loop_flag_zero_bits = false; + if (has_bits) { ty->abi_size = g->builtin_types.entry_usize->abi_size; ty->size_in_bits = g->builtin_types.entry_usize->size_in_bits; diff --git a/test/stage1/behavior.zig b/test/stage1/behavior.zig index 541c32e683..43d38fb6a7 100644 --- a/test/stage1/behavior.zig +++ b/test/stage1/behavior.zig @@ -54,6 +54,7 @@ comptime { _ = @import("behavior/bugs/5474.zig"); _ = @import("behavior/bugs/5487.zig"); _ = @import("behavior/bugs/6781.zig"); + _ = @import("behavior/bugs/6850.zig"); _ = @import("behavior/bugs/394.zig"); _ = @import("behavior/bugs/421.zig"); _ = @import("behavior/bugs/529.zig"); diff --git a/test/stage1/behavior/bugs/6850.zig b/test/stage1/behavior/bugs/6850.zig new file mode 100644 index 0000000000..6759ba79ca --- /dev/null +++ b/test/stage1/behavior/bugs/6850.zig @@ -0,0 +1,12 @@ +const std = @import("std"); + +test "lazy sizeof comparison with zero" { + const Empty = struct {}; + const T = *Empty; + + std.testing.expect(hasNoBits(T)); +} + +fn hasNoBits(comptime T: type) bool { + return @sizeOf(T) == 0; +}