authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-10-28 22:54:10+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-10-29 15:41:45+02:00
logb3314a8be6c902c4da3ccef4b29f2ca3ae22061c
tree4e4fbd8c5ba1f036d0bd6172c806e09a5cc2d18b
parent85dd5746bdcbe655132df61ca4556c72711d12d7

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

3 files changed, 18 insertions(+), 0 deletions(-)

src/stage1/analyze.cpp+5
......@@ -6821,9 +6821,12 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {
68216821 TypeStructField *field = find_struct_type_field(isf->inferred_struct_type, isf->field_name);
68226822 assert(field != nullptr);
68236823 if (field->is_comptime) {
6824 ty->data.pointer.resolve_loop_flag_zero_bits = false;
6825
68246826 ty->abi_size = 0;
68256827 ty->size_in_bits = 0;
68266828 ty->abi_align = 0;
6829
68276830 return ErrorNone;
68286831 }
68296832 elem_type = field->type_entry;
......@@ -6835,6 +6838,8 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {
68356838 if ((err = type_has_bits2(g, elem_type, &has_bits)))
68366839 return err;
68376840
6841 ty->data.pointer.resolve_loop_flag_zero_bits = false;
6842
68386843 if (has_bits) {
68396844 ty->abi_size = g->builtin_types.entry_usize->abi_size;
68406845 ty->size_in_bits = g->builtin_types.entry_usize->size_in_bits;
test/stage1/behavior.zig+1
......@@ -54,6 +54,7 @@ comptime {
5454 _ = @import("behavior/bugs/5474.zig");
5555 _ = @import("behavior/bugs/5487.zig");
5656 _ = @import("behavior/bugs/6781.zig");
57 _ = @import("behavior/bugs/6850.zig");
5758 _ = @import("behavior/bugs/394.zig");
5859 _ = @import("behavior/bugs/421.zig");
5960 _ = @import("behavior/bugs/529.zig");
test/stage1/behavior/bugs/6850.zig created+12
......@@ -0,0 +1,12 @@
1const std = @import("std");
2
3test "lazy sizeof comparison with zero" {
4 const Empty = struct {};
5 const T = *Empty;
6
7 std.testing.expect(hasNoBits(T));
8}
9
10fn hasNoBits(comptime T: type) bool {
11 return @sizeOf(T) == 0;
12}