mirror of
https://github.com/golang/go
synced 2024-11-17 22:24:47 -07:00
08a598f8c1
The recent refactoring of SelectorExpr code to helpers broke the handling of MethodExprs when there is an embedded field involved (e.g. test/method7.go, line 48). If there is an embedded field involved, the node op seen in DotMethod() is an ODOT rather than an OTYPE. Also, the receiver type of the result should be the original type, but the new code was using the last type after following the embedding path. Change-Id: I13f7ea6448b03d3e8f974103ee3a027219ca8388 Reviewed-on: https://go-review.googlesource.com/c/go/+/286176 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Dan Scales <danscales@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
68 lines
1.1 KiB
Go
68 lines
1.1 KiB
Go
// run
|
|
|
|
// Copyright 2017 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.
|
|
|
|
// Test forms of method expressions T.m where T is
|
|
// a literal type.
|
|
|
|
package main
|
|
|
|
var got, want string
|
|
|
|
type I interface {
|
|
m()
|
|
}
|
|
|
|
type S struct {
|
|
}
|
|
|
|
func (S) m() { got += " m()" }
|
|
func (S) m1(s string) { got += " m1(" + s + ")" }
|
|
|
|
type T int
|
|
|
|
func (T) m2() { got += " m2()" }
|
|
|
|
type Outer struct{ *Inner }
|
|
type Inner struct{ s string }
|
|
|
|
func (i Inner) M() string { return i.s }
|
|
|
|
func main() {
|
|
// method expressions with named receiver types
|
|
I.m(S{})
|
|
want += " m()"
|
|
|
|
S.m1(S{}, "a")
|
|
want += " m1(a)"
|
|
|
|
// method expressions with literal receiver types
|
|
f := interface{ m1(string) }.m1
|
|
f(S{}, "b")
|
|
want += " m1(b)"
|
|
|
|
interface{ m1(string) }.m1(S{}, "c")
|
|
want += " m1(c)"
|
|
|
|
x := S{}
|
|
interface{ m1(string) }.m1(x, "d")
|
|
want += " m1(d)"
|
|
|
|
g := struct{ T }.m2
|
|
g(struct{ T }{})
|
|
want += " m2()"
|
|
|
|
if got != want {
|
|
panic("got" + got + ", want" + want)
|
|
}
|
|
|
|
h := (*Outer).M
|
|
got := h(&Outer{&Inner{"hello"}})
|
|
want := "hello"
|
|
if got != want {
|
|
panic("got " + got + ", want " + want)
|
|
}
|
|
}
|