mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-06 12:03:41 +00:00
compiler: fix a few crashes due to named types
There were a few cases left where a named type would cause a crash in the compiler. While going through enough code would have found them eventually, I specifically looked for the `Type().(` pattern: a Type() call that is then used in a type assert. Most of those were indeed bugs, although for some I couldn't come up with a reproducer so I left them as-is.
This commit is contained in:
committed by
Ron Evans
parent
4ca2d3f0cf
commit
c248418dbe
Vendored
+11
@@ -8,6 +8,8 @@ import (
|
||||
|
||||
var wg sync.WaitGroup
|
||||
|
||||
type intchan chan int
|
||||
|
||||
func main() {
|
||||
ch := make(chan int, 2)
|
||||
ch <- 1
|
||||
@@ -40,6 +42,15 @@ func main() {
|
||||
_ = make(chan int, uint32(2))
|
||||
_ = make(chan int, uint64(2))
|
||||
|
||||
// Test that named channels don't crash the compiler.
|
||||
named := make(intchan, 1)
|
||||
named <- 3
|
||||
<-named
|
||||
select {
|
||||
case <-named:
|
||||
default:
|
||||
}
|
||||
|
||||
// Test bigger values
|
||||
ch2 := make(chan complex128)
|
||||
wg.Add(1)
|
||||
|
||||
Vendored
+12
@@ -68,6 +68,8 @@ func main() {
|
||||
m.Unlock()
|
||||
println("done")
|
||||
|
||||
startSimpleFunc(emptyFunc)
|
||||
|
||||
time.Sleep(2 * time.Millisecond)
|
||||
}
|
||||
|
||||
@@ -100,6 +102,11 @@ func sleepFuncValue(fn func(int)) {
|
||||
go fn(8)
|
||||
}
|
||||
|
||||
func startSimpleFunc(fn simpleFunc) {
|
||||
// Test that named function types don't crash the compiler.
|
||||
go fn()
|
||||
}
|
||||
|
||||
func nowait() {
|
||||
println("non-blocking goroutine")
|
||||
}
|
||||
@@ -115,3 +122,8 @@ func (i *myPrinter) Print() {
|
||||
time.Sleep(time.Millisecond)
|
||||
println("async interface method call")
|
||||
}
|
||||
|
||||
type simpleFunc func()
|
||||
|
||||
func emptyFunc() {
|
||||
}
|
||||
|
||||
Vendored
+5
@@ -31,6 +31,7 @@ func main() {
|
||||
assert(len(make([]int, makeUint32(2), makeUint32(3))) == 2)
|
||||
assert(len(make([]int, makeUint64(2), makeUint64(3))) == 2)
|
||||
assert(len(make([]int, makeUintptr(2), makeUintptr(3))) == 2)
|
||||
assert(len(make([]int, makeMyUint8(2), makeMyUint8(3))) == 2)
|
||||
|
||||
// indexing into a slice with uncommon index types
|
||||
assert(foo[int(2)] == 4)
|
||||
@@ -131,6 +132,9 @@ func main() {
|
||||
var named MySlice
|
||||
assert(len(unnamed[:]) == 32)
|
||||
assert(len(named[:]) == 32)
|
||||
for _, c := range named {
|
||||
assert(c == 0)
|
||||
}
|
||||
}
|
||||
|
||||
func printslice(name string, s []int) {
|
||||
@@ -169,3 +173,4 @@ func makeUint16(x uint16) uint16 { return x }
|
||||
func makeUint32(x uint32) uint32 { return x }
|
||||
func makeUint64(x uint64) uint64 { return x }
|
||||
func makeUintptr(x uintptr) uintptr { return x }
|
||||
func makeMyUint8(x myUint8) myUint8 { return x }
|
||||
|
||||
Reference in New Issue
Block a user