authorgravatar for wrongnull@gmail.comBogdan Romanyuk <wrongnull@gmail.com> 2023-11-25 20:29:07+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-11-25 17:29:07+00:00
log2252dcc508c53dc302ec1f919c4792a7f00ce125
tree5b4fb9d2ded6453efa46012d98e6503904c3aee4
parentbece97ef248ad36d31a48fb761b4a41324c9c5d5
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Compiler: move checking function-scope-only builtins to AstGen


5 files changed, 92 insertions(+), 44 deletions(-)

src/AstGen.zig+22-21
......@@ -8266,6 +8266,28 @@ fn builtinCall(
82668266 }
82678267 }
82688268
8269 // Check function scope-only builtins
8270
8271 if (astgen.fn_block == null) {
8272 switch (info.tag) {
8273 .c_va_arg,
8274 .c_va_copy,
8275 .c_va_end,
8276 .c_va_start,
8277 .work_item_id,
8278 .work_group_size,
8279 .work_group_id,
8280 .set_align_stack,
8281 .set_cold,
8282 .return_address,
8283 .frame_address,
8284 .breakpoint,
8285 .src,
8286 => return astgen.failNode(node, "'{s}' outside function scope", .{builtin_name}),
8287 else => {},
8288 }
8289 }
8290
82698291 switch (info.tag) {
82708292 .import => {
82718293 const node_tags = tree.nodes.items(.tag);
......@@ -8802,9 +8824,6 @@ fn builtinCall(
88028824 return rvalue(gz, ri, .void_value, node);
88038825 },
88048826 .c_va_arg => {
8805 if (astgen.fn_block == null) {
8806 return astgen.failNode(node, "'@cVaArg' outside function scope", .{});
8807 }
88088827 const result = try gz.addExtendedPayload(.c_va_arg, Zir.Inst.BinNode{
88098828 .node = gz.nodeIndexToRelative(node),
88108829 .lhs = try expr(gz, scope, .{ .rl = .none }, params[0]),
......@@ -8813,9 +8832,6 @@ fn builtinCall(
88138832 return rvalue(gz, ri, result, node);
88148833 },
88158834 .c_va_copy => {
8816 if (astgen.fn_block == null) {
8817 return astgen.failNode(node, "'@cVaCopy' outside function scope", .{});
8818 }
88198835 const result = try gz.addExtendedPayload(.c_va_copy, Zir.Inst.UnNode{
88208836 .node = gz.nodeIndexToRelative(node),
88218837 .operand = try expr(gz, scope, .{ .rl = .none }, params[0]),
......@@ -8823,9 +8839,6 @@ fn builtinCall(
88238839 return rvalue(gz, ri, result, node);
88248840 },
88258841 .c_va_end => {
8826 if (astgen.fn_block == null) {
8827 return astgen.failNode(node, "'@cVaEnd' outside function scope", .{});
8828 }
88298842 const result = try gz.addExtendedPayload(.c_va_end, Zir.Inst.UnNode{
88308843 .node = gz.nodeIndexToRelative(node),
88318844 .operand = try expr(gz, scope, .{ .rl = .none }, params[0]),
......@@ -8833,9 +8846,6 @@ fn builtinCall(
88338846 return rvalue(gz, ri, result, node);
88348847 },
88358848 .c_va_start => {
8836 if (astgen.fn_block == null) {
8837 return astgen.failNode(node, "'@cVaStart' outside function scope", .{});
8838 }
88398849 if (!astgen.fn_var_args) {
88408850 return astgen.failNode(node, "'@cVaStart' in a non-variadic function", .{});
88418851 }
......@@ -8843,9 +8853,6 @@ fn builtinCall(
88438853 },
88448854
88458855 .work_item_id => {
8846 if (astgen.fn_block == null) {
8847 return astgen.failNode(node, "'@workItemId' outside function scope", .{});
8848 }
88498856 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);
88508857 const result = try gz.addExtendedPayload(.work_item_id, Zir.Inst.UnNode{
88518858 .node = gz.nodeIndexToRelative(node),
......@@ -8854,9 +8861,6 @@ fn builtinCall(
88548861 return rvalue(gz, ri, result, node);
88558862 },
88568863 .work_group_size => {
8857 if (astgen.fn_block == null) {
8858 return astgen.failNode(node, "'@workGroupSize' outside function scope", .{});
8859 }
88608864 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);
88618865 const result = try gz.addExtendedPayload(.work_group_size, Zir.Inst.UnNode{
88628866 .node = gz.nodeIndexToRelative(node),
......@@ -8865,9 +8869,6 @@ fn builtinCall(
88658869 return rvalue(gz, ri, result, node);
88668870 },
88678871 .work_group_id => {
8868 if (astgen.fn_block == null) {
8869 return astgen.failNode(node, "'@workGroupId' outside function scope", .{});
8870 }
88718872 const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]);
88728873 const result = try gz.addExtendedPayload(.work_group_id, Zir.Inst.UnNode{
88738874 .node = gz.nodeIndexToRelative(node),
src/Sema.zig+1-5
......@@ -6151,9 +6151,6 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst
61516151 alignment.toByteUnitsOptional().?,
61526152 });
61536153 }
6154 if (sema.func_index == .none) {
6155 return sema.fail(block, src, "@setAlignStack outside function body", .{});
6156 }
61576154
61586155 const fn_owner_decl = mod.funcOwnerDeclPtr(sema.func_index);
61596156 switch (fn_owner_decl.ty.fnCallingConvention(mod)) {
......@@ -16780,13 +16777,12 @@ fn zirBuiltinSrc(
1678016777 block: *Block,
1678116778 extended: Zir.Inst.Extended.InstData,
1678216779) CompileError!Air.Inst.Ref {
16780 _ = block;
1678316781 const tracy = trace(@src());
1678416782 defer tracy.end();
1678516783
1678616784 const mod = sema.mod;
1678716785 const extra = sema.code.extraData(Zir.Inst.Src, extended.operand).data;
16788 const src = LazySrcLoc.nodeOffset(extra.node);
16789 if (sema.func_index == .none) return sema.fail(block, src, "@src outside function", .{});
1679016786 const fn_owner_decl = mod.funcOwnerDeclPtr(sema.func_index);
1679116787 const ip = &mod.intern_pool;
1679216788 const gpa = sema.gpa;
test/cases/compile_errors/function-only_builtins_outside_function.zig created+69
......@@ -0,0 +1,69 @@
1comptime {
2 @setAlignStack(1);
3}
4
5comptime {
6 @setCold(true);
7}
8
9comptime {
10 @src();
11}
12
13comptime {
14 @returnAddress();
15}
16
17comptime {
18 @frameAddress();
19}
20
21comptime {
22 @breakpoint();
23}
24
25comptime {
26 @cVaArg(1, 2);
27}
28
29comptime {
30 @cVaCopy(1);
31}
32
33comptime {
34 @cVaEnd(1);
35}
36
37comptime {
38 @cVaStart();
39}
40
41comptime {
42 @workItemId(42);
43}
44
45comptime {
46 @workGroupSize(42);
47}
48
49comptime {
50 @workGroupId(42);
51}
52
53// error
54// backend=stage2
55// target=native
56//
57// :2:5: error: '@setAlignStack' outside function scope
58// :6:5: error: '@setCold' outside function scope
59// :10:5: error: '@src' outside function scope
60// :14:5: error: '@returnAddress' outside function scope
61// :18:5: error: '@frameAddress' outside function scope
62// :22:5: error: '@breakpoint' outside function scope
63// :26:5: error: '@cVaArg' outside function scope
64// :30:5: error: '@cVaCopy' outside function scope
65// :34:5: error: '@cVaEnd' outside function scope
66// :38:5: error: '@cVaStart' outside function scope
67// :42:5: error: '@workItemId' outside function scope
68// :46:5: error: '@workGroupSize' outside function scope
69// :50:5: error: '@workGroupId' outside function scope
test/cases/compile_errors/setAlignStack_outside_function.zig deleted-9
......@@ -1,9 +0,0 @@
1comptime {
2 @setAlignStack(16);
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:5: error: @setAlignStack outside function body
test/cases/compile_errors/src_outside_function.zig deleted-9
......@@ -1,9 +0,0 @@
1comptime {
2 @src();
3}
4
5// error
6// backend=stage2
7// target=native
8//
9// :2:5: error: @src outside function