diff --git a/src/all_types.hpp b/src/all_types.hpp index 18aa6e6d65..e860b87857 100644 --- a/src/all_types.hpp +++ b/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 { diff --git a/src/analyze.cpp b/src/analyze.cpp index fc9607e264..87e40b3670 100644 --- a/src/analyze.cpp +++ b/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))) diff --git a/src/ir.cpp b/src/ir.cpp index 75f0a5e55a..bd782b4fdc 100644 --- a/src/ir.cpp +++ b/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) &&