stage2 astgen: provide 3 more errors for invalid inline assembly

This commit is contained in:
Jacob G-W 2021-06-22 12:04:19 -04:00 committed by Andrew Kelley
parent e2b954c273
commit ec36ac8b21
3 changed files with 45 additions and 3 deletions

View File

@ -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", .{});
}

View File

@ -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",);
}
}

View File

@ -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);