From: Chris Hines Date: Sun, 12 Nov 2017 05:31:52 +0000 (-0500) Subject: cmd/vet: ignore unrecognized flags for fmt.Formatter X-Git-Tag: go1.10beta1~303 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=510327012bd42aca3deac989e2e109dc71bb4605;p=gostls13.git cmd/vet: ignore unrecognized flags for fmt.Formatter Fixes #22608. Change-Id: Id85eb86b0b262156646e55f102fe888b345b20cf Reviewed-on: https://go-review.googlesource.com/77230 Run-TryBot: Russ Cox Reviewed-by: Russ Cox Reviewed-by: Rob Pike TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/vet/print.go b/src/cmd/vet/print.go index 5dc6bdf628..e10c3169b3 100644 --- a/src/cmd/vet/print.go +++ b/src/cmd/vet/print.go @@ -483,15 +483,17 @@ func (f *File) okPrintfArg(call *ast.CallExpr, state *formatState) (ok bool) { } } - if !found && !formatter { - f.Badf(call.Pos(), "%s format %s has unknown verb %c", state.name, state.format, state.verb) - return false - } - for _, flag := range state.flags { - if !strings.ContainsRune(v.flags, rune(flag)) { - f.Badf(call.Pos(), "%s format %s has unrecognized flag %c", state.name, state.format, flag) + if !formatter { + if !found { + f.Badf(call.Pos(), "%s format %s has unknown verb %c", state.name, state.format, state.verb) return false } + for _, flag := range state.flags { + if !strings.ContainsRune(v.flags, rune(flag)) { + f.Badf(call.Pos(), "%s format %s has unrecognized flag %c", state.name, state.format, flag) + return false + } + } } // Verb is good. If len(state.argNums)>trueArgs, we have something like %.*s and all // but the final arg must be an integer. diff --git a/src/cmd/vet/testdata/print.go b/src/cmd/vet/testdata/print.go index b7bc98ab56..db11e125ae 100644 --- a/src/cmd/vet/testdata/print.go +++ b/src/cmd/vet/testdata/print.go @@ -163,11 +163,12 @@ func PrintfTests() { Printf(format, "hi") // ERROR "Printf format %s reads arg #2, but call has only 1 arg$" Printf("%s %d %.3v %q", "str", 4) // ERROR "Printf format %.3v reads arg #3, but call has only 2 args" f := new(stringer) - f.Warn(0, "%s", "hello", 3) // ERROR "Warn call has possible formatting directive %s" - f.Warnf(0, "%s", "hello", 3) // ERROR "Warnf call needs 1 arg but has 2 args" - f.Warnf(0, "%r", "hello") // ERROR "Warnf format %r has unknown verb r" - f.Warnf(0, "%#s", "hello") // ERROR "Warnf format %#s has unrecognized flag #" - Printf("d%", 2) // ERROR "Printf format % is missing verb at end of string" + f.Warn(0, "%s", "hello", 3) // ERROR "Warn call has possible formatting directive %s" + f.Warnf(0, "%s", "hello", 3) // ERROR "Warnf call needs 1 arg but has 2 args" + f.Warnf(0, "%r", "hello") // ERROR "Warnf format %r has unknown verb r" + f.Warnf(0, "%#s", "hello") // ERROR "Warnf format %#s has unrecognized flag #" + fmt.Printf("%#s", FormatterVal(true)) // correct (the type is responsible for formatting) + Printf("d%", 2) // ERROR "Printf format % is missing verb at end of string" Printf("%d", percentDV) Printf("%d", &percentDV) Printf("%d", notPercentDV) // ERROR "Printf format %d has arg notPercentDV of wrong type testdata.notPercentDStruct"