diff --git a/lib/std/zig/Ast/Render.zig b/lib/std/zig/Ast/Render.zig index d61707b36d..19abada490 100644 --- a/lib/std/zig/Ast/Render.zig +++ b/lib/std/zig/Ast/Render.zig @@ -2775,6 +2775,8 @@ fn renderAsm( ais.forceLastIndent(); // Might have been dedented by a multiline string literal assert(ais.current_line_empty); + const prev_indent_delta = ais.indent_delta; // May be part of another asm expression + // so indent_delta can't be unconditionally used ais.setIndentDelta(asm_indent_delta); const colon1 = tree.lastToken(asm_node.ast.template) + 1; @@ -2856,7 +2858,7 @@ fn renderAsm( const clobbers = asm_node.ast.clobbers.unwrap().?; try renderExpression(r, clobbers, .none); ais.forceLastIndent(); // Might have been dedented by a multiline string literal - ais.setIndentDelta(indent_delta); + ais.setIndentDelta(prev_indent_delta); ais.popIndent(); return renderToken(r, asm_node.ast.rparen, space); // rparen } diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index ca49aa2b13..bc9256f1dd 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -6859,6 +6859,18 @@ test "zig fmt: array init of labeled block" { ); } +test "zig fmt: nested asm indentation" { + try testCanonical( + \\const A = asm ("" + \\ : [_] "" (_), + \\ : + \\ : asm ("" + \\ : [_] "" (_), + \\ )); + \\ + ); +} + test "recovery: top level" { try testError( \\test "" {inline}