| ... | ... | @@ -2691,31 +2691,41 @@ pub const Type = extern union { |
| 2691 | 2691 | |
| 2692 | 2692 | /// Returns 0 for 0-bit types. |
| 2693 | 2693 | pub fn abiAlignment(ty: Type, target: Target) u32 { |
| 2694 | | return ty.abiAlignmentAdvanced(target, .eager).scalar; |
| 2694 | return (ty.abiAlignmentAdvanced(target, .eager) catch unreachable).scalar; |
| 2695 | 2695 | } |
| 2696 | 2696 | |
| 2697 | 2697 | /// May capture a reference to `ty`. |
| 2698 | 2698 | pub fn lazyAbiAlignment(ty: Type, target: Target, arena: Allocator) !Value { |
| 2699 | | switch (ty.abiAlignmentAdvanced(target, .{ .lazy = arena })) { |
| 2700 | | .val => |val| return try val, |
| 2699 | switch (try ty.abiAlignmentAdvanced(target, .{ .lazy = arena })) { |
| 2700 | .val => |val| return val, |
| 2701 | 2701 | .scalar => |x| return Value.Tag.int_u64.create(arena, x), |
| 2702 | 2702 | } |
| 2703 | 2703 | } |
| 2704 | 2704 | |
| 2705 | const AbiAlignmentAdvanced = union(enum) { |
| 2706 | scalar: u32, |
| 2707 | val: Value, |
| 2708 | }; |
| 2709 | |
| 2705 | 2710 | /// If you pass `eager` you will get back `scalar` and assert the type is resolved. |
| 2711 | /// In this case there will be no error, guaranteed. |
| 2706 | 2712 | /// If you pass `lazy` you may get back `scalar` or `val`. |
| 2707 | 2713 | /// If `val` is returned, a reference to `ty` has been captured. |
| 2708 | | fn abiAlignmentAdvanced( |
| 2714 | /// If you pass `sema_kit` you will get back `scalar` and resolve the type if |
| 2715 | /// necessary, possibly returning a CompileError. |
| 2716 | pub fn abiAlignmentAdvanced( |
| 2709 | 2717 | ty: Type, |
| 2710 | 2718 | target: Target, |
| 2711 | 2719 | strat: union(enum) { |
| 2712 | 2720 | eager, |
| 2713 | 2721 | lazy: Allocator, |
| 2722 | sema_kit: Module.WipAnalysis, |
| 2714 | 2723 | }, |
| 2715 | | ) union(enum) { |
| 2716 | | scalar: u32, |
| 2717 | | val: Allocator.Error!Value, |
| 2718 | | } { |
| 2724 | ) Module.CompileError!AbiAlignmentAdvanced { |
| 2725 | const sema_kit = switch (strat) { |
| 2726 | .sema_kit => |sk| sk, |
| 2727 | else => null, |
| 2728 | }; |
| 2719 | 2729 | return switch (ty.tag()) { |
| 2720 | 2730 | .u1, |
| 2721 | 2731 | .u8, |
| ... | ... | @@ -2735,25 +2745,25 @@ pub const Type = extern union { |
| 2735 | 2745 | .extern_options, |
| 2736 | 2746 | .@"opaque", |
| 2737 | 2747 | .anyopaque, |
| 2738 | | => return .{ .scalar = 1 }, |
| 2748 | => return AbiAlignmentAdvanced{ .scalar = 1 }, |
| 2739 | 2749 | |
| 2740 | 2750 | .fn_noreturn_no_args, // represents machine code; not a pointer |
| 2741 | 2751 | .fn_void_no_args, // represents machine code; not a pointer |
| 2742 | 2752 | .fn_naked_noreturn_no_args, // represents machine code; not a pointer |
| 2743 | 2753 | .fn_ccc_void_no_args, // represents machine code; not a pointer |
| 2744 | | => return .{ .scalar = target_util.defaultFunctionAlignment(target) }, |
| 2754 | => return AbiAlignmentAdvanced{ .scalar = target_util.defaultFunctionAlignment(target) }, |
| 2745 | 2755 | |
| 2746 | 2756 | // represents machine code; not a pointer |
| 2747 | 2757 | .function => { |
| 2748 | 2758 | const alignment = ty.castTag(.function).?.data.alignment; |
| 2749 | | if (alignment != 0) return .{ .scalar = alignment }; |
| 2750 | | return .{ .scalar = target_util.defaultFunctionAlignment(target) }; |
| 2759 | if (alignment != 0) return AbiAlignmentAdvanced{ .scalar = alignment }; |
| 2760 | return AbiAlignmentAdvanced{ .scalar = target_util.defaultFunctionAlignment(target) }; |
| 2751 | 2761 | }, |
| 2752 | 2762 | |
| 2753 | | .i16, .u16 => return .{ .scalar = 2 }, |
| 2754 | | .i32, .u32 => return .{ .scalar = 4 }, |
| 2755 | | .i64, .u64 => return .{ .scalar = 8 }, |
| 2756 | | .u128, .i128 => return .{ .scalar = 16 }, |
| 2763 | .i16, .u16 => return AbiAlignmentAdvanced{ .scalar = 2 }, |
| 2764 | .i32, .u32 => return AbiAlignmentAdvanced{ .scalar = 4 }, |
| 2765 | .i64, .u64 => return AbiAlignmentAdvanced{ .scalar = 8 }, |
| 2766 | .u128, .i128 => return AbiAlignmentAdvanced{ .scalar = 16 }, |
| 2757 | 2767 | |
| 2758 | 2768 | .isize, |
| 2759 | 2769 | .usize, |
| ... | ... | @@ -2776,40 +2786,40 @@ pub const Type = extern union { |
| 2776 | 2786 | .manyptr_const_u8_sentinel_0, |
| 2777 | 2787 | .@"anyframe", |
| 2778 | 2788 | .anyframe_T, |
| 2779 | | => return .{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }, |
| 2780 | | |
| 2781 | | .c_short => return .{ .scalar = @divExact(CType.short.sizeInBits(target), 8) }, |
| 2782 | | .c_ushort => return .{ .scalar = @divExact(CType.ushort.sizeInBits(target), 8) }, |
| 2783 | | .c_int => return .{ .scalar = @divExact(CType.int.sizeInBits(target), 8) }, |
| 2784 | | .c_uint => return .{ .scalar = @divExact(CType.uint.sizeInBits(target), 8) }, |
| 2785 | | .c_long => return .{ .scalar = @divExact(CType.long.sizeInBits(target), 8) }, |
| 2786 | | .c_ulong => return .{ .scalar = @divExact(CType.ulong.sizeInBits(target), 8) }, |
| 2787 | | .c_longlong => return .{ .scalar = @divExact(CType.longlong.sizeInBits(target), 8) }, |
| 2788 | | .c_ulonglong => return .{ .scalar = @divExact(CType.ulonglong.sizeInBits(target), 8) }, |
| 2789 | | |
| 2790 | | .f16 => return .{ .scalar = 2 }, |
| 2791 | | .f32 => return .{ .scalar = 4 }, |
| 2792 | | .f64 => return .{ .scalar = 8 }, |
| 2793 | | .f128 => return .{ .scalar = 16 }, |
| 2789 | => return AbiAlignmentAdvanced{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }, |
| 2790 | |
| 2791 | .c_short => return AbiAlignmentAdvanced{ .scalar = @divExact(CType.short.sizeInBits(target), 8) }, |
| 2792 | .c_ushort => return AbiAlignmentAdvanced{ .scalar = @divExact(CType.ushort.sizeInBits(target), 8) }, |
| 2793 | .c_int => return AbiAlignmentAdvanced{ .scalar = @divExact(CType.int.sizeInBits(target), 8) }, |
| 2794 | .c_uint => return AbiAlignmentAdvanced{ .scalar = @divExact(CType.uint.sizeInBits(target), 8) }, |
| 2795 | .c_long => return AbiAlignmentAdvanced{ .scalar = @divExact(CType.long.sizeInBits(target), 8) }, |
| 2796 | .c_ulong => return AbiAlignmentAdvanced{ .scalar = @divExact(CType.ulong.sizeInBits(target), 8) }, |
| 2797 | .c_longlong => return AbiAlignmentAdvanced{ .scalar = @divExact(CType.longlong.sizeInBits(target), 8) }, |
| 2798 | .c_ulonglong => return AbiAlignmentAdvanced{ .scalar = @divExact(CType.ulonglong.sizeInBits(target), 8) }, |
| 2799 | |
| 2800 | .f16 => return AbiAlignmentAdvanced{ .scalar = 2 }, |
| 2801 | .f32 => return AbiAlignmentAdvanced{ .scalar = 4 }, |
| 2802 | .f64 => return AbiAlignmentAdvanced{ .scalar = 8 }, |
| 2803 | .f128 => return AbiAlignmentAdvanced{ .scalar = 16 }, |
| 2794 | 2804 | |
| 2795 | 2805 | .f80 => switch (target.cpu.arch) { |
| 2796 | | .i386 => return .{ .scalar = 4 }, |
| 2797 | | .x86_64 => return .{ .scalar = 16 }, |
| 2806 | .i386 => return AbiAlignmentAdvanced{ .scalar = 4 }, |
| 2807 | .x86_64 => return AbiAlignmentAdvanced{ .scalar = 16 }, |
| 2798 | 2808 | else => { |
| 2799 | 2809 | var payload: Payload.Bits = .{ |
| 2800 | 2810 | .base = .{ .tag = .int_unsigned }, |
| 2801 | 2811 | .data = 80, |
| 2802 | 2812 | }; |
| 2803 | 2813 | const u80_ty = initPayload(&payload.base); |
| 2804 | | return .{ .scalar = abiAlignment(u80_ty, target) }; |
| 2814 | return AbiAlignmentAdvanced{ .scalar = abiAlignment(u80_ty, target) }; |
| 2805 | 2815 | }, |
| 2806 | 2816 | }, |
| 2807 | 2817 | .c_longdouble => switch (CType.longdouble.sizeInBits(target)) { |
| 2808 | | 16 => return .{ .scalar = abiAlignment(Type.f16, target) }, |
| 2809 | | 32 => return .{ .scalar = abiAlignment(Type.f32, target) }, |
| 2810 | | 64 => return .{ .scalar = abiAlignment(Type.f64, target) }, |
| 2811 | | 80 => return .{ .scalar = abiAlignment(Type.f80, target) }, |
| 2812 | | 128 => return .{ .scalar = abiAlignment(Type.f128, target) }, |
| 2818 | 16 => return AbiAlignmentAdvanced{ .scalar = abiAlignment(Type.f16, target) }, |
| 2819 | 32 => return AbiAlignmentAdvanced{ .scalar = abiAlignment(Type.f32, target) }, |
| 2820 | 64 => return AbiAlignmentAdvanced{ .scalar = abiAlignment(Type.f64, target) }, |
| 2821 | 80 => return AbiAlignmentAdvanced{ .scalar = abiAlignment(Type.f80, target) }, |
| 2822 | 128 => return AbiAlignmentAdvanced{ .scalar = abiAlignment(Type.f128, target) }, |
| 2813 | 2823 | else => unreachable, |
| 2814 | 2824 | }, |
| 2815 | 2825 | |
| ... | ... | @@ -2819,22 +2829,22 @@ pub const Type = extern union { |
| 2819 | 2829 | .anyerror, |
| 2820 | 2830 | .error_set_inferred, |
| 2821 | 2831 | .error_set_merged, |
| 2822 | | => return .{ .scalar = 2 }, // TODO revisit this when we have the concept of the error tag type |
| 2832 | => return AbiAlignmentAdvanced{ .scalar = 2 }, // TODO revisit this when we have the concept of the error tag type |
| 2823 | 2833 | |
| 2824 | 2834 | .array, .array_sentinel => return ty.elemType().abiAlignmentAdvanced(target, strat), |
| 2825 | 2835 | |
| 2826 | 2836 | // TODO audit this - is there any more complicated logic to determine |
| 2827 | 2837 | // ABI alignment of vectors? |
| 2828 | | .vector => return .{ .scalar = 16 }, |
| 2838 | .vector => return AbiAlignmentAdvanced{ .scalar = 16 }, |
| 2829 | 2839 | |
| 2830 | 2840 | .int_signed, .int_unsigned => { |
| 2831 | 2841 | const bits: u16 = ty.cast(Payload.Bits).?.data; |
| 2832 | | if (bits == 0) return .{ .scalar = 0 }; |
| 2833 | | if (bits <= 8) return .{ .scalar = 1 }; |
| 2834 | | if (bits <= 16) return .{ .scalar = 2 }; |
| 2835 | | if (bits <= 32) return .{ .scalar = 4 }; |
| 2836 | | if (bits <= 64) return .{ .scalar = 8 }; |
| 2837 | | return .{ .scalar = 16 }; |
| 2842 | if (bits == 0) return AbiAlignmentAdvanced{ .scalar = 0 }; |
| 2843 | if (bits <= 8) return AbiAlignmentAdvanced{ .scalar = 1 }; |
| 2844 | if (bits <= 16) return AbiAlignmentAdvanced{ .scalar = 2 }; |
| 2845 | if (bits <= 32) return AbiAlignmentAdvanced{ .scalar = 4 }; |
| 2846 | if (bits <= 64) return AbiAlignmentAdvanced{ .scalar = 8 }; |
| 2847 | return AbiAlignmentAdvanced{ .scalar = 16 }; |
| 2838 | 2848 | }, |
| 2839 | 2849 | |
| 2840 | 2850 | .optional => { |
| ... | ... | @@ -2842,17 +2852,19 @@ pub const Type = extern union { |
| 2842 | 2852 | const child_type = ty.optionalChild(&buf); |
| 2843 | 2853 | |
| 2844 | 2854 | if (child_type.zigTypeTag() == .Pointer and !child_type.isCPtr()) { |
| 2845 | | return .{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }; |
| 2855 | return AbiAlignmentAdvanced{ .scalar = @divExact(target.cpu.arch.ptrBitWidth(), 8) }; |
| 2846 | 2856 | } |
| 2847 | 2857 | |
| 2848 | 2858 | switch (strat) { |
| 2849 | | .eager => { |
| 2850 | | if (!child_type.hasRuntimeBits()) return .{ .scalar = 1 }; |
| 2851 | | return .{ .scalar = child_type.abiAlignment(target) }; |
| 2859 | .eager, .sema_kit => { |
| 2860 | if (!(try child_type.hasRuntimeBitsAdvanced(false, sema_kit))) { |
| 2861 | return AbiAlignmentAdvanced{ .scalar = 1 }; |
| 2862 | } |
| 2863 | return child_type.abiAlignmentAdvanced(target, strat); |
| 2852 | 2864 | }, |
| 2853 | | .lazy => |arena| switch (child_type.abiAlignmentAdvanced(target, strat)) { |
| 2854 | | .scalar => |x| return .{ .scalar = @maximum(x, 1) }, |
| 2855 | | .val => return .{ .val = Value.Tag.lazy_align.create(arena, ty) }, |
| 2865 | .lazy => |arena| switch (try child_type.abiAlignmentAdvanced(target, strat)) { |
| 2866 | .scalar => |x| return AbiAlignmentAdvanced{ .scalar = @maximum(x, 1) }, |
| 2867 | .val => return AbiAlignmentAdvanced{ .val = try Value.Tag.lazy_align.create(arena, ty) }, |
| 2856 | 2868 | }, |
| 2857 | 2869 | } |
| 2858 | 2870 | }, |
| ... | ... | @@ -2860,60 +2872,64 @@ pub const Type = extern union { |
| 2860 | 2872 | .error_union => { |
| 2861 | 2873 | const data = ty.castTag(.error_union).?.data; |
| 2862 | 2874 | switch (strat) { |
| 2863 | | .eager => { |
| 2864 | | if (!data.error_set.hasRuntimeBits()) { |
| 2865 | | return .{ .scalar = data.payload.abiAlignment(target) }; |
| 2866 | | } else if (!data.payload.hasRuntimeBits()) { |
| 2867 | | return .{ .scalar = data.error_set.abiAlignment(target) }; |
| 2875 | .eager, .sema_kit => { |
| 2876 | if (!(try data.error_set.hasRuntimeBitsAdvanced(false, sema_kit))) { |
| 2877 | return data.payload.abiAlignmentAdvanced(target, strat); |
| 2878 | } else if (!(try data.payload.hasRuntimeBitsAdvanced(false, sema_kit))) { |
| 2879 | return data.error_set.abiAlignmentAdvanced(target, strat); |
| 2868 | 2880 | } |
| 2869 | | return .{ .scalar = @maximum( |
| 2870 | | data.payload.abiAlignment(target), |
| 2871 | | data.error_set.abiAlignment(target), |
| 2881 | return AbiAlignmentAdvanced{ .scalar = @maximum( |
| 2882 | (try data.payload.abiAlignmentAdvanced(target, strat)).scalar, |
| 2883 | (try data.error_set.abiAlignmentAdvanced(target, strat)).scalar, |
| 2872 | 2884 | ) }; |
| 2873 | 2885 | }, |
| 2874 | 2886 | .lazy => |arena| { |
| 2875 | | switch (data.payload.abiAlignmentAdvanced(target, strat)) { |
| 2887 | switch (try data.payload.abiAlignmentAdvanced(target, strat)) { |
| 2876 | 2888 | .scalar => |payload_align| { |
| 2877 | 2889 | if (payload_align == 0) { |
| 2878 | 2890 | return data.error_set.abiAlignmentAdvanced(target, strat); |
| 2879 | 2891 | } |
| 2880 | | switch (data.error_set.abiAlignmentAdvanced(target, strat)) { |
| 2892 | switch (try data.error_set.abiAlignmentAdvanced(target, strat)) { |
| 2881 | 2893 | .scalar => |err_set_align| { |
| 2882 | | return .{ .scalar = @maximum(payload_align, err_set_align) }; |
| 2894 | return AbiAlignmentAdvanced{ .scalar = @maximum(payload_align, err_set_align) }; |
| 2883 | 2895 | }, |
| 2884 | 2896 | .val => {}, |
| 2885 | 2897 | } |
| 2886 | 2898 | }, |
| 2887 | 2899 | .val => {}, |
| 2888 | 2900 | } |
| 2889 | | return .{ .val = Value.Tag.lazy_align.create(arena, ty) }; |
| 2901 | return AbiAlignmentAdvanced{ .val = try Value.Tag.lazy_align.create(arena, ty) }; |
| 2890 | 2902 | }, |
| 2891 | 2903 | } |
| 2892 | 2904 | }, |
| 2893 | 2905 | |
| 2894 | 2906 | .@"struct" => { |
| 2907 | if (sema_kit) |sk| { |
| 2908 | try sk.sema.resolveTypeLayout(sk.block, sk.src, ty); |
| 2909 | } |
| 2895 | 2910 | if (ty.castTag(.@"struct")) |payload| { |
| 2896 | 2911 | const struct_obj = payload.data; |
| 2897 | 2912 | if (!struct_obj.haveLayout()) switch (strat) { |
| 2898 | 2913 | .eager => unreachable, // struct layout not resolved |
| 2899 | | .lazy => |arena| return .{ .val = Value.Tag.lazy_align.create(arena, ty) }, |
| 2914 | .sema_kit => unreachable, // handled above |
| 2915 | .lazy => |arena| return AbiAlignmentAdvanced{ .val = try Value.Tag.lazy_align.create(arena, ty) }, |
| 2900 | 2916 | }; |
| 2901 | 2917 | if (struct_obj.layout == .Packed) { |
| 2902 | 2918 | var buf: Type.Payload.Bits = undefined; |
| 2903 | 2919 | const int_ty = struct_obj.packedIntegerType(target, &buf); |
| 2904 | | return .{ .scalar = int_ty.abiAlignment(target) }; |
| 2920 | return AbiAlignmentAdvanced{ .scalar = int_ty.abiAlignment(target) }; |
| 2905 | 2921 | } |
| 2906 | 2922 | } |
| 2907 | 2923 | |
| 2908 | 2924 | const fields = ty.structFields(); |
| 2909 | 2925 | var big_align: u32 = 0; |
| 2910 | 2926 | for (fields.values()) |field| { |
| 2911 | | if (!field.ty.hasRuntimeBits()) continue; |
| 2927 | if (!(try field.ty.hasRuntimeBitsAdvanced(false, sema_kit))) continue; |
| 2912 | 2928 | |
| 2913 | 2929 | const field_align = field.normalAlignment(target); |
| 2914 | 2930 | big_align = @maximum(big_align, field_align); |
| 2915 | 2931 | } |
| 2916 | | return .{ .scalar = big_align }; |
| 2932 | return AbiAlignmentAdvanced{ .scalar = big_align }; |
| 2917 | 2933 | }, |
| 2918 | 2934 | |
| 2919 | 2935 | .tuple, .anon_struct => { |
| ... | ... | @@ -2923,34 +2939,41 @@ pub const Type = extern union { |
| 2923 | 2939 | const val = tuple.values[i]; |
| 2924 | 2940 | if (val.tag() != .unreachable_value) continue; // comptime field |
| 2925 | 2941 | |
| 2926 | | switch (field_ty.abiAlignmentAdvanced(target, strat)) { |
| 2942 | switch (try field_ty.abiAlignmentAdvanced(target, strat)) { |
| 2927 | 2943 | .scalar => |field_align| big_align = @maximum(big_align, field_align), |
| 2928 | 2944 | .val => switch (strat) { |
| 2929 | 2945 | .eager => unreachable, // field type alignment not resolved |
| 2930 | | .lazy => |arena| return .{ .val = Value.Tag.lazy_align.create(arena, ty) }, |
| 2946 | .sema_kit => unreachable, // passed to abiAlignmentAdvanced above |
| 2947 | .lazy => |arena| return AbiAlignmentAdvanced{ .val = try Value.Tag.lazy_align.create(arena, ty) }, |
| 2931 | 2948 | }, |
| 2932 | 2949 | } |
| 2933 | 2950 | } |
| 2934 | | return .{ .scalar = big_align }; |
| 2951 | return AbiAlignmentAdvanced{ .scalar = big_align }; |
| 2935 | 2952 | }, |
| 2936 | 2953 | |
| 2937 | 2954 | .enum_full, .enum_nonexhaustive, .enum_simple, .enum_numbered => { |
| 2938 | 2955 | var buffer: Payload.Bits = undefined; |
| 2939 | 2956 | const int_tag_ty = ty.intTagType(&buffer); |
| 2940 | | return .{ .scalar = int_tag_ty.abiAlignment(target) }; |
| 2957 | return AbiAlignmentAdvanced{ .scalar = int_tag_ty.abiAlignment(target) }; |
| 2941 | 2958 | }, |
| 2942 | 2959 | .@"union" => switch (strat) { |
| 2943 | | .eager => { |
| 2960 | .eager, .sema_kit => { |
| 2961 | if (sema_kit) |sk| { |
| 2962 | try sk.sema.resolveTypeLayout(sk.block, sk.src, ty); |
| 2963 | } |
| 2944 | 2964 | // TODO pass `true` for have_tag when unions have a safety tag |
| 2945 | | return .{ .scalar = ty.castTag(.@"union").?.data.abiAlignment(target, false) }; |
| 2965 | return AbiAlignmentAdvanced{ .scalar = ty.castTag(.@"union").?.data.abiAlignment(target, false) }; |
| 2946 | 2966 | }, |
| 2947 | | .lazy => |arena| return .{ .val = Value.Tag.lazy_align.create(arena, ty) }, |
| 2967 | .lazy => |arena| return AbiAlignmentAdvanced{ .val = try Value.Tag.lazy_align.create(arena, ty) }, |
| 2948 | 2968 | }, |
| 2949 | 2969 | .union_tagged => switch (strat) { |
| 2950 | | .eager => { |
| 2951 | | return .{ .scalar = ty.castTag(.union_tagged).?.data.abiAlignment(target, true) }; |
| 2970 | .eager, .sema_kit => { |
| 2971 | if (sema_kit) |sk| { |
| 2972 | try sk.sema.resolveTypeLayout(sk.block, sk.src, ty); |
| 2973 | } |
| 2974 | return AbiAlignmentAdvanced{ .scalar = ty.castTag(.union_tagged).?.data.abiAlignment(target, true) }; |
| 2952 | 2975 | }, |
| 2953 | | .lazy => |arena| return .{ .val = Value.Tag.lazy_align.create(arena, ty) }, |
| 2976 | .lazy => |arena| return AbiAlignmentAdvanced{ .val = try Value.Tag.lazy_align.create(arena, ty) }, |
| 2954 | 2977 | }, |
| 2955 | 2978 | |
| 2956 | 2979 | .empty_struct, |
| ... | ... | @@ -2963,7 +2986,7 @@ pub const Type = extern union { |
| 2963 | 2986 | .@"undefined", |
| 2964 | 2987 | .enum_literal, |
| 2965 | 2988 | .type_info, |
| 2966 | | => return .{ .scalar = 0 }, |
| 2989 | => return AbiAlignmentAdvanced{ .scalar = 0 }, |
| 2967 | 2990 | |
| 2968 | 2991 | .noreturn, |
| 2969 | 2992 | .inferred_alloc_const, |