diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-09-13 13:01:42 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-09-13 13:01:42 -0400 |
| commit | c25ce5bba0d00283ad4de9077dba5a8d5255b619 (patch) | |
| tree | cc4bdb8332acdde7b23bffacfc42bffaa6d35273 /src/type.zig | |
| parent | be944870298e4694e8ccb3f8c65a0bd152e26dad (diff) | |
| parent | b2e94de3585e0a1242e3a5d6c8fd331da9f2d4f5 (diff) | |
| download | zig-c25ce5bba0d00283ad4de9077dba5a8d5255b619.tar.gz zig-c25ce5bba0d00283ad4de9077dba5a8d5255b619.zip | |
Merge pull request #12820 from ziglang/pointless-discard-error
introduce compile error for pointless discards
Diffstat (limited to 'src/type.zig')
| -rw-r--r-- | src/type.zig | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/src/type.zig b/src/type.zig index ec7e155d4e..c72cf2be84 100644 --- a/src/type.zig +++ b/src/type.zig @@ -2715,8 +2715,12 @@ pub const Type = extern union { } /// Returns 0 if the pointer is naturally aligned and the element type is 0-bit. - pub fn ptrAlignment(self: Type, target: Target) u32 { - switch (self.tag()) { + pub fn ptrAlignment(ty: Type, target: Target) u32 { + return ptrAlignmentAdvanced(ty, target, null) catch unreachable; + } + + pub fn ptrAlignmentAdvanced(ty: Type, target: Target, sema_kit: ?Module.WipAnalysis) !u32 { + switch (ty.tag()) { .single_const_pointer, .single_mut_pointer, .many_const_pointer, @@ -2728,8 +2732,12 @@ pub const Type = extern union { .optional_single_const_pointer, .optional_single_mut_pointer, => { - const child_type = self.cast(Payload.ElemType).?.data; - return child_type.abiAlignment(target); + const child_type = ty.cast(Payload.ElemType).?.data; + if (sema_kit) |sk| { + const res = try child_type.abiAlignmentAdvanced(target, .{ .sema_kit = sk }); + return res.scalar; + } + return (child_type.abiAlignmentAdvanced(target, .eager) catch unreachable).scalar; }, .manyptr_u8, @@ -2740,14 +2748,17 @@ pub const Type = extern union { => return 1, .pointer => { - const ptr_info = self.castTag(.pointer).?.data; + const ptr_info = ty.castTag(.pointer).?.data; if (ptr_info.@"align" != 0) { return ptr_info.@"align"; + } else if (sema_kit) |sk| { + const res = try ptr_info.pointee_type.abiAlignmentAdvanced(target, .{ .sema_kit = sk }); + return res.scalar; } else { - return ptr_info.pointee_type.abiAlignment(target); + return (ptr_info.pointee_type.abiAlignmentAdvanced(target, .eager) catch unreachable).scalar; } }, - .optional => return self.castTag(.optional).?.data.ptrAlignment(target), + .optional => return ty.castTag(.optional).?.data.ptrAlignmentAdvanced(target, sema_kit), else => unreachable, } |
