runtime: allow ranging over a nil map

This appears to be allowed by the specification, at least it is allowed
by the main Go implementation: https://play.golang.org/p/S8jxAMytKDB

Allow it in TinyGo too, for consistency.

Found because it is triggered with `tinygo test flags`. This doesn't
make the flags package pass all tests, but is a step closer.
Этот коммит содержится в:
Ayke van Laethem 2020-10-29 16:51:05 +01:00 коммит произвёл Ron Evans
родитель 69e1aa4878
коммит e99b8a24fe
2 изменённых файлов: 10 добавлений и 0 удалений

Просмотреть файл

@ -261,6 +261,13 @@ func hashmapDelete(m *hashmap, key unsafe.Pointer, hash uint32, keyEqual func(x,
// Iterate over a hashmap.
//go:nobounds
func hashmapNext(m *hashmap, it *hashmapIterator, key, value unsafe.Pointer) bool {
if m == nil {
// Iterating over a nil slice appears to be allowed by the Go spec:
// https://groups.google.com/g/golang-nuts/c/gVgVLQU1FFE?pli=1
// https://play.golang.org/p/S8jxAMytKDB
return false
}
numBuckets := uintptr(1) << m.bucketBits
for {
if it.bucketIndex >= 8 {

3
testdata/map.go предоставленный
Просмотреть файл

@ -49,6 +49,9 @@ func main() {
println(testmapIntInt[2])
testmapIntInt[2] = 42
println(testmapIntInt[2])
for k := range nilmap {
println(k) // unreachable
}
arrKey := ArrayKey([4]byte{4, 3, 2, 1})
println(testMapArrayKey[arrKey])