| 
									
										
										
										
											2021-02-08 14:33:51 -08:00
										 |  |  | // run -gcflags=-G=3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Test method calls on type parameters | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"reflect" | 
					
						
							|  |  |  | 	"strconv" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Simple constraint | 
					
						
							|  |  |  | type Stringer interface { | 
					
						
							|  |  |  | 	String() string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func stringify[T Stringer](s []T) (ret []string) { | 
					
						
							|  |  |  | 	for _, v := range s { | 
					
						
							|  |  |  | 		ret = append(ret, v.String()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return ret | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type myint int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (i myint) String() string { | 
					
						
							|  |  |  | 	return strconv.Itoa(int(i)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Constraint with an embedded interface, but still only requires String() | 
					
						
							|  |  |  | type Stringer2 interface { | 
					
						
							|  |  |  | 	CanBeStringer2() int | 
					
						
							|  |  |  | 	SubStringer2 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type SubStringer2 interface { | 
					
						
							|  |  |  | 	CanBeSubStringer2() int | 
					
						
							|  |  |  | 	String() string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func stringify2[T Stringer2](s []T) (ret []string) { | 
					
						
							|  |  |  | 	for _, v := range s { | 
					
						
							|  |  |  | 		ret = append(ret, v.String()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return ret | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (myint) CanBeStringer2() int { | 
					
						
							|  |  |  | 	return 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (myint) CanBeSubStringer2() int { | 
					
						
							|  |  |  | 	return 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Test use of method values that are not called | 
					
						
							|  |  |  | func stringify3[T Stringer](s []T) (ret []string) { | 
					
						
							|  |  |  | 	for _, v := range s { | 
					
						
							|  |  |  | 		f := v.String | 
					
						
							|  |  |  | 		ret = append(ret, f()) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return ret | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func main() { | 
					
						
							|  |  |  | 	x := []myint{myint(1), myint(2), myint(3)} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	got := stringify(x) | 
					
						
							|  |  |  | 	want := []string{"1", "2", "3"} | 
					
						
							|  |  |  | 	if !reflect.DeepEqual(got, want) { | 
					
						
							| 
									
										
											  
											
												[dev.typeparams] cmd/compile: small fixes for stenciling
 - Create the stencil name using targ.Type.String(), which handles cases
   where, for example, a type argument is a pointer to a named type,
   etc. *obj.
 - Set name.Def properly for a new stenciled func (have the symbol point
   back to the associated function node).  Will be required when exporting.
 - Add missing copying of Func field when making copies of Name nodes.
   (On purpose (it seems), Name nodes don't have a copy() function, so
   we have to copy all the needed fields explicitly.)
 - Deal with nil type in subster.node(), which is the type of the return
   value for a function that doesn't return anything.
 - Fix min to match standard want/go form, and add in float tests.  Changed
   Got -> got in bunch of other typeparam tests.
 - Add new tests index.go, settable.go, and smallest.go (similar to
   examples in the type param proposal), some of which need the above
   changes.
Change-Id: I09a72302bc1fd3635a326da92405222afa222e85
Reviewed-on: https://go-review.googlesource.com/c/go/+/291109
Trust: Dan Scales <danscales@google.com>
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
											
										 
											2021-02-10 15:26:40 -08:00
										 |  |  | 		panic(fmt.Sprintf("got %s, want %s", got, want)) | 
					
						
							| 
									
										
										
										
											2021-02-08 14:33:51 -08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	got = stringify2(x) | 
					
						
							|  |  |  | 	if !reflect.DeepEqual(got, want) { | 
					
						
							| 
									
										
											  
											
												[dev.typeparams] cmd/compile: small fixes for stenciling
 - Create the stencil name using targ.Type.String(), which handles cases
   where, for example, a type argument is a pointer to a named type,
   etc. *obj.
 - Set name.Def properly for a new stenciled func (have the symbol point
   back to the associated function node).  Will be required when exporting.
 - Add missing copying of Func field when making copies of Name nodes.
   (On purpose (it seems), Name nodes don't have a copy() function, so
   we have to copy all the needed fields explicitly.)
 - Deal with nil type in subster.node(), which is the type of the return
   value for a function that doesn't return anything.
 - Fix min to match standard want/go form, and add in float tests.  Changed
   Got -> got in bunch of other typeparam tests.
 - Add new tests index.go, settable.go, and smallest.go (similar to
   examples in the type param proposal), some of which need the above
   changes.
Change-Id: I09a72302bc1fd3635a326da92405222afa222e85
Reviewed-on: https://go-review.googlesource.com/c/go/+/291109
Trust: Dan Scales <danscales@google.com>
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
											
										 
											2021-02-10 15:26:40 -08:00
										 |  |  | 		panic(fmt.Sprintf("got %s, want %s", got, want)) | 
					
						
							| 
									
										
										
										
											2021-02-08 14:33:51 -08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	got = stringify3(x) | 
					
						
							|  |  |  | 	if !reflect.DeepEqual(got, want) { | 
					
						
							| 
									
										
											  
											
												[dev.typeparams] cmd/compile: small fixes for stenciling
 - Create the stencil name using targ.Type.String(), which handles cases
   where, for example, a type argument is a pointer to a named type,
   etc. *obj.
 - Set name.Def properly for a new stenciled func (have the symbol point
   back to the associated function node).  Will be required when exporting.
 - Add missing copying of Func field when making copies of Name nodes.
   (On purpose (it seems), Name nodes don't have a copy() function, so
   we have to copy all the needed fields explicitly.)
 - Deal with nil type in subster.node(), which is the type of the return
   value for a function that doesn't return anything.
 - Fix min to match standard want/go form, and add in float tests.  Changed
   Got -> got in bunch of other typeparam tests.
 - Add new tests index.go, settable.go, and smallest.go (similar to
   examples in the type param proposal), some of which need the above
   changes.
Change-Id: I09a72302bc1fd3635a326da92405222afa222e85
Reviewed-on: https://go-review.googlesource.com/c/go/+/291109
Trust: Dan Scales <danscales@google.com>
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
											
										 
											2021-02-10 15:26:40 -08:00
										 |  |  | 		panic(fmt.Sprintf("got %s, want %s", got, want)) | 
					
						
							| 
									
										
										
										
											2021-02-08 14:33:51 -08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |