• Daniel Martí's avatar
    cmd/vet: unexported interface{} fields on %s are ok · f54f780d
    Daniel Martí authored
    For example, the following program is valid:
    
    	type T struct {
    		f interface{}
    	}
    
    	func main() {
    		fmt.Printf("%s", T{"foo"}) // prints {foo}
    	}
    
    Since the field is of type interface{}, we might have any value in it.
    For example, if we had T{3}, fmt would complain. However, not knowing
    what the type under the interface is, we must be conservative.
    
    However, as shown in #17798, we should issue an error if the field's
    type is statically known to implement the error or fmt.Stringer
    interfaces. In those cases, the user likely wanted the %s format to call
    those methods. Keep the vet error in those cases.
    
    While at it, add more field type test cases, such as custom error types,
    and interfaces that extend the error interface.
    
    Fixes #23563.
    
    Change-Id: I063885955555917c59da000391b603f0d6dce432
    Reviewed-on: https://go-review.googlesource.com/90516
    Run-TryBot: Daniel Martí <mvdan@mvdan.cc>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    f54f780d
print.go 22.5 KB