Skip to content

Commit df1e672

Browse files
Resolve argument types for builtin function calls
`@branchHint`, `@atomicLoad`, `@atomicRmw`, `@atomicStore`, `@cmpxchgStrong`, `@cmpxchgWeak`, `@call`, `@export`, `@extern`, `@reduce`, `@Type`
1 parent 7cb40ed commit df1e672

2 files changed

Lines changed: 100 additions & 0 deletions

File tree

src/analysis.zig

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5491,6 +5491,78 @@ pub fn resolveExpressionTypeFromAncestors(
54915491
const ty = try analyser.resolveTypeOfNode(.of(params[0], handle)) orelse return null;
54925492
return ty.instanceTypeVal(analyser);
54935493
}
5494+
5495+
if (std.mem.eql(u8, call_name, "@branchHint")) {
5496+
if (params.len == 0) return null;
5497+
if (params[0] != node) return null;
5498+
return analyser.instanceStdBuiltinType("BranchHint");
5499+
}
5500+
5501+
if (std.mem.eql(u8, call_name, "@atomicLoad")) {
5502+
if (params.len <= 2) return null;
5503+
if (params[2] != node) return null;
5504+
return analyser.instanceStdBuiltinType("AtomicOrder");
5505+
}
5506+
5507+
if (std.mem.eql(u8, call_name, "@atomicRmw")) {
5508+
if (params.len > 2 and params[2] == node)
5509+
return analyser.instanceStdBuiltinType("AtomicRmwOp");
5510+
if (params.len > 4 and params[4] == node)
5511+
return analyser.instanceStdBuiltinType("AtomicOrder");
5512+
return null;
5513+
}
5514+
5515+
if (std.mem.eql(u8, call_name, "@atomicStore")) {
5516+
if (params.len <= 3) return null;
5517+
if (params[3] != node) return null;
5518+
return analyser.instanceStdBuiltinType("AtomicOrder");
5519+
}
5520+
5521+
if (std.mem.eql(u8, call_name, "@cmpxchgStrong")) {
5522+
if (params.len > 4 and params[4] == node)
5523+
return analyser.instanceStdBuiltinType("AtomicOrder");
5524+
if (params.len > 5 and params[5] == node)
5525+
return analyser.instanceStdBuiltinType("AtomicOrder");
5526+
return null;
5527+
}
5528+
5529+
if (std.mem.eql(u8, call_name, "@cmpxchgWeak")) {
5530+
if (params.len > 4 and params[4] == node)
5531+
return analyser.instanceStdBuiltinType("AtomicOrder");
5532+
if (params.len > 5 and params[5] == node)
5533+
return analyser.instanceStdBuiltinType("AtomicOrder");
5534+
return null;
5535+
}
5536+
5537+
if (std.mem.eql(u8, call_name, "@call")) {
5538+
if (params.len == 0) return null;
5539+
if (params[0] != node) return null;
5540+
return analyser.instanceStdBuiltinType("CallModifier");
5541+
}
5542+
5543+
if (std.mem.eql(u8, call_name, "@export")) {
5544+
if (params.len <= 1) return null;
5545+
if (params[1] != node) return null;
5546+
return analyser.instanceStdBuiltinType("ExportOptions");
5547+
}
5548+
5549+
if (std.mem.eql(u8, call_name, "@extern")) {
5550+
if (params.len <= 1) return null;
5551+
if (params[1] != node) return null;
5552+
return analyser.instanceStdBuiltinType("ExternOptions");
5553+
}
5554+
5555+
if (std.mem.eql(u8, call_name, "@reduce")) {
5556+
if (params.len == 0) return null;
5557+
if (params[0] != node) return null;
5558+
return analyser.instanceStdBuiltinType("ReduceOp");
5559+
}
5560+
5561+
if (std.mem.eql(u8, call_name, "@Type")) {
5562+
if (params.len == 0) return null;
5563+
if (params[0] != node) return null;
5564+
return analyser.instanceStdBuiltinType("Type");
5565+
}
54945566
},
54955567

54965568
.@"orelse" => {

tests/analysis/builtins.zig

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,31 @@ comptime {
134134
// Use @compileLog to verify the expected type with the compiler
135135
// @compileLog(vector_builtin_13);
136136
}
137+
138+
fn builtin_calls() void {
139+
@branchHint(.none);
140+
// ^^^^^ (BranchHint)()
141+
@atomicLoad(undefined, undefined, .unordered);
142+
// ^^^^^^^^^^ (AtomicOrder)()
143+
@atomicRmw(undefined, undefined, .Xchg, undefined, .unordered);
144+
// ^^^^^ (AtomicRmwOp)()
145+
// ^^^^^^^^^^ (AtomicOrder)()
146+
@atomicStore(undefined, undefined, undefined, .unordered);
147+
// ^^^^^^^^^^ (AtomicOrder)()
148+
@cmpxchgStrong(undefined, undefined, undefined, undefined, .unordered, .unordered);
149+
// ^^^^^^^^^^ (AtomicOrder)()
150+
// ^^^^^^^^^^ (AtomicOrder)()
151+
@cmpxchgWeak(undefined, undefined, undefined, undefined, .unordered, .unordered);
152+
// ^^^^^^^^^^ (AtomicOrder)()
153+
// ^^^^^^^^^^ (AtomicOrder)()
154+
@call(.always_inline, undefined, undefined);
155+
// ^^^^^^^^^^^^^^ (CallModifier)()
156+
@export(undefined, .{ .name = undefined });
157+
// ^^^^^ ([]const u8)()
158+
@extern(undefined, .{ .name = undefined });
159+
// ^^^^^ ([]const u8)()
160+
@reduce(.And, undefined);
161+
// ^^^^ (ReduceOp)()
162+
@Type(.type);
163+
// ^^^^^ (void)()
164+
}

0 commit comments

Comments
 (0)