mirror of
https://github.com/golang/go
synced 2024-11-05 18:36:08 +00:00
cmd/compile: fix ICE due to missing inline function body
For golang.org/cl/74110, I forgot that you can use range-based for loops to extract key values from a map value. This wasn't a problem for the binary format importer, because it was more tolerant about missing inline function bodies. However, the indexed importer is more particular about this. We could potentially just make it more lenient like the binary importer, but tweaking the logic here is easy enough and seems like the preferable solution. Fixes #26341. Change-Id: I54564dcd0be60ea393f8a0f6954b7d3d61e96ee5 Reviewed-on: https://go-review.googlesource.com/123475 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Heschi Kreinick <heschi@google.com>
This commit is contained in:
parent
6b89194c28
commit
cc422e64d0
4 changed files with 45 additions and 11 deletions
|
@ -464,19 +464,22 @@ func (p *exporter) markType(t *types.Type) {
|
|||
}
|
||||
|
||||
// Recursively mark any types that can be produced given a
|
||||
// value of type t: dereferencing a pointer; indexing an
|
||||
// array, slice, or map; receiving from a channel; accessing a
|
||||
// struct field or interface method; or calling a function.
|
||||
// value of type t: dereferencing a pointer; indexing or
|
||||
// iterating over an array, slice, or map; receiving from a
|
||||
// channel; accessing a struct field or interface method; or
|
||||
// calling a function.
|
||||
//
|
||||
// Notably, we don't mark map key or function parameter types,
|
||||
// because the user already needs some way to construct values
|
||||
// of those types.
|
||||
//
|
||||
// It's not critical for correctness that this algorithm is
|
||||
// perfect. Worst case, we might miss opportunities to inline
|
||||
// some function calls in downstream packages.
|
||||
// Notably, we don't mark function parameter types, because
|
||||
// the user already needs some way to construct values of
|
||||
// those types.
|
||||
switch t.Etype {
|
||||
case TPTR32, TPTR64, TARRAY, TSLICE, TCHAN, TMAP:
|
||||
case TPTR32, TPTR64, TARRAY, TSLICE, TCHAN:
|
||||
// TODO(mdempsky): Skip marking element type for
|
||||
// send-only channels?
|
||||
p.markType(t.Elem())
|
||||
|
||||
case TMAP:
|
||||
p.markType(t.Key())
|
||||
p.markType(t.Elem())
|
||||
|
||||
case TSTRUCT:
|
||||
|
|
11
test/fixedbugs/issue26341.dir/a.go
Normal file
11
test/fixedbugs/issue26341.dir/a.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package a
|
||||
|
||||
type k int
|
||||
|
||||
func (k) F() {}
|
||||
|
||||
type M map[k]int
|
13
test/fixedbugs/issue26341.dir/b.go
Normal file
13
test/fixedbugs/issue26341.dir/b.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package b
|
||||
|
||||
import "./a"
|
||||
|
||||
func f() {
|
||||
for k := range (a.M{}) {
|
||||
k.F()
|
||||
}
|
||||
}
|
7
test/fixedbugs/issue26341.go
Normal file
7
test/fixedbugs/issue26341.go
Normal file
|
@ -0,0 +1,7 @@
|
|||
// compiledir
|
||||
|
||||
// Copyright 2018 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package ignored
|
Loading…
Reference in a new issue