mirror of
https://github.com/golang/go
synced 2024-11-02 11:50:30 +00:00
dcb5e0392e
Allow full compilation and running of simple programs with generic functions by stenciling on the fly the needed generic functions. Deal with some simple derived types based on type params. Include a few new typeparam tests min.go and add.go which involve fully compiling and running simple generic code. Change-Id: Ifc2a64ecacdbd860faaeee800e2ef49ffef9df5e Reviewed-on: https://go-review.googlesource.com/c/go/+/289630 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Dan Scales <danscales@google.com> Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
50 lines
945 B
Go
50 lines
945 B
Go
// 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.
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
func add[T interface{ type int, float64 }](vec []T) T {
|
|
var sum T
|
|
for _, elt := range vec {
|
|
sum = sum + elt
|
|
}
|
|
return sum
|
|
}
|
|
|
|
func abs(f float64) float64 {
|
|
if f < 0.0 {
|
|
return -f
|
|
}
|
|
return f
|
|
}
|
|
|
|
func main() {
|
|
vec1 := []int{3, 4}
|
|
vec2 := []float64{5.8, 9.6}
|
|
want := vec1[0] + vec1[1]
|
|
got := add[int](vec1)
|
|
if want != got {
|
|
panic(fmt.Sprintf("Want %d, got %d", want, got))
|
|
}
|
|
got = add(vec1)
|
|
if want != got {
|
|
panic(fmt.Sprintf("Want %d, got %d", want, got))
|
|
}
|
|
|
|
fwant := vec2[0] + vec2[1]
|
|
fgot := add[float64](vec2)
|
|
if abs(fgot - fwant) > 1e-10 {
|
|
panic(fmt.Sprintf("Want %f, got %f", fwant, fgot))
|
|
}
|
|
fgot = add(vec2)
|
|
if abs(fgot - fwant) > 1e-10 {
|
|
panic(fmt.Sprintf("Want %f, got %f", fwant, fgot))
|
|
}
|
|
}
|