aboutsummaryrefslogtreecommitdiff
path: root/src/stage1/analyze.cpp
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2020-10-28 22:54:10 +0100
committerVeikka Tuominen <git@vexu.eu>2020-10-29 15:41:45 +0200
commitb3314a8be6c902c4da3ccef4b29f2ca3ae22061c (patch)
tree4e4fbd8c5ba1f036d0bd6172c806e09a5cc2d18b /src/stage1/analyze.cpp
parent85dd5746bdcbe655132df61ca4556c72711d12d7 (diff)
downloadzig-b3314a8be6c902c4da3ccef4b29f2ca3ae22061c.tar.gz
zig-b3314a8be6c902c4da3ccef4b29f2ca3ae22061c.zip
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
Diffstat (limited to 'src/stage1/analyze.cpp')
-rw-r--r--src/stage1/analyze.cpp5
1 files changed, 5 insertions, 0 deletions
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;