mirror of
https://github.com/golang/go
synced 2024-11-26 09:08:07 -07:00
[dev.regabi] cmd/compile: fix printing of method expressions
OTYPE and OMETHEXPR were missing from OpPrec. So add them with the same precedences as OT{ARRAY,MAP,STRUCT,etc} and ODOT{,METH,INTER,etc}, respectively. However, ODEREF (which is also used for pointer types *T) has a lower precedence than other types, so pointer types need to be specially handled to assign them their correct, lower precedence. Incidentally, this also improves the error messages in issue15055.go, where we were adding unnecessary parentheses around the types in conversion expressions. Thanks to Cuong Manh Le for writing the test cases for #43428. Fixes #43428. Change-Id: I57e7979babe3ed9ef8a8b5a2a3745e3737dd785f Reviewed-on: https://go-review.googlesource.com/c/go/+/280873 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
178c667db2
commit
477b049060
@ -216,6 +216,7 @@ var OpPrec = []int{
|
||||
OTINTER: 8,
|
||||
OTMAP: 8,
|
||||
OTSTRUCT: 8,
|
||||
OTYPE: 8,
|
||||
OINDEXMAP: 8,
|
||||
OINDEX: 8,
|
||||
OSLICE: 8,
|
||||
@ -232,6 +233,7 @@ var OpPrec = []int{
|
||||
ODOT: 8,
|
||||
OXDOT: 8,
|
||||
OCALLPART: 8,
|
||||
OMETHEXPR: 8,
|
||||
OPLUS: 7,
|
||||
ONOT: 7,
|
||||
OBITNOT: 7,
|
||||
@ -551,8 +553,8 @@ func exprFmt(n Node, s fmt.State, prec int) {
|
||||
}
|
||||
|
||||
nprec := OpPrec[n.Op()]
|
||||
if n.Op() == OTYPE && n.Sym() != nil {
|
||||
nprec = 8
|
||||
if n.Op() == OTYPE && n.Type().IsPtr() {
|
||||
nprec = OpPrec[ODEREF]
|
||||
}
|
||||
|
||||
if prec > nprec {
|
||||
|
@ -8,10 +8,12 @@ package main
|
||||
|
||||
func main() {
|
||||
type name string
|
||||
_ = []byte("abc", "def", 12) // ERROR "too many arguments to conversion to \[\]byte: \(\[\]byte\)\(.abc., .def., 12\)"
|
||||
_ = []byte("abc", "def", 12) // ERROR "too many arguments to conversion to \[\]byte: \[\]byte\(.abc., .def., 12\)"
|
||||
_ = string("a", "b", nil) // ERROR "too many arguments to conversion to string: string\(.a., .b., nil\)"
|
||||
_ = []byte() // ERROR "missing argument to conversion to \[\]byte: \(\[\]byte\)\(\)"
|
||||
_ = []byte() // ERROR "missing argument to conversion to \[\]byte: \[\]byte\(\)"
|
||||
_ = string() // ERROR "missing argument to conversion to string: string\(\)"
|
||||
_ = *int() // ERROR "missing argument to conversion to int: int\(\)"
|
||||
_ = (*int)() // ERROR "missing argument to conversion to \*int: \(\*int\)\(\)"
|
||||
_ = name("a", 1, 3.3) // ERROR "too many arguments to conversion to name: name\(.a., 1, 3.3\)"
|
||||
_ = map[string]string(nil, nil) // ERROR "too many arguments to conversion to map\[string\]string: \(map\[string\]string\)\(nil, nil\)"
|
||||
_ = map[string]string(nil, nil) // ERROR "too many arguments to conversion to map\[string\]string: map\[string\]string\(nil, nil\)"
|
||||
}
|
||||
|
25
test/fixedbugs/issue43428.go
Normal file
25
test/fixedbugs/issue43428.go
Normal file
@ -0,0 +1,25 @@
|
||||
// errorcheck
|
||||
|
||||
// Copyright 2020 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package p
|
||||
|
||||
import "time"
|
||||
|
||||
type T int
|
||||
|
||||
func (T) Mv() {}
|
||||
func (*T) Mp() {}
|
||||
|
||||
var _ = []int{
|
||||
T.Mv, // ERROR "cannot use T\.Mv|incompatible type"
|
||||
(*T).Mv, // ERROR "cannot use \(\*T\)\.Mv|incompatible type"
|
||||
(*T).Mp, // ERROR "cannot use \(\*T\)\.Mp|incompatible type"
|
||||
|
||||
time.Time.GobEncode, // ERROR "cannot use time\.Time\.GobEncode|incompatible type"
|
||||
(*time.Time).GobEncode, // ERROR "cannot use \(\*time\.Time\)\.GobEncode|incompatible type"
|
||||
(*time.Time).GobDecode, // ERROR "cannot use \(\*time\.Time\)\.GobDecode|incompatible type"
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user