diff --git a/src/cmd/compile/internal/gc/bexport.go b/src/cmd/compile/internal/gc/bexport.go index 0d4997ccfc..d0b1804eb6 100644 --- a/src/cmd/compile/internal/gc/bexport.go +++ b/src/cmd/compile/internal/gc/bexport.go @@ -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: diff --git a/test/fixedbugs/issue26341.dir/a.go b/test/fixedbugs/issue26341.dir/a.go new file mode 100644 index 0000000000..4fd23c796b --- /dev/null +++ b/test/fixedbugs/issue26341.dir/a.go @@ -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 diff --git a/test/fixedbugs/issue26341.dir/b.go b/test/fixedbugs/issue26341.dir/b.go new file mode 100644 index 0000000000..30b8c25a5c --- /dev/null +++ b/test/fixedbugs/issue26341.dir/b.go @@ -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() + } +} diff --git a/test/fixedbugs/issue26341.go b/test/fixedbugs/issue26341.go new file mode 100644 index 0000000000..128cf9d06a --- /dev/null +++ b/test/fixedbugs/issue26341.go @@ -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