| author | |
| committer | |
| log | b3314a8be6c902c4da3ccef4b29f2ca3ae22061c |
| tree | 4e4fbd8c5ba1f036d0bd6172c806e09a5cc2d18b |
| parent | 85dd5746bdcbe655132df61ca4556c72711d12d7 |
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 #68503 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 | 6821 | TypeStructField *field = find_struct_type_field(isf->inferred_struct_type, isf->field_name); |
| 6822 | 6822 | assert(field != nullptr); |
| 6823 | 6823 | if (field->is_comptime) { |
| 6824 | ty->data.pointer.resolve_loop_flag_zero_bits = false; | |
| 6825 | ||
| 6824 | 6826 | ty->abi_size = 0; |
| 6825 | 6827 | ty->size_in_bits = 0; |
| 6826 | 6828 | ty->abi_align = 0; |
| 6829 | ||
| 6827 | 6830 | return ErrorNone; |
| 6828 | 6831 | } |
| 6829 | 6832 | elem_type = field->type_entry; |
| ... | ... | @@ -6835,6 +6838,8 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) { |
| 6835 | 6838 | if ((err = type_has_bits2(g, elem_type, &has_bits))) |
| 6836 | 6839 | return err; |
| 6837 | 6840 | |
| 6841 | ty->data.pointer.resolve_loop_flag_zero_bits = false; | |
| 6842 | ||
| 6838 | 6843 | if (has_bits) { |
| 6839 | 6844 | ty->abi_size = g->builtin_types.entry_usize->abi_size; |
| 6840 | 6845 | ty->size_in_bits = g->builtin_types.entry_usize->size_in_bits; |
test/stage1/behavior.zig+1| ... | ... | @@ -54,6 +54,7 @@ comptime { |
| 54 | 54 | _ = @import("behavior/bugs/5474.zig"); |
| 55 | 55 | _ = @import("behavior/bugs/5487.zig"); |
| 56 | 56 | _ = @import("behavior/bugs/6781.zig"); |
| 57 | _ = @import("behavior/bugs/6850.zig"); | |
| 57 | 58 | _ = @import("behavior/bugs/394.zig"); |
| 58 | 59 | _ = @import("behavior/bugs/421.zig"); |
| 59 | 60 | _ = @import("behavior/bugs/529.zig"); |
test/stage1/behavior/bugs/6850.zig created+12| ... | ... | @@ -0,0 +1,12 @@ |
| 1 | const std = @import("std"); | |
| 2 | ||
| 3 | test "lazy sizeof comparison with zero" { | |
| 4 | const Empty = struct {}; | |
| 5 | const T = *Empty; | |
| 6 | ||
| 7 | std.testing.expect(hasNoBits(T)); | |
| 8 | } | |
| 9 | ||
| 10 | fn hasNoBits(comptime T: type) bool { | |
| 11 | return @sizeOf(T) == 0; | |
| 12 | } |