]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] cmd/compile: fix printing of method expressions
authorMatthew Dempsky <mdempsky@google.com>
Thu, 31 Dec 2020 02:43:10 +0000 (18:43 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 31 Dec 2020 05:52:09 +0000 (05:52 +0000)
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>
src/cmd/compile/internal/ir/fmt.go
test/fixedbugs/issue15055.go
test/fixedbugs/issue43428.go [new file with mode: 0644]

index 6209702291bd5bad86465061faa734e4293a2ba1..92ea160a28bf312da54bedc95ca93b1f6aed2e83 100644 (file)
@@ -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 {
index e58047e411caa50f2864992c7215af89b600f5f4..33cf63aaad8d1eb1a4543de5bf2ce148732c5cbe 100644 (file)
@@ -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\)"
 }
diff --git a/test/fixedbugs/issue43428.go b/test/fixedbugs/issue43428.go
new file mode 100644 (file)
index 0000000..773a3f3
--- /dev/null
@@ -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"
+
+}