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.
Этот коммит содержится в:
родитель
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
предоставленный
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])
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче