aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-10-26 13:46:27 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-10-26 13:46:27 -0700
commitc6b3d06535f4227541c13fe75da347a485abdb4f (patch)
tree8f0a730e1dc7619168a81d2cd4521db1e7a1b4b6 /src/codegen
parent6df26a37d13d21be061a1cccd39dd17e46a81322 (diff)
downloadzig-c6b3d06535f4227541c13fe75da347a485abdb4f.tar.gz
zig-c6b3d06535f4227541c13fe75da347a485abdb4f.zip
Sema: improved C pointers and casting
* C pointer types always have allowzero set to true but they omit the word allowzero when printed. * Implement coercion from C pointers to other pointers. * Implement in-memory coercion for slices and pointer-like optionals. * Make slicing a C pointer drop the allowzero bit. * Value representation for pointer-like optionals is now allowed to use pointer tag values in addition to the `opt_payload` tag.
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index ca9e973354..fd92dec413 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -1184,6 +1184,8 @@ pub const DeclGen = struct {
if (tv.ty.isPtrLikeOptional()) {
if (tv.val.castTag(.opt_payload)) |payload| {
return self.genTypedValue(.{ .ty = payload_ty, .val = payload.data });
+ } else if (is_pl) {
+ return self.genTypedValue(.{ .ty = payload_ty, .val = tv.val });
} else {
const llvm_ty = try self.llvmType(tv.ty);
return llvm_ty.constNull();