diff --git a/go/ssa/builder.go b/go/ssa/builder.go index c3b7db98..8e5c2c29 100644 --- a/go/ssa/builder.go +++ b/go/ssa/builder.go @@ -1641,7 +1641,7 @@ func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type) (k, v Value X: x, Index: k, } - instr.setType(types.NewPointer(t.Elem().(*types.Array).Elem())) + instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())) v = emitLoad(fn, fn.emit(instr)) case *types.Slice: diff --git a/go/ssa/interp/testdata/coverage.go b/go/ssa/interp/testdata/coverage.go index 628f315b..9ce5cd1e 100644 --- a/go/ssa/interp/testdata/coverage.go +++ b/go/ssa/interp/testdata/coverage.go @@ -642,3 +642,16 @@ func bug7840() bool { // This creates a single-predecessor block with a φ-node. return false && a == 0 && a == 0 } + +// Regression test for range of pointer to named array type. +func init() { + type intarr [3]int + ia := intarr{1, 2, 3} + var count int + for _, x := range &ia { + count += x + } + if count != 6 { + panic(count) + } +}