Commit ec36ac8b21

Jacob G-W <jacoblevgw@gmail.com>
2021-06-22 18:04:19
stage2 astgen: provide 3 more errors for invalid inline assembly
1 parent e2b954c
Changed files (3)
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);