From 366681cc06357cfdca91c18eff059e11e5470383 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Tue, 7 Nov 2017 11:34:35 +0000 Subject: [PATCH] cmd/vet: don't warn on escaped newlines in Println MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The old code only worked for double-quoted strings, and only checked that the end of the literal value was \n". This worked most of the time, except for some strings like "foo\\n", which doesn't actually translate into a trailing newline when unquoted. To fix this, unquote the string first and look for a real newline at the end of it. Ignore errors, as we don't have anything to do with string literals using back quotes. Fixes #22613. Change-Id: I7cf96916dd578b7068216c2051ec2622cce0b740 Reviewed-on: https://go-review.googlesource.com/76194 Run-TryBot: Daniel Martí TryBot-Result: Gobot Gobot Reviewed-by: Russ Cox --- src/cmd/vet/print.go | 5 +++-- src/cmd/vet/testdata/print.go | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cmd/vet/print.go b/src/cmd/vet/print.go index 620075d118..5dc6bdf628 100644 --- a/src/cmd/vet/print.go +++ b/src/cmd/vet/print.go @@ -672,8 +672,9 @@ func (f *File) checkPrint(call *ast.CallExpr, name string) { // The last item, if a string, should not have a newline. arg = args[len(args)-1] if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING { - if strings.HasSuffix(lit.Value, `\n"`) { - f.Badf(call.Pos(), "%s args end with redundant newline", name) + str, _ := strconv.Unquote(lit.Value) + if strings.HasSuffix(str, "\n") { + f.Badf(call.Pos(), "%s arg list ends with redundant newline", name) } } } diff --git a/src/cmd/vet/testdata/print.go b/src/cmd/vet/testdata/print.go index c3f5abe4f1..b7bc98ab56 100644 --- a/src/cmd/vet/testdata/print.go +++ b/src/cmd/vet/testdata/print.go @@ -532,4 +532,9 @@ func UnexportedStringerOrError() { } fmt.Printf("%s", uef) // ERROR "Printf format %s has arg uef of wrong type testdata.unexportedErrorOtherFields" fmt.Printf("%s", &uef) // ERROR "Printf format %s has arg &uef of wrong type [*]testdata.unexportedErrorOtherFields" + + fmt.Println("foo\n", "bar") // not an error + fmt.Println("foo\n") // ERROR "Println arg list ends with redundant newline" + fmt.Println("foo\\n") // not an error + fmt.Println(`foo\n`) // not an error } -- 2.48.1