Commit ec36ac8b21
Changed files (3)
src
test
behavior
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", .{});
}
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",);
}
}
-
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);