cmd/compile: lookup methods of base type for named pointer type

Passed toolstash-check.

Updates #21738
Fixes #21934

Change-Id: I59f0b2c9890146565ff913b04aeeeff7dc7a4499
Reviewed-on: https://go-review.googlesource.com/c/go/+/197561
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Cuong Manh Le 2019-09-29 23:42:42 +07:00 committed by Matthew Dempsky
parent 0fb95e788e
commit 047141797c
2 changed files with 32 additions and 1 deletions

View File

@ -1189,7 +1189,12 @@ func lookdot0(s *types.Sym, t *types.Type, save **types.Field, ignorecase bool)
}
}
u = methtype(t)
u = t
if t.Sym != nil && t.IsPtr() && !t.Elem().IsPtr() {
// If t is a defined pointer type, then x.m is shorthand for (*x).m.
u = t.Elem()
}
u = methtype(u)
if u != nil {
for _, f := range u.Methods().Slice() {
if f.Embedded == 0 && (f.Sym == s || (ignorecase && strings.EqualFold(f.Sym.Name, s.Name))) {

View File

@ -0,0 +1,26 @@
// errorcheck
// Copyright 2019 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.
// selector expression resolves incorrectly for defined
// pointer types.
package main
type E struct{ f int }
type T struct{ E }
func (*T) f() int { return 0 }
type P *T
type PP **T
func main() {
var x P
_ = x.f // ERROR "x\.f undefined \(type P has no field or method f\)"
var y PP
_ = y.f // ERROR "y\.f undefined \(type PP has no field or method f\)"
}