From e863204c47eb89bfefd762739943f6b2f99f2c16 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 4 May 2021 19:29:25 +0200 Subject: [PATCH] zig fmt: Fix edge case in inline asm parsing The presence of a trailing comma in the single and only input/output declaration confused the parser and made zig fmt discard any element placed after the comma. --- lib/std/zig/ast.zig | 20 +++++++++++++------- lib/std/zig/parser_test.zig | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/lib/std/zig/ast.zig b/lib/std/zig/ast.zig index a0e7754896..cab7749691 100644 --- a/lib/std/zig/ast.zig +++ b/lib/std/zig/ast.zig @@ -1979,20 +1979,26 @@ pub const Tree = struct { // asm ("foo" :: [_] "" (y) : "a", "b"); const last_input = result.inputs[result.inputs.len - 1]; const rparen = tree.lastToken(last_input); - if (token_tags[rparen + 1] == .colon and - token_tags[rparen + 2] == .string_literal) + var i = rparen + 1; + // Allow a (useless) comma right after the closing parenthesis. + if (token_tags[i] == .comma) i += 1; + if (token_tags[i] == .colon and + token_tags[i + 1] == .string_literal) { - result.first_clobber = rparen + 2; + result.first_clobber = i + 1; } } else { // asm ("foo" : [_] "" (x) :: "a", "b"); const last_output = result.outputs[result.outputs.len - 1]; const rparen = tree.lastToken(last_output); - if (token_tags[rparen + 1] == .colon and - token_tags[rparen + 2] == .colon and - token_tags[rparen + 3] == .string_literal) + var i = rparen + 1; + // Allow a (useless) comma right after the closing parenthesis. + if (token_tags[i] == .comma) i += 1; + if (token_tags[i] == .colon and + token_tags[i + 1] == .colon and + token_tags[i + 2] == .string_literal) { - result.first_clobber = rparen + 3; + result.first_clobber = i + 2; } } diff --git a/lib/std/zig/parser_test.zig b/lib/std/zig/parser_test.zig index 2fa8baa185..fe119a5d27 100644 --- a/lib/std/zig/parser_test.zig +++ b/lib/std/zig/parser_test.zig @@ -4,6 +4,38 @@ // The MIT license requires this copyright notice to be included in all copies // and substantial portions of the software. +test "zig fmt: preserves clobbers in inline asm with stray comma" { + try testTransform( + \\fn foo() void { + \\ asm volatile ("" + \\ : [_] "" (-> type), + \\ : + \\ : "clobber" + \\ ); + \\ asm volatile ("" + \\ : + \\ : [_] "" (type), + \\ : "clobber" + \\ ); + \\} + \\ + , + \\fn foo() void { + \\ asm volatile ("" + \\ : [_] "" (-> type) + \\ : + \\ : "clobber" + \\ ); + \\ asm volatile ("" + \\ : + \\ : [_] "" (type) + \\ : "clobber" + \\ ); + \\} + \\ + ); +} + test "zig fmt: respect line breaks in struct field value declaration" { try testCanonical( \\const Foo = struct {