Commit cc422e64 authored by Matthew Dempsky's avatar Matthew Dempsky

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: 's avatarHeschi Kreinick <heschi@google.com>
parent 6b89194c
......@@ -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:
......
// 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
// 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()
}
}
// 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment