aboutsummaryrefslogtreecommitdiff
path: root/src/analyze.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/analyze.cpp')
-rw-r--r--src/analyze.cpp16
1 files changed, 15 insertions, 1 deletions
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)))