Commit e1a4bcbdfd

Andrew Kelley <andrew@ziglang.org>
2019-08-26 16:43:07
fix dependency loop errors with zig build
1 parent ede0c22
Changed files (3)
src/all_types.hpp
@@ -1124,6 +1124,7 @@ struct ZigTypePointer {
     bool is_const;
     bool is_volatile;
     bool allow_zero;
+    bool resolve_loop_flag_zero_bits;
 };
 
 struct ZigTypeInt {
src/analyze.cpp
@@ -983,7 +983,9 @@ static Error type_val_resolve_zero_bits(CodeGen *g, ConstExprValue *type_val, Zi
         if ((type_val->data.x_type->id == ZigTypeIdStruct &&
             type_val->data.x_type->data.structure.resolve_loop_flag_zero_bits) ||
             (type_val->data.x_type->id == ZigTypeIdUnion &&
-             type_val->data.x_type->data.unionation.resolve_loop_flag_zero_bits))
+             type_val->data.x_type->data.unionation.resolve_loop_flag_zero_bits) ||
+            (type_val->data.x_type->id == ZigTypeIdPointer &&
+            type_val->data.x_type->data.pointer.resolve_loop_flag_zero_bits))
         {
             // Does a struct/union which contains a pointer field to itself have bits? Yes.
             *is_zero_bits = false;
@@ -1105,6 +1107,10 @@ Error type_val_resolve_abi_align(CodeGen *g, ConstExprValue *type_val, uint32_t
     if (type_val->special != ConstValSpecialLazy) {
         assert(type_val->special == ConstValSpecialStatic);
         ZigType *ty = type_val->data.x_type;
+        if (ty->id == ZigTypeIdPointer) {
+            *abi_align = g->builtin_types.entry_usize->abi_align;
+            return ErrorNone;
+        }
         if ((err = type_resolve(g, ty, ResolveStatusAlignmentKnown)))
             return err;
         *abi_align = ty->abi_align;
@@ -5611,6 +5617,14 @@ static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) {
     if (ty->abi_size != SIZE_MAX)
         return ErrorNone;
 
+    if (ty->data.pointer.resolve_loop_flag_zero_bits) {
+        ty->abi_size = g->builtin_types.entry_usize->abi_size;
+        ty->size_in_bits = g->builtin_types.entry_usize->size_in_bits;
+        ty->abi_align = g->builtin_types.entry_usize->abi_align;
+        return ErrorNone;
+    }
+    ty->data.pointer.resolve_loop_flag_zero_bits = true;
+
     ZigType *elem_type = ty->data.pointer.child_type;
 
     if ((err = type_resolve(g, elem_type, ResolveStatusZeroBitsKnown)))
src/ir.cpp
@@ -9367,6 +9367,14 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, ZigType *wanted
             result.id = ConstCastResultIdInvalid;
             return result;
         }
+        if ((err = type_resolve(g, wanted_type, ResolveStatusZeroBitsKnown))) {
+            result.id = ConstCastResultIdInvalid;
+            return result;
+        }
+        if ((err = type_resolve(g, actual_type, ResolveStatusZeroBitsKnown))) {
+            result.id = ConstCastResultIdInvalid;
+            return result;
+        }
         bool ptr_lens_equal = actual_ptr_type->data.pointer.ptr_len == wanted_ptr_type->data.pointer.ptr_len;
         if ((ptr_lens_equal || wanted_is_c_ptr || actual_is_c_ptr) &&
             type_has_bits(wanted_type) == type_has_bits(actual_type) &&