aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-09-13 13:01:42 -0400
committerGitHub <noreply@github.com>2022-09-13 13:01:42 -0400
commitc25ce5bba0d00283ad4de9077dba5a8d5255b619 (patch)
treecc4bdb8332acdde7b23bffacfc42bffaa6d35273 /src/type.zig
parentbe944870298e4694e8ccb3f8c65a0bd152e26dad (diff)
parentb2e94de3585e0a1242e3a5d6c8fd331da9f2d4f5 (diff)
downloadzig-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.zig25
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,
}