authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-26 10:43:07-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-26 10:43:07-04:00
loge1a4bcbdfd338d85f55aa8da318e203b299a2b91
tree4daacb85e4125b6c5f18684cb7f69b8c0395ecb4
parentede0c22a6796600cfc4555e9ac2f0481c41c290a
signature Commit is signed but in an unrecognized format.

fix dependency loop errors with zig build


3 files changed, 24 insertions(+), 1 deletions(-)

src/all_types.hpp+1
......@@ -1124,6 +1124,7 @@ struct ZigTypePointer {
11241124 bool is_const;
11251125 bool is_volatile;
11261126 bool allow_zero;
1127 bool resolve_loop_flag_zero_bits;
11271128};
11281129
11291130struct ZigTypeInt {
src/analyze.cpp+15-1
......@@ -983,7 +983,9 @@ static Error type_val_resolve_zero_bits(CodeGen *g, ConstExprValue *type_val, Zi
983983 if ((type_val->data.x_type->id == ZigTypeIdStruct &&
984984 type_val->data.x_type->data.structure.resolve_loop_flag_zero_bits) ||
985985 (type_val->data.x_type->id == ZigTypeIdUnion &&
986 type_val->data.x_type->data.unionation.resolve_loop_flag_zero_bits))
986 type_val->data.x_type->data.unionation.resolve_loop_flag_zero_bits) ||
987 (type_val->data.x_type->id == ZigTypeIdPointer &&
988 type_val->data.x_type->data.pointer.resolve_loop_flag_zero_bits))
987989 {
988990 // Does a struct/union which contains a pointer field to itself have bits? Yes.
989991 *is_zero_bits = false;
......@@ -1105,6 +1107,10 @@ Error type_val_resolve_abi_align(CodeGen *g, ConstExprValue *type_val, uint32_t
11051107 if (type_val->special != ConstValSpecialLazy) {
11061108 assert(type_val->special == ConstValSpecialStatic);
11071109 ZigType *ty = type_val->data.x_type;
1110 if (ty->id == ZigTypeIdPointer) {
1111 *abi_align = g->builtin_types.entry_usize->abi_align;
1112 return ErrorNone;
1113 }
11081114 if ((err = type_resolve(g, ty, ResolveStatusAlignmentKnown)))
11091115 return err;
11101116 *abi_align = ty->abi_align;
......@@ -5611,6 +5617,14 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {
56115617 if (ty->abi_size != SIZE_MAX)
56125618 return ErrorNone;
56135619
5620 if (ty->data.pointer.resolve_loop_flag_zero_bits) {
5621 ty->abi_size = g->builtin_types.entry_usize->abi_size;
5622 ty->size_in_bits = g->builtin_types.entry_usize->size_in_bits;
5623 ty->abi_align = g->builtin_types.entry_usize->abi_align;
5624 return ErrorNone;
5625 }
5626 ty->data.pointer.resolve_loop_flag_zero_bits = true;
5627
56145628 ZigType *elem_type = ty->data.pointer.child_type;
56155629
56165630 if ((err = type_resolve(g, elem_type, ResolveStatusZeroBitsKnown)))
src/ir.cpp+8
......@@ -9367,6 +9367,14 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, ZigType *wanted
93679367 result.id = ConstCastResultIdInvalid;
93689368 return result;
93699369 }
9370 if ((err = type_resolve(g, wanted_type, ResolveStatusZeroBitsKnown))) {
9371 result.id = ConstCastResultIdInvalid;
9372 return result;
9373 }
9374 if ((err = type_resolve(g, actual_type, ResolveStatusZeroBitsKnown))) {
9375 result.id = ConstCastResultIdInvalid;
9376 return result;
9377 }
93709378 bool ptr_lens_equal = actual_ptr_type->data.pointer.ptr_len == wanted_ptr_type->data.pointer.ptr_len;
93719379 if ((ptr_lens_equal || wanted_is_c_ptr || actual_is_c_ptr) &&
93729380 type_has_bits(wanted_type) == type_has_bits(actual_type) &&