Files
zig/test/cases/compile_errors/bad_usage_of_call.zig
mlugg e9bd2d45d4 Sema: rewrite semantic analysis of function calls
This rewrite improves some error messages, hugely simplifies the logic,
and fixes several bugs. One of these bugs is technically a new rule
which Andrew and I agreed on: if a parameter has a comptime-only type
but is not declared `comptime`, then the corresponding call argument
should not be *evaluated* at comptime; only resolved. Implementing this
required changing how function types work a little, which in turn
required allowing a new kind of function coercion for some generic use
cases: function coercions are now allowed to implicitly *remove*
`comptime` annotations from parameters with comptime-only types. This is
okay because removing the annotation affects only the call site.

Resolves: #22262
2025-01-09 06:46:47 +00:00

50 lines
1.3 KiB
Zig

export fn entry1() void {
@call(.auto, foo, {});
}
export fn entry2() void {
comptime @call(.never_inline, foo, .{});
}
export fn entry3() void {
comptime @call(.never_tail, foo, .{});
}
export fn entry4() void {
@call(.never_inline, bar, .{});
}
export fn entry5(c: bool) void {
const baz = if (c) &baz1 else &baz2;
@call(.compile_time, baz, .{});
}
export fn entry6() void {
_ = @call(.always_inline, dummy, .{});
}
export fn entry7() void {
_ = @call(.always_inline, dummy2, .{});
}
pub export fn entry() void {
var call_me: *const fn () void = undefined;
_ = &call_me;
@call(.always_inline, call_me, .{});
}
fn foo() void {}
inline fn bar() void {}
fn baz1() void {}
fn baz2() void {}
noinline fn dummy() u32 {
return 0;
}
noinline fn dummy2() void {}
// error
// backend=stage2
// target=native
//
// :2:23: error: expected a tuple, found 'void'
// :5:21: error: unable to perform 'never_inline' call at compile-time
// :8:21: error: unable to perform 'never_tail' call at compile-time
// :11:5: error: cannot perform inline call with 'never_inline' modifier
// :15:26: error: modifier 'compile_time' requires a comptime-known function
// :18:9: error: inline call of noinline function
// :21:9: error: inline call of noinline function
// :26:27: error: modifier 'always_inline' requires a comptime-known function