Skip to content

Commit 89cef9f

Browse files
committed
stage2: make line field of @src runtime known
1 parent 226994c commit 89cef9f

File tree

4 files changed

+27
-3
lines changed

4 files changed

+27
-3
lines changed

src/Sema.zig

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 => {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
pub 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

0 commit comments

Comments
 (0)