]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: fix missing condition in usemethod
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Thu, 22 Jul 2021 16:54:19 +0000 (23:54 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Thu, 22 Jul 2021 17:48:41 +0000 (17:48 +0000)
CL 330670 simplified usemethod, but dropped the previous condition to
ensure the function have 1 or 2 result. This CL restore that condition,
and also add a test for it.

Change-Id: I434e3736785b43ceea0b386d8d9d01ad78a4ccd2
Reviewed-on: https://go-review.googlesource.com/c/go/+/336609
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/walk/expr.go
test/reflectmethod8.go [new file with mode: 0644]

index 19fb18852644c2f34f8923ab34bc711bfbff5043..eed6ef86c23eb173f20f86a05ef93e5a2b5b51ee 100644 (file)
@@ -957,7 +957,14 @@ func usemethod(n *ir.CallExpr) {
        if t.NumParams() != 1 || t.Params().Field(0).Type.Kind() != pKind {
                return
        }
-       if t.NumResults() == 2 && t.Results().Field(1).Type.Kind() != types.TBOOL {
+       switch t.NumResults() {
+       case 1:
+               // ok
+       case 2:
+               if t.Results().Field(1).Type.Kind() != types.TBOOL {
+                       return
+               }
+       default:
                return
        }
 
diff --git a/test/reflectmethod8.go b/test/reflectmethod8.go
new file mode 100644 (file)
index 0000000..482163b
--- /dev/null
@@ -0,0 +1,26 @@
+// compile
+
+// Copyright 2021 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.
+
+// Make sure that the compiler can analyze non-reflect
+// Type.{Method,MethodByName} calls.
+
+package p
+
+type I interface {
+       MethodByName(string)
+       Method(int)
+}
+
+type M struct{}
+
+func (M) MethodByName(string) {}
+func (M) Method(int)          {}
+
+func f() {
+       var m M
+       I.MethodByName(m, "")
+       I.Method(m, 42)
+}