From 2252dcc508c53dc302ec1f919c4792a7f00ce125 Mon Sep 17 00:00:00 2001 From: Bogdan Romanyuk <65823030+wrongnull@users.noreply.github.com> Date: Sat, 25 Nov 2023 20:29:07 +0300 Subject: [PATCH] Compiler: move checking function-scope-only builtins to AstGen --- src/AstGen.zig | 43 ++++++------ src/Sema.zig | 6 +- ...unction-only_builtins_outside_function.zig | 69 +++++++++++++++++++ .../setAlignStack_outside_function.zig | 9 --- .../compile_errors/src_outside_function.zig | 9 --- 5 files changed, 92 insertions(+), 44 deletions(-) create mode 100644 test/cases/compile_errors/function-only_builtins_outside_function.zig delete mode 100644 test/cases/compile_errors/setAlignStack_outside_function.zig delete mode 100644 test/cases/compile_errors/src_outside_function.zig diff --git a/src/AstGen.zig b/src/AstGen.zig index 7bae5cafb0..8a6a6a7292 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -8266,6 +8266,28 @@ fn builtinCall( } } + // Check function scope-only builtins + + if (astgen.fn_block == null) { + switch (info.tag) { + .c_va_arg, + .c_va_copy, + .c_va_end, + .c_va_start, + .work_item_id, + .work_group_size, + .work_group_id, + .set_align_stack, + .set_cold, + .return_address, + .frame_address, + .breakpoint, + .src, + => return astgen.failNode(node, "'{s}' outside function scope", .{builtin_name}), + else => {}, + } + } + switch (info.tag) { .import => { const node_tags = tree.nodes.items(.tag); @@ -8802,9 +8824,6 @@ fn builtinCall( return rvalue(gz, ri, .void_value, node); }, .c_va_arg => { - if (astgen.fn_block == null) { - return astgen.failNode(node, "'@cVaArg' outside function scope", .{}); - } const result = try gz.addExtendedPayload(.c_va_arg, Zir.Inst.BinNode{ .node = gz.nodeIndexToRelative(node), .lhs = try expr(gz, scope, .{ .rl = .none }, params[0]), @@ -8813,9 +8832,6 @@ fn builtinCall( return rvalue(gz, ri, result, node); }, .c_va_copy => { - if (astgen.fn_block == null) { - return astgen.failNode(node, "'@cVaCopy' outside function scope", .{}); - } const result = try gz.addExtendedPayload(.c_va_copy, Zir.Inst.UnNode{ .node = gz.nodeIndexToRelative(node), .operand = try expr(gz, scope, .{ .rl = .none }, params[0]), @@ -8823,9 +8839,6 @@ fn builtinCall( return rvalue(gz, ri, result, node); }, .c_va_end => { - if (astgen.fn_block == null) { - return astgen.failNode(node, "'@cVaEnd' outside function scope", .{}); - } const result = try gz.addExtendedPayload(.c_va_end, Zir.Inst.UnNode{ .node = gz.nodeIndexToRelative(node), .operand = try expr(gz, scope, .{ .rl = .none }, params[0]), @@ -8833,9 +8846,6 @@ fn builtinCall( return rvalue(gz, ri, result, node); }, .c_va_start => { - if (astgen.fn_block == null) { - return astgen.failNode(node, "'@cVaStart' outside function scope", .{}); - } if (!astgen.fn_var_args) { return astgen.failNode(node, "'@cVaStart' in a non-variadic function", .{}); } @@ -8843,9 +8853,6 @@ fn builtinCall( }, .work_item_id => { - if (astgen.fn_block == null) { - return astgen.failNode(node, "'@workItemId' outside function scope", .{}); - } const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]); const result = try gz.addExtendedPayload(.work_item_id, Zir.Inst.UnNode{ .node = gz.nodeIndexToRelative(node), @@ -8854,9 +8861,6 @@ fn builtinCall( return rvalue(gz, ri, result, node); }, .work_group_size => { - if (astgen.fn_block == null) { - return astgen.failNode(node, "'@workGroupSize' outside function scope", .{}); - } const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]); const result = try gz.addExtendedPayload(.work_group_size, Zir.Inst.UnNode{ .node = gz.nodeIndexToRelative(node), @@ -8865,9 +8869,6 @@ fn builtinCall( return rvalue(gz, ri, result, node); }, .work_group_id => { - if (astgen.fn_block == null) { - return astgen.failNode(node, "'@workGroupId' outside function scope", .{}); - } const operand = try comptimeExpr(gz, scope, .{ .rl = .{ .coerced_ty = .u32_type } }, params[0]); const result = try gz.addExtendedPayload(.work_group_id, Zir.Inst.UnNode{ .node = gz.nodeIndexToRelative(node), diff --git a/src/Sema.zig b/src/Sema.zig index 87790dbdb1..4a30c6d695 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -6151,9 +6151,6 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst alignment.toByteUnitsOptional().?, }); } - if (sema.func_index == .none) { - return sema.fail(block, src, "@setAlignStack outside function body", .{}); - } const fn_owner_decl = mod.funcOwnerDeclPtr(sema.func_index); switch (fn_owner_decl.ty.fnCallingConvention(mod)) { @@ -16780,13 +16777,12 @@ fn zirBuiltinSrc( block: *Block, extended: Zir.Inst.Extended.InstData, ) CompileError!Air.Inst.Ref { + _ = block; const tracy = trace(@src()); defer tracy.end(); const mod = sema.mod; const extra = sema.code.extraData(Zir.Inst.Src, extended.operand).data; - const src = LazySrcLoc.nodeOffset(extra.node); - if (sema.func_index == .none) return sema.fail(block, src, "@src outside function", .{}); const fn_owner_decl = mod.funcOwnerDeclPtr(sema.func_index); const ip = &mod.intern_pool; const gpa = sema.gpa; diff --git a/test/cases/compile_errors/function-only_builtins_outside_function.zig b/test/cases/compile_errors/function-only_builtins_outside_function.zig new file mode 100644 index 0000000000..3484b5ca46 --- /dev/null +++ b/test/cases/compile_errors/function-only_builtins_outside_function.zig @@ -0,0 +1,69 @@ +comptime { + @setAlignStack(1); +} + +comptime { + @setCold(true); +} + +comptime { + @src(); +} + +comptime { + @returnAddress(); +} + +comptime { + @frameAddress(); +} + +comptime { + @breakpoint(); +} + +comptime { + @cVaArg(1, 2); +} + +comptime { + @cVaCopy(1); +} + +comptime { + @cVaEnd(1); +} + +comptime { + @cVaStart(); +} + +comptime { + @workItemId(42); +} + +comptime { + @workGroupSize(42); +} + +comptime { + @workGroupId(42); +} + +// error +// backend=stage2 +// target=native +// +// :2:5: error: '@setAlignStack' outside function scope +// :6:5: error: '@setCold' outside function scope +// :10:5: error: '@src' outside function scope +// :14:5: error: '@returnAddress' outside function scope +// :18:5: error: '@frameAddress' outside function scope +// :22:5: error: '@breakpoint' outside function scope +// :26:5: error: '@cVaArg' outside function scope +// :30:5: error: '@cVaCopy' outside function scope +// :34:5: error: '@cVaEnd' outside function scope +// :38:5: error: '@cVaStart' outside function scope +// :42:5: error: '@workItemId' outside function scope +// :46:5: error: '@workGroupSize' outside function scope +// :50:5: error: '@workGroupId' outside function scope diff --git a/test/cases/compile_errors/setAlignStack_outside_function.zig b/test/cases/compile_errors/setAlignStack_outside_function.zig deleted file mode 100644 index 0c06f867de..0000000000 --- a/test/cases/compile_errors/setAlignStack_outside_function.zig +++ /dev/null @@ -1,9 +0,0 @@ -comptime { - @setAlignStack(16); -} - -// error -// backend=stage2 -// target=native -// -// :2:5: error: @setAlignStack outside function body diff --git a/test/cases/compile_errors/src_outside_function.zig b/test/cases/compile_errors/src_outside_function.zig deleted file mode 100644 index 8b66ba730b..0000000000 --- a/test/cases/compile_errors/src_outside_function.zig +++ /dev/null @@ -1,9 +0,0 @@ -comptime { - @src(); -} - -// error -// backend=stage2 -// target=native -// -// :2:5: error: @src outside function