authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-15 15:52:57+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-16 01:12:27+02:00
log2cfa7165e715321dffea21380d4fde0dd5079925
treee1a40071bc030821e7bca65950aba3705ab2c827
parentb6b3462796fe38a071e6ed2cbcdbb5b024359f35

Sema: do not re-evaluate type of non-generic inline call parameters

Closes #13491

2 files changed, 26 insertions(+), 2 deletions(-)

src/Sema.zig+9-2
...@@ -6361,6 +6361,7 @@ fn analyzeCall(...@@ -6361,6 +6361,7 @@ fn analyzeCall(
6361 is_comptime_call,6361 is_comptime_call,
6362 &should_memoize,6362 &should_memoize,
6363 memoized_call_key,6363 memoized_call_key,
6364 func_ty_info.param_types,
6364 ) catch |err| switch (err) {6365 ) catch |err| switch (err) {
6365 error.NeededSourceLocation => {6366 error.NeededSourceLocation => {
6366 _ = sema.inst_map.remove(inst);6367 _ = sema.inst_map.remove(inst);
...@@ -6376,6 +6377,7 @@ fn analyzeCall(...@@ -6376,6 +6377,7 @@ fn analyzeCall(
6376 is_comptime_call,6377 is_comptime_call,
6377 &should_memoize,6378 &should_memoize,
6378 memoized_call_key,6379 memoized_call_key,
6380 func_ty_info.param_types,
6379 );6381 );
6380 return error.AnalysisFail;6382 return error.AnalysisFail;
6381 },6383 },
...@@ -6612,6 +6614,7 @@ fn analyzeInlineCallArg(...@@ -6612,6 +6614,7 @@ fn analyzeInlineCallArg(
6612 is_comptime_call: bool,6614 is_comptime_call: bool,
6613 should_memoize: *bool,6615 should_memoize: *bool,
6614 memoized_call_key: Module.MemoizedCall.Key,6616 memoized_call_key: Module.MemoizedCall.Key,
6617 raw_param_types: []const Type,
6615) !void {6618) !void {
6616 const zir_tags = sema.code.instructions.items(.tag);6619 const zir_tags = sema.code.instructions.items(.tag);
6617 switch (zir_tags[inst]) {6620 switch (zir_tags[inst]) {
...@@ -6622,8 +6625,12 @@ fn analyzeInlineCallArg(...@@ -6622,8 +6625,12 @@ fn analyzeInlineCallArg(
6622 const param_src = pl_tok.src();6625 const param_src = pl_tok.src();
6623 const extra = sema.code.extraData(Zir.Inst.Param, pl_tok.payload_index);6626 const extra = sema.code.extraData(Zir.Inst.Param, pl_tok.payload_index);
6624 const param_body = sema.code.extra[extra.end..][0..extra.data.body_len];6627 const param_body = sema.code.extra[extra.end..][0..extra.data.body_len];
6625 const param_ty_inst = try sema.resolveBody(param_block, param_body, inst);6628 const param_ty = param_ty: {
6626 const param_ty = try sema.analyzeAsType(param_block, param_src, param_ty_inst);6629 const raw_param_ty = raw_param_types[arg_i.*];
6630 if (raw_param_ty.tag() != .generic_poison) break :param_ty raw_param_ty;
6631 const param_ty_inst = try sema.resolveBody(param_block, param_body, inst);
6632 break :param_ty try sema.analyzeAsType(param_block, param_src, param_ty_inst);
6633 };
6627 new_fn_info.param_types[arg_i.*] = param_ty;6634 new_fn_info.param_types[arg_i.*] = param_ty;
6628 const uncasted_arg = uncasted_args[arg_i.*];6635 const uncasted_arg = uncasted_args[arg_i.*];
6629 if (try sema.typeRequiresComptime(param_ty)) {6636 if (try sema.typeRequiresComptime(param_ty)) {
test/behavior/call.zig+17
...@@ -327,3 +327,20 @@ test "inline call preserves tail call" {...@@ -327,3 +327,20 @@ test "inline call preserves tail call" {
327 S.foo();327 S.foo();
328 try expect(S.a == std.math.maxInt(u16));328 try expect(S.a == std.math.maxInt(u16));
329}329}
330
331test "inline call doesn't re-evaluate non generic struct" {
332 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
333 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
334 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
335 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
336
337 const S = struct {
338 fn foo(f: struct { a: u8, b: u8 }) !void {
339 try expect(f.a == 123);
340 try expect(f.b == 45);
341 }
342 };
343 const ArgTuple = std.meta.ArgsTuple(@TypeOf(S.foo));
344 try @call(.{ .modifier = .always_inline }, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});
345 comptime try @call(.{ .modifier = .always_inline }, S.foo, ArgTuple{.{ .a = 123, .b = 45 }});
346}