zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit ec36ac8b21fa6c6d8514c60555aba8a96490a560 (tree)
parent e2b954c2738c683a85b864eb33530f0e3dbbc480
Author: Jacob G-W <jacoblevgw@gmail.com>
Date:   Tue, 22 Jun 2021 12:04:19 -0400

stage2 astgen: provide 3 more errors for invalid inline assembly

Diffstat:
Msrc/AstGen.zig | 12+++++++++++-
Mtest/behavior/syntax.zig | 3+--
Mtest/cases.zig | 33+++++++++++++++++++++++++++++++++
3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/src/AstGen.zig b/src/AstGen.zig @@ -6622,7 +6622,17 @@ fn asmExpr( // See https://github.com/ziglang/zig/issues/215 and related issues discussing // possible inline assembly improvements. Until then here is status quo AstGen // for assembly syntax. It's used by std lib crypto aesni.zig. - + const is_container_asm = astgen.fn_block == null; + if (is_container_asm) { + if (full.volatile_token) |t| + return astgen.failTok(t, "volatile is meaningless on global assembly", .{}); + if (full.outputs.len != 0 or full.inputs.len != 0 or full.first_clobber != null) + return astgen.failNode(node, "global assembly cannot have inputs, outputs, or clobbers", .{}); + } else { + if (full.outputs.len == 0 and full.volatile_token == null) { + return astgen.failNode(node, "assembly expression with no output must be marked volatile", .{}); + } + } if (full.outputs.len > 32) { return astgen.failNode(full.outputs[32], "too many asm outputs", .{}); } diff --git a/test/behavior/syntax.zig b/test/behavior/syntax.zig @@ -60,8 +60,7 @@ fn asm_lists() void { :[a] "x" (x),); asm ("not real assembly" :[a] "x" (->i32),:[a] "x" (1),); - asm ("still not real assembly" + asm volatile ("still not real assembly" :::"a","b",); } } - diff --git a/test/cases.zig b/test/cases.zig @@ -1506,6 +1506,39 @@ pub fn addCases(ctx: *TestContext) !void { \\ _ = x; \\} , &[_][]const u8{":4:27: error: expected type, found comptime_int"}); + case.addError( + \\const S = struct { + \\ comptime { + \\ asm volatile ( + \\ \\zig_moment: + \\ \\syscall + \\ ); + \\ } + \\}; + \\pub fn main() void { + \\ _ = S; + \\} + , &.{":3:13: error: volatile is meaningless on global assembly"}); + case.addError( + \\pub fn main() void { + \\ var bruh: u32 = 1; + \\ asm ("" + \\ : + \\ : [bruh] "{rax}" (4) + \\ : "memory" + \\ ); + \\} + , &.{":3:5: error: assembly expression with no output must be marked volatile"}); + case.addError( + \\pub fn main() void {} + \\comptime { + \\ asm ("" + \\ : + \\ : [bruh] "{rax}" (4) + \\ : "memory" + \\ ); + \\} + , &.{":3:5: error: global assembly cannot have inputs, outputs, or clobbers"}); } { var case = ctx.exe("comptime var", linux_x64);