zig fmt: fix inline assembly test cases

All zig fmt test cases are now passing again in this branch.
This commit is contained in:
Andrew Kelley 2021-02-23 17:19:01 -07:00
parent bb89c619ed
commit 08107a555e
2 changed files with 95 additions and 83 deletions

View File

@ -1863,46 +1863,42 @@ test "zig fmt: extra newlines at the end" {
);
}
//test "zig fmt: simple asm" {
// try testTransform(
// \\comptime {
// \\ asm volatile (
// \\ \\.globl aoeu;
// \\ \\.type aoeu, @function;
// \\ \\.set aoeu, derp;
// \\ );
// \\
// \\ asm ("not real assembly"
// \\ :[a] "x" (x),);
// \\ asm ("not real assembly"
// \\ :[a] "x" (->i32),:[a] "x" (1),);
// \\ asm ("still not real assembly"
// \\ :::"a","b",);
// \\}
// ,
// \\comptime {
// \\ asm volatile (
// \\ \\.globl aoeu;
// \\ \\.type aoeu, @function;
// \\ \\.set aoeu, derp;
// \\ );
// \\
// \\ asm ("not real assembly"
// \\ : [a] "x" (x)
// \\ );
// \\ asm ("not real assembly"
// \\ : [a] "x" (-> i32)
// \\ : [a] "x" (1)
// \\ );
// \\ asm ("still not real assembly"
// \\ :
// \\ :
// \\ : "a", "b"
// \\ );
// \\}
// \\
// );
//}
test "zig fmt: simple asm" {
try testTransform(
\\comptime {
\\ asm volatile (
\\ \\.globl aoeu;
\\ \\.type aoeu, @function;
\\ \\.set aoeu, derp;
\\ );
\\
\\ asm ("not real assembly"
\\ :[a] "x" (x),);
\\ asm ("not real assembly"
\\ :[a] "x" (->i32),:[a] "x" (1),);
\\ asm ("still not real assembly"
\\ :::"a","b",);
\\}
,
\\comptime {
\\ asm volatile (
\\ \\.globl aoeu;
\\ \\.type aoeu, @function;
\\ \\.set aoeu, derp;
\\ );
\\
\\ asm ("not real assembly"
\\ : [a] "x" (x)
\\ );
\\ asm ("not real assembly"
\\ : [a] "x" (-> i32)
\\ : [a] "x" (1)
\\ );
\\ asm ("still not real assembly" ::: "a", "b");
\\}
\\
);
}
test "zig fmt: nested struct literal with one item" {
try testCanonical(
@ -3363,46 +3359,43 @@ test "zig fmt: comptime block in container" {
);
}
//test "zig fmt: inline asm parameter alignment" {
// try testCanonical(
// \\pub fn main() void {
// \\ asm volatile (
// \\ \\ foo
// \\ \\ bar
// \\ );
// \\ asm volatile (
// \\ \\ foo
// \\ \\ bar
// \\ : [_] "" (-> usize),
// \\ [_] "" (-> usize)
// \\ );
// \\ asm volatile (
// \\ \\ foo
// \\ \\ bar
// \\ :
// \\ : [_] "" (0),
// \\ [_] "" (0)
// \\ );
// \\ asm volatile (
// \\ \\ foo
// \\ \\ bar
// \\ :
// \\ :
// \\ : "", ""
// \\ );
// \\ asm volatile (
// \\ \\ foo
// \\ \\ bar
// \\ : [_] "" (-> usize),
// \\ [_] "" (-> usize)
// \\ : [_] "" (0),
// \\ [_] "" (0)
// \\ : "", ""
// \\ );
// \\}
// \\
// );
//}
test "zig fmt: inline asm parameter alignment" {
try testCanonical(
\\pub fn main() void {
\\ asm volatile (
\\ \\ foo
\\ \\ bar
\\ );
\\ asm volatile (
\\ \\ foo
\\ \\ bar
\\ : [_] "" (-> usize),
\\ [_] "" (-> usize)
\\ );
\\ asm volatile (
\\ \\ foo
\\ \\ bar
\\ :
\\ : [_] "" (0),
\\ [_] "" (0)
\\ );
\\ asm volatile (
\\ \\ foo
\\ \\ bar
\\ ::: "", "");
\\ asm volatile (
\\ \\ foo
\\ \\ bar
\\ : [_] "" (-> usize),
\\ [_] "" (-> usize)
\\ : [_] "" (0),
\\ [_] "" (0)
\\ : "", ""
\\ );
\\}
\\
);
}
test "zig fmt: multiline string in array" {
try testCanonical(

View File

@ -1955,21 +1955,40 @@ fn renderAsm(
}
if (asm_node.ast.items.len == 0) {
try renderExpression(gpa, ais, tree, asm_node.ast.template, .none);
ais.pushIndent();
if (asm_node.first_clobber) |first_clobber| {
// asm ("foo" ::: "a", "b")
// asm ("foo" ::: "a", "b",)
try renderExpression(gpa, ais, tree, asm_node.ast.template, .space);
// Render the three colons.
try renderToken(ais, tree, first_clobber - 3, .none);
try renderToken(ais, tree, first_clobber - 2, .none);
try renderToken(ais, tree, first_clobber - 1, .space);
var tok_i = first_clobber;
while (true) : (tok_i += 1) {
try renderToken(ais, tree, tok_i, .none);
tok_i += 1;
switch (token_tags[tok_i]) {
.r_paren => return renderToken(ais, tree, tok_i, space),
.comma => try renderToken(ais, tree, tok_i, .space),
.r_paren => {
ais.popIndent();
return renderToken(ais, tree, tok_i, space);
},
.comma => {
if (token_tags[tok_i + 1] == .r_paren) {
ais.popIndent();
return renderToken(ais, tree, tok_i + 1, space);
} else {
try renderToken(ais, tree, tok_i, .space);
}
},
else => unreachable,
}
}
} else {
// asm ("foo")
try renderExpression(gpa, ais, tree, asm_node.ast.template, .none);
ais.popIndent();
return renderToken(ais, tree, asm_node.ast.rparen, space); // rparen
}
}