| package main | 
 |  | 
 | // Test of promotion of methods of an interface embedded within a | 
 | // struct.  In particular, this test exercises that the correct | 
 | // method is called. | 
 |  | 
 | type I interface { | 
 | 	one() int | 
 | 	two() string | 
 | } | 
 |  | 
 | type S struct { | 
 | 	I | 
 | } | 
 |  | 
 | type impl struct{} | 
 |  | 
 | func (impl) one() int { | 
 | 	return 1 | 
 | } | 
 |  | 
 | func (impl) two() string { | 
 | 	return "two" | 
 | } | 
 |  | 
 | func main() { | 
 | 	var s S | 
 | 	s.I = impl{} | 
 | 	if one := s.I.one(); one != 1 { | 
 | 		panic(one) | 
 | 	} | 
 | 	if one := s.one(); one != 1 { | 
 | 		panic(one) | 
 | 	} | 
 | 	closOne := s.I.one | 
 | 	if one := closOne(); one != 1 { | 
 | 		panic(one) | 
 | 	} | 
 | 	closOne = s.one | 
 | 	if one := closOne(); one != 1 { | 
 | 		panic(one) | 
 | 	} | 
 |  | 
 | 	if two := s.I.two(); two != "two" { | 
 | 		panic(two) | 
 | 	} | 
 | 	if two := s.two(); two != "two" { | 
 | 		panic(two) | 
 | 	} | 
 | 	closTwo := s.I.two | 
 | 	if two := closTwo(); two != "two" { | 
 | 		panic(two) | 
 | 	} | 
 | 	closTwo = s.two | 
 | 	if two := closTwo(); two != "two" { | 
 | 		panic(two) | 
 | 	} | 
 | } |