authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-06 11:23:53+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-07-07 10:50:06+03:00
log89cef9f5f731f8f33dc935aac3c21bd57c92900d
tree57c37405ea1c0ccb118d94eb2d0bc4a0f49a0b14
parent226994cd7e33f2b5812e7bf5e894d9685431af8c

stage2: make line field of `@src` runtime known


4 files changed, 27 insertions(+), 3 deletions(-)

src/Sema.zig+4-3
......@@ -1686,7 +1686,9 @@ fn resolveMaybeUndefValAllowVariables(
16861686 switch (air_tags[i]) {
16871687 .constant => {
16881688 const ty_pl = sema.air_instructions.items(.data)[i].ty_pl;
1689 return sema.air_values.items[ty_pl.payload];
1689 const val = sema.air_values.items[ty_pl.payload];
1690 if (val.tag() == .runtime_int) return null;
1691 return val;
16901692 },
16911693 .const_ty => {
16921694 return try sema.air_instructions.items(.data)[i].ty.toValue(sema.arena);
......@@ -12151,9 +12153,8 @@ fn zirBuiltinSrc(
1215112153 field_values[0] = file_name_val;
1215212154 // fn_name: [:0]const u8,
1215312155 field_values[1] = func_name_val;
12154 // TODO these should be runtime only!
1215512156 // line: u32
12156 field_values[2] = try Value.Tag.int_u64.create(sema.arena, extra.line + 1);
12157 field_values[2] = try Value.Tag.runtime_int.create(sema.arena, extra.line + 1);
1215712158 // column: u32,
1215812159 field_values[3] = try Value.Tag.int_u64.create(sema.arena, extra.column + 1);
1215912160
src/TypedValue.zig+1
......@@ -495,5 +495,6 @@ pub fn print(
495495 },
496496 .generic_poison_type => return writer.writeAll("(generic poison type)"),
497497 .generic_poison => return writer.writeAll("(generic poison)"),
498 .runtime_int => return writer.writeAll("[runtime value]"),
498499 };
499500}
src/value.zig+8
......@@ -111,6 +111,7 @@ pub const Value = extern union {
111111 int_i64,
112112 int_big_positive,
113113 int_big_negative,
114 runtime_int,
114115 function,
115116 extern_fn,
116117 variable,
......@@ -304,6 +305,7 @@ pub const Value = extern union {
304305 .int_type => Payload.IntType,
305306 .int_u64 => Payload.U64,
306307 .int_i64 => Payload.I64,
308 .runtime_int => Payload.U64,
307309 .function => Payload.Function,
308310 .variable => Payload.Variable,
309311 .decl_ref_mut => Payload.DeclRefMut,
......@@ -483,6 +485,7 @@ pub const Value = extern union {
483485 },
484486 .int_type => return self.copyPayloadShallow(arena, Payload.IntType),
485487 .int_u64 => return self.copyPayloadShallow(arena, Payload.U64),
488 .runtime_int => return self.copyPayloadShallow(arena, Payload.U64),
486489 .int_i64 => return self.copyPayloadShallow(arena, Payload.I64),
487490 .int_big_positive, .int_big_negative => {
488491 const old_payload = self.cast(Payload.BigInt).?;
......@@ -762,6 +765,7 @@ pub const Value = extern union {
762765 .int_i64 => return std.fmt.formatIntValue(val.castTag(.int_i64).?.data, "", options, out_stream),
763766 .int_big_positive => return out_stream.print("{}", .{val.castTag(.int_big_positive).?.asBigInt()}),
764767 .int_big_negative => return out_stream.print("{}", .{val.castTag(.int_big_negative).?.asBigInt()}),
768 .runtime_int => return out_stream.writeAll("[runtime value]"),
765769 .function => return out_stream.print("(function decl={d})", .{val.castTag(.function).?.data.owner_decl}),
766770 .extern_fn => return out_stream.writeAll("(extern function)"),
767771 .variable => return out_stream.writeAll("(variable)"),
......@@ -1077,6 +1081,8 @@ pub const Value = extern union {
10771081 .int_big_positive => return val.castTag(.int_big_positive).?.asBigInt(),
10781082 .int_big_negative => return val.castTag(.int_big_negative).?.asBigInt(),
10791083
1084 .runtime_int => return BigIntMutable.init(&space.limbs, val.castTag(.runtime_int).?.data).toConst(),
1085
10801086 .undef => unreachable,
10811087
10821088 .lazy_align => {
......@@ -1132,6 +1138,8 @@ pub const Value = extern union {
11321138 .int_big_positive => return val.castTag(.int_big_positive).?.asBigInt().to(u64) catch null,
11331139 .int_big_negative => return val.castTag(.int_big_negative).?.asBigInt().to(u64) catch null,
11341140
1141 .runtime_int => return val.castTag(.runtime_int).?.data,
1142
11351143 .undef => unreachable,
11361144
11371145 .lazy_align => {
test/cases/compile_errors/src_fields_runtime.zig created+14
......@@ -0,0 +1,14 @@
1pub export fn entry1() void {
2 const s = @src();
3 comptime var a: []const u8 = s.file;
4 comptime var b: []const u8 = s.fn_name;
5 comptime var c: u32 = s.column;
6 comptime var d: u32 = s.line;
7 _ = a; _ = b; _ = c; _ = d;
8}
9
10// error
11// backend=stage2
12// target=native
13//
14// :6:28: error: cannot store runtime value in compile time variable