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) {...@@ -6821,9 +6821,12 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {
6821 TypeStructField *field = find_struct_type_field(isf->inferred_struct_type, isf->field_name);6821 TypeStructField *field = find_struct_type_field(isf->inferred_struct_type, isf->field_name);
6822 assert(field != nullptr);6822 assert(field != nullptr);
6823 if (field->is_comptime) {6823 if (field->is_comptime) {
6824 ty->data.pointer.resolve_loop_flag_zero_bits = false;
6825
6824 ty->abi_size = 0;6826 ty->abi_size = 0;
6825 ty->size_in_bits = 0;6827 ty->size_in_bits = 0;
6826 ty->abi_align = 0;6828 ty->abi_align = 0;
6829
6827 return ErrorNone;6830 return ErrorNone;
6828 }6831 }
6829 elem_type = field->type_entry;6832 elem_type = field->type_entry;
...@@ -6835,6 +6838,8 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {...@@ -6835,6 +6838,8 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {
6835 if ((err = type_has_bits2(g, elem_type, &has_bits)))6838 if ((err = type_has_bits2(g, elem_type, &has_bits)))
6836 return err;6839 return err;
68376840
6841 ty->data.pointer.resolve_loop_flag_zero_bits = false;
6842
6838 if (has_bits) {6843 if (has_bits) {
6839 ty->abi_size = g->builtin_types.entry_usize->abi_size;6844 ty->abi_size = g->builtin_types.entry_usize->abi_size;
6840 ty->size_in_bits = g->builtin_types.entry_usize->size_in_bits;6845 ty->size_in_bits = g->builtin_types.entry_usize->size_in_bits;
test/stage1/behavior.zig+1
...@@ -54,6 +54,7 @@ comptime {...@@ -54,6 +54,7 @@ comptime {
54 _ = @import("behavior/bugs/5474.zig");54 _ = @import("behavior/bugs/5474.zig");
55 _ = @import("behavior/bugs/5487.zig");55 _ = @import("behavior/bugs/5487.zig");
56 _ = @import("behavior/bugs/6781.zig");56 _ = @import("behavior/bugs/6781.zig");
57 _ = @import("behavior/bugs/6850.zig");
57 _ = @import("behavior/bugs/394.zig");58 _ = @import("behavior/bugs/394.zig");
58 _ = @import("behavior/bugs/421.zig");59 _ = @import("behavior/bugs/421.zig");
59 _ = @import("behavior/bugs/529.zig");60 _ = @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}