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
signaturelock-open 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 {...@@ -1124,6 +1124,7 @@ struct ZigTypePointer {
1124 bool is_const;1124 bool is_const;
1125 bool is_volatile;1125 bool is_volatile;
1126 bool allow_zero;1126 bool allow_zero;
1127 bool resolve_loop_flag_zero_bits;
1127};1128};
11281129
1129struct ZigTypeInt {1130struct ZigTypeInt {
src/analyze.cpp+15-1
...@@ -983,7 +983,9 @@ static Error type_val_resolve_zero_bits(CodeGen *g, ConstExprValue *type_val, Zi...@@ -983,7 +983,9 @@ static Error type_val_resolve_zero_bits(CodeGen *g, ConstExprValue *type_val, Zi
983 if ((type_val->data.x_type->id == ZigTypeIdStruct &&983 if ((type_val->data.x_type->id == ZigTypeIdStruct &&
984 type_val->data.x_type->data.structure.resolve_loop_flag_zero_bits) ||984 type_val->data.x_type->data.structure.resolve_loop_flag_zero_bits) ||
985 (type_val->data.x_type->id == ZigTypeIdUnion &&985 (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))
987 {989 {
988 // Does a struct/union which contains a pointer field to itself have bits? Yes.990 // Does a struct/union which contains a pointer field to itself have bits? Yes.
989 *is_zero_bits = false;991 *is_zero_bits = false;
...@@ -1105,6 +1107,10 @@ Error type_val_resolve_abi_align(CodeGen *g, ConstExprValue *type_val, uint32_t...@@ -1105,6 +1107,10 @@ Error type_val_resolve_abi_align(CodeGen *g, ConstExprValue *type_val, uint32_t
1105 if (type_val->special != ConstValSpecialLazy) {1107 if (type_val->special != ConstValSpecialLazy) {
1106 assert(type_val->special == ConstValSpecialStatic);1108 assert(type_val->special == ConstValSpecialStatic);
1107 ZigType *ty = type_val->data.x_type;1109 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 }
1108 if ((err = type_resolve(g, ty, ResolveStatusAlignmentKnown)))1114 if ((err = type_resolve(g, ty, ResolveStatusAlignmentKnown)))
1109 return err;1115 return err;
1110 *abi_align = ty->abi_align;1116 *abi_align = ty->abi_align;
...@@ -5611,6 +5617,14 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {...@@ -5611,6 +5617,14 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {
5611 if (ty->abi_size != SIZE_MAX)5617 if (ty->abi_size != SIZE_MAX)
5612 return ErrorNone;5618 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
5614 ZigType *elem_type = ty->data.pointer.child_type;5628 ZigType *elem_type = ty->data.pointer.child_type;
56155629
5616 if ((err = type_resolve(g, elem_type, ResolveStatusZeroBitsKnown)))5630 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...@@ -9367,6 +9367,14 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, ZigType *wanted
9367 result.id = ConstCastResultIdInvalid;9367 result.id = ConstCastResultIdInvalid;
9368 return result;9368 return result;
9369 }9369 }
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 }
9370 bool ptr_lens_equal = actual_ptr_type->data.pointer.ptr_len == wanted_ptr_type->data.pointer.ptr_len;9378 bool ptr_lens_equal = actual_ptr_type->data.pointer.ptr_len == wanted_ptr_type->data.pointer.ptr_len;
9371 if ((ptr_lens_equal || wanted_is_c_ptr || actual_is_c_ptr) &&9379 if ((ptr_lens_equal || wanted_is_c_ptr || actual_is_c_ptr) &&
9372 type_has_bits(wanted_type) == type_has_bits(actual_type) &&9380 type_has_bits(wanted_type) == type_has_bits(actual_type) &&