| ... | @@ -474,15 +474,21 @@ ZigType *get_pointer_to_type_extra(CodeGen *g, ZigType *child_type, bool is_cons | ... | @@ -474,15 +474,21 @@ ZigType *get_pointer_to_type_extra(CodeGen *g, ZigType *child_type, bool is_cons |
| 474 | buf_ptr(&child_type->name)); | 474 | buf_ptr(&child_type->name)); |
| 475 | } | 475 | } |
| 476 | | 476 | |
| 477 | if (type_has_bits(child_type)) { | 477 | if (type_is_resolved(child_type, ResolveStatusZeroBitsKnown)) { |
| 478 | entry->abi_size = g->builtin_types.entry_usize->abi_size; | 478 | if (type_has_bits(child_type)) { |
| 479 | entry->size_in_bits = g->builtin_types.entry_usize->size_in_bits; | 479 | entry->abi_size = g->builtin_types.entry_usize->abi_size; |
| 480 | entry->abi_align = g->builtin_types.entry_usize->abi_align; | 480 | entry->size_in_bits = g->builtin_types.entry_usize->size_in_bits; |
| | 481 | entry->abi_align = g->builtin_types.entry_usize->abi_align; |
| | 482 | } else { |
| | 483 | assert(byte_alignment == 0); |
| | 484 | entry->abi_size = 0; |
| | 485 | entry->size_in_bits = 0; |
| | 486 | entry->abi_align = 0; |
| | 487 | } |
| 481 | } else { | 488 | } else { |
| 482 | assert(byte_alignment == 0); | 489 | entry->abi_size = SIZE_MAX; |
| 483 | entry->abi_size = 0; | 490 | entry->size_in_bits = SIZE_MAX; |
| 484 | entry->size_in_bits = 0; | 491 | entry->abi_align = UINT32_MAX; |
| 485 | entry->abi_align = 0; | | |
| 486 | } | 492 | } |
| 487 | | 493 | |
| 488 | entry->data.pointer.ptr_len = ptr_len; | 494 | entry->data.pointer.ptr_len = ptr_len; |
| ... | @@ -5585,6 +5591,25 @@ static Error resolve_async_frame(CodeGen *g, ZigType *frame_type) { | ... | @@ -5585,6 +5591,25 @@ static Error resolve_async_frame(CodeGen *g, ZigType *frame_type) { |
| 5585 | return ErrorNone; | 5591 | return ErrorNone; |
| 5586 | } | 5592 | } |
| 5587 | | 5593 | |
| | 5594 | static Error resolve_pointer_zero_bits(CodeGen *g, ZigType *ty) { |
| | 5595 | Error err; |
| | 5596 | ZigType *elem_type = ty->data.pointer.child_type; |
| | 5597 | |
| | 5598 | if ((err = type_resolve(g, elem_type, ResolveStatusZeroBitsKnown))) |
| | 5599 | return err; |
| | 5600 | |
| | 5601 | if (type_has_bits(elem_type)) { |
| | 5602 | ty->abi_size = g->builtin_types.entry_usize->abi_size; |
| | 5603 | ty->size_in_bits = g->builtin_types.entry_usize->size_in_bits; |
| | 5604 | ty->abi_align = g->builtin_types.entry_usize->abi_align; |
| | 5605 | } else { |
| | 5606 | ty->abi_size = 0; |
| | 5607 | ty->size_in_bits = 0; |
| | 5608 | ty->abi_align = 0; |
| | 5609 | } |
| | 5610 | return ErrorNone; |
| | 5611 | } |
| | 5612 | |
| 5588 | Error type_resolve(CodeGen *g, ZigType *ty, ResolveStatus status) { | 5613 | Error type_resolve(CodeGen *g, ZigType *ty, ResolveStatus status) { |
| 5589 | if (type_is_invalid(ty)) | 5614 | if (type_is_invalid(ty)) |
| 5590 | return ErrorSemanticAnalyzeFail; | 5615 | return ErrorSemanticAnalyzeFail; |
| ... | @@ -5594,36 +5619,44 @@ Error type_resolve(CodeGen *g, ZigType *ty, ResolveStatus status) { | ... | @@ -5594,36 +5619,44 @@ Error type_resolve(CodeGen *g, ZigType *ty, ResolveStatus status) { |
| 5594 | case ResolveStatusInvalid: | 5619 | case ResolveStatusInvalid: |
| 5595 | zig_unreachable(); | 5620 | zig_unreachable(); |
| 5596 | case ResolveStatusZeroBitsKnown: | 5621 | case ResolveStatusZeroBitsKnown: |
| 5597 | if (ty->id == ZigTypeIdStruct) { | 5622 | switch (ty->id) { |
| 5598 | return resolve_struct_zero_bits(g, ty); | 5623 | case ZigTypeIdStruct: |
| 5599 | } else if (ty->id == ZigTypeIdEnum) { | 5624 | return resolve_struct_zero_bits(g, ty); |
| 5600 | return resolve_enum_zero_bits(g, ty); | 5625 | case ZigTypeIdEnum: |
| 5601 | } else if (ty->id == ZigTypeIdUnion) { | 5626 | return resolve_enum_zero_bits(g, ty); |
| 5602 | return resolve_union_zero_bits(g, ty); | 5627 | case ZigTypeIdUnion: |
| | 5628 | return resolve_union_zero_bits(g, ty); |
| | 5629 | case ZigTypeIdPointer: |
| | 5630 | return resolve_pointer_zero_bits(g, ty); |
| | 5631 | default: |
| | 5632 | return ErrorNone; |
| 5603 | } | 5633 | } |
| 5604 | return ErrorNone; | | |
| 5605 | case ResolveStatusAlignmentKnown: | 5634 | case ResolveStatusAlignmentKnown: |
| 5606 | if (ty->id == ZigTypeIdStruct) { | 5635 | switch (ty->id) { |
| 5607 | return resolve_struct_alignment(g, ty); | 5636 | case ZigTypeIdStruct: |
| 5608 | } else if (ty->id == ZigTypeIdEnum) { | 5637 | return resolve_struct_alignment(g, ty); |
| 5609 | return resolve_enum_zero_bits(g, ty); | 5638 | case ZigTypeIdEnum: |
| 5610 | } else if (ty->id == ZigTypeIdUnion) { | 5639 | return resolve_enum_zero_bits(g, ty); |
| 5611 | return resolve_union_alignment(g, ty); | 5640 | case ZigTypeIdUnion: |
| 5612 | } else if (ty->id == ZigTypeIdFnFrame) { | 5641 | return resolve_union_alignment(g, ty); |
| 5613 | return resolve_async_frame(g, ty); | 5642 | case ZigTypeIdFnFrame: |
| | 5643 | return resolve_async_frame(g, ty); |
| | 5644 | default: |
| | 5645 | return ErrorNone; |
| 5614 | } | 5646 | } |
| 5615 | return ErrorNone; | | |
| 5616 | case ResolveStatusSizeKnown: | 5647 | case ResolveStatusSizeKnown: |
| 5617 | if (ty->id == ZigTypeIdStruct) { | 5648 | switch (ty->id) { |
| 5618 | return resolve_struct_type(g, ty); | 5649 | case ZigTypeIdStruct: |
| 5619 | } else if (ty->id == ZigTypeIdEnum) { | 5650 | return resolve_struct_type(g, ty); |
| 5620 | return resolve_enum_zero_bits(g, ty); | 5651 | case ZigTypeIdEnum: |
| 5621 | } else if (ty->id == ZigTypeIdUnion) { | 5652 | return resolve_enum_zero_bits(g, ty); |
| 5622 | return resolve_union_type(g, ty); | 5653 | case ZigTypeIdUnion: |
| 5623 | } else if (ty->id == ZigTypeIdFnFrame) { | 5654 | return resolve_union_type(g, ty); |
| 5624 | return resolve_async_frame(g, ty); | 5655 | case ZigTypeIdFnFrame: |
| | 5656 | return resolve_async_frame(g, ty); |
| | 5657 | default: |
| | 5658 | return ErrorNone; |
| 5625 | } | 5659 | } |
| 5626 | return ErrorNone; | | |
| 5627 | case ResolveStatusLLVMFwdDecl: | 5660 | case ResolveStatusLLVMFwdDecl: |
| 5628 | case ResolveStatusLLVMFull: | 5661 | case ResolveStatusLLVMFull: |
| 5629 | resolve_llvm_types(g, ty, status); | 5662 | resolve_llvm_types(g, ty, status); |