mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-07-30 08:38:41 +00:00
73db9776b1
Add cases where same-named local aliases instantiate generic functions, local types, and methods with float32 and float64. Record the current collisions and incorrect results.
68 lines
1019 B
Go
68 lines
1019 B
Go
package main
|
|
|
|
import "unsafe"
|
|
|
|
type Coord interface {
|
|
int | float32
|
|
}
|
|
|
|
type Point[T Coord] struct {
|
|
X, Y T
|
|
}
|
|
|
|
func Add[T Coord](a, b Point[T]) Point[T] {
|
|
checkSize(unsafe.Alignof(a))
|
|
checkSize(unsafe.Sizeof(a))
|
|
return Point[T]{
|
|
X: a.X + b.X,
|
|
Y: a.Y + b.Y,
|
|
}
|
|
}
|
|
|
|
func aliasSize[F float32 | float64]() uintptr {
|
|
return unsafe.Sizeof(F(0))
|
|
}
|
|
|
|
func aliasSize32() uintptr {
|
|
type F = float32
|
|
return aliasSize[F]()
|
|
}
|
|
|
|
func aliasSize64() uintptr {
|
|
type F = float64
|
|
return aliasSize[F]()
|
|
}
|
|
|
|
type aliasMethodResult[F float32 | float64] struct {
|
|
Value F
|
|
}
|
|
|
|
type aliasMethodValue[F float32 | float64] struct{}
|
|
|
|
func (aliasMethodValue[F]) Get() aliasMethodResult[F] {
|
|
return aliasMethodResult[F]{}
|
|
}
|
|
|
|
func main() {
|
|
var af, bf Point[float32]
|
|
Add(af, bf)
|
|
|
|
var ai, bi Point[int]
|
|
Add(ai, bi)
|
|
|
|
checkSize(aliasSize32())
|
|
checkSize(aliasSize64())
|
|
}
|
|
|
|
func checkSize(uintptr)
|
|
|
|
func checkBool(bool)
|
|
|
|
func aliasMethod32(x any) {
|
|
type F = float32
|
|
_, ok := x.(interface {
|
|
Get() aliasMethodResult[F]
|
|
})
|
|
checkBool(ok)
|
|
}
|