| // run | 
 |  | 
 | // Copyright 2018 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. | 
 |  | 
 | // When computing method sets with shadowed methods, make sure we | 
 | // compute whether a method promotion involved a pointer traversal | 
 | // based on the promoted method, not the shadowed method. | 
 |  | 
 | package main | 
 |  | 
 | import ( | 
 | 	"bytes" | 
 | 	"fmt" | 
 | ) | 
 |  | 
 | type mystruct struct { | 
 | 	f int | 
 | } | 
 |  | 
 | func (t mystruct) String() string { | 
 | 	return "FAIL" | 
 | } | 
 |  | 
 | func main() { | 
 | 	type deep struct { | 
 | 		mystruct | 
 | 	} | 
 | 	s := struct { | 
 | 		deep | 
 | 		*bytes.Buffer | 
 | 	}{ | 
 | 		deep{}, | 
 | 		bytes.NewBufferString("ok"), | 
 | 	} | 
 |  | 
 | 	if got := s.String(); got != "ok" { | 
 | 		panic(got) | 
 | 	} | 
 |  | 
 | 	var i fmt.Stringer = s | 
 | 	if got := i.String(); got != "ok" { | 
 | 		panic(got) | 
 | 	} | 
 | } |