aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-10-17 19:10:49 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-10-17 19:10:49 -0700
commit40cbf525f7d7b17b0728f835e6f68efe3c2eabf6 (patch)
tree4533eaccd46b97525f0f9c744216d9353cc2a475 /src
parente5dac0a0b391f227605e496a09f32b453ac3280d (diff)
downloadzig-40cbf525f7d7b17b0728f835e6f68efe3c2eabf6.tar.gz
zig-40cbf525f7d7b17b0728f835e6f68efe3c2eabf6.zip
stage2: implement coercion from null to C pointer
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig29
-rw-r--r--src/value.zig1
2 files changed, 19 insertions, 11 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index c96b890785..589419be86 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -4731,7 +4731,7 @@ fn zirFunc(
body_inst,
ret_ty_body,
cc,
- Value.initTag(.null_value),
+ Value.@"null",
false,
inferred_error_set,
false,
@@ -8105,7 +8105,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
// return_type: ?type,
field_values[4] = try Value.Tag.ty.create(sema.arena, ty.fnReturnType());
// args: []const FnArg,
- field_values[5] = Value.initTag(.null_value); // TODO
+ field_values[5] = Value.@"null"; // TODO
return sema.addConstant(
type_info_ty,
@@ -8163,7 +8163,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
// is_allowzero: bool,
field_values[5] = if (info.@"allowzero") Value.initTag(.bool_true) else Value.initTag(.bool_false);
// sentinel: anytype,
- field_values[6] = if (info.sentinel) |some| try Value.Tag.opt_payload.create(sema.arena, some) else Value.initTag(.null_value);
+ field_values[6] = if (info.sentinel) |some| try Value.Tag.opt_payload.create(sema.arena, some) else Value.@"null";
return sema.addConstant(
type_info_ty,
@@ -8181,7 +8181,7 @@ fn zirTypeInfo(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
// child: type,
field_values[1] = try Value.Tag.ty.create(sema.arena, info.elem_type);
// sentinel: anytype,
- field_values[2] = if (info.sentinel) |some| try Value.Tag.opt_payload.create(sema.arena, some) else Value.initTag(.null_value);
+ field_values[2] = if (info.sentinel) |some| try Value.Tag.opt_payload.create(sema.arena, some) else Value.@"null";
return sema.addConstant(
type_info_ty,
@@ -9753,7 +9753,7 @@ fn zirCmpxchg(
// special case zero bit types
if ((try sema.typeHasOnePossibleValue(block, elem_ty_src, elem_ty)) != null) {
- return sema.addConstant(result_ty, Value.initTag(.null_value));
+ return sema.addConstant(result_ty, Value.@"null");
}
const runtime_src = if (try sema.resolveDefinedValue(block, ptr_src, ptr)) |ptr_val| rs: {
@@ -9767,7 +9767,7 @@ fn zirCmpxchg(
const stored_val = (try ptr_val.pointerDeref(sema.arena)) orelse break :rs ptr_src;
const result_val = if (stored_val.eql(expected_val, elem_ty)) blk: {
try sema.storePtr(block, src, ptr, new_value);
- break :blk Value.initTag(.null_value);
+ break :blk Value.@"null";
} else try Value.Tag.opt_payload.create(sema.arena, stored_val);
return sema.addConstant(result_ty, result_val);
@@ -10225,7 +10225,7 @@ fn zirVarExtended(
// extra_index += 1;
// const align_tv = try sema.resolveInstConst(block, align_src, align_ref);
// break :blk align_tv.val;
- //} else Value.initTag(.null_value);
+ //} else Value.@"null";
const uncasted_init: Air.Inst.Ref = if (small.has_init) blk: {
const init_ref = @intToEnum(Zir.Inst.Ref, sema.code.extra[extra_index]);
@@ -10307,7 +10307,7 @@ fn zirFuncExtended(
extra_index += 1;
const align_tv = try sema.resolveInstConst(block, align_src, align_ref);
break :blk align_tv.val;
- } else Value.initTag(.null_value);
+ } else Value.@"null";
const ret_ty_body = sema.code.extra[extra_index..][0..extra.data.ret_body_len];
extra_index += ret_ty_body.len;
@@ -10592,7 +10592,7 @@ fn panicWithMsg(
});
const null_stack_trace = try sema.addConstant(
try Type.optional(arena, ptr_stack_trace_ty),
- Value.initTag(.null_value),
+ Value.@"null",
);
const args = try arena.create([2]Air.Inst.Ref);
args.* = .{ msg_inst, null_stack_trace };
@@ -11544,7 +11544,7 @@ fn coerce(
.Optional => {
// null to ?T
if (inst_ty.zigTypeTag() == .Null) {
- return sema.addConstant(dest_ty, Value.initTag(.null_value));
+ return sema.addConstant(dest_ty, Value.@"null");
}
// T to ?T
@@ -11605,6 +11605,13 @@ fn coerce(
.One => {},
}
}
+
+ // coercion to C pointer
+ if (dest_ty.ptrSize() == .C) {
+ if (inst_ty.zigTypeTag() == .Null) {
+ return sema.addConstant(dest_ty, Value.@"null");
+ }
+ }
},
.Int => {
// integer widening
@@ -13806,7 +13813,7 @@ fn typeHasOnePossibleValue(
.empty_struct, .empty_struct_literal => return Value.initTag(.empty_struct_value),
.void => return Value.void,
.noreturn => return Value.initTag(.unreachable_value),
- .@"null" => return Value.initTag(.null_value),
+ .@"null" => return Value.@"null",
.@"undefined" => return Value.initTag(.undef),
.int_unsigned, .int_signed => {
diff --git a/src/value.zig b/src/value.zig
index 030ee8f783..1ae5351f54 100644
--- a/src/value.zig
+++ b/src/value.zig
@@ -2824,6 +2824,7 @@ pub const Value = extern union {
pub const negative_one: Value = .{ .ptr_otherwise = &negative_one_payload.base };
pub const undef = initTag(.undef);
pub const @"void" = initTag(.void_value);
+ pub const @"null" = initTag(.null_value);
};
var negative_one_payload: Value.Payload.I64 = .{