Open
Description
const hello = `package aa
import "fmt"
func foo[A fmt.Stringer]() int {
a := make([]A, 128)
a[1].String()
return len(a)
}
func bar() {
foo[fmt.Stringer]()
}
`
func main() {
// Parse the source files.
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, "hello.go", hello, parser.ParseComments|parser.SkipObjectResolution)
if err != nil {
fmt.Print(err) // parse error
return
}
files := []*ast.File{f}
// Create the type-checker's package.
pkg := types.NewPackage("hello", "")
// Type-check the package, load dependencies.
// Create and build the SSA program.
_, _, err = ssautil.BuildPackage(
&types.Config{Importer: importer.Default()}, fset, pkg, files, ssa.SanityCheckFunctions|ssa.GlobalDebug|ssa.LogSource|ssa.InstantiateGenerics)
if err != nil {
fmt.Print(err) // type error in some package
return
}
}
$ go run .
build package hello
build hello.init @ -
build hello.init @ - end
build hello.foo @ hello.go:5:6
build hello.foo @ hello.go:5:6 end
build hello.bar @ hello.go:11:6
build hello.bar @ hello.go:11:6 end
build hello.foo[fmt.Stringer] @ hello.go:5:6
build hello.foo[fmt.Stringer] @ hello.go:5:6 end
build package hello end
panic: in hello.foo[fmt.Stringer]: cannot convert term slice t0[:128:int] ([]fmt.Stringer [within []fmt.Stringer]) to type []fmt.Stringer [within []fmt.Stringer]
goroutine 1 [running]:
golang.org/x/tools/go/ssa.emitConv.func1({0x726cd8, 0xc000244d60}, {0x726cd8, 0xc000244d40})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/emit.go:311 +0x339
golang.org/x/tools/go/ssa.emitConv.func2.1({0x726cd8?, 0xc000244d40?})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/emit.go:320 +0x4c
golang.org/x/tools/go/ssa.underIs.func1({0xc0001ef448?, 0x2?}, {0x726cd8?, 0xc000244d40?})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/typeset.go:100 +0x34
golang.org/x/tools/go/ssa.typeset({0x726cd8?, 0xc000244d40?}, 0xc0001ef4a0)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/typeset.go:45 +0x103
golang.org/x/tools/go/ssa.underIs({0x726cd8?, 0xc000244d40?}, 0xc0001ef530?)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/typeset.go:99 +0x45
golang.org/x/tools/go/ssa.emitConv.func2({0x726cd8?, 0xc000244d60?})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/emit.go:318 +0x58
golang.org/x/tools/go/ssa.underIs.func1({0xc0001b3f80?, 0x10?}, {0x726cd8?, 0xc000244d60?})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/typeset.go:100 +0x34
golang.org/x/tools/go/ssa.typeset({0x726cd8?, 0xc000244d60?}, 0xc0001ef5c0)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/typeset.go:45 +0x103
golang.org/x/tools/go/ssa.underIs({0x726cd8?, 0xc000244d60?}, 0xc000244d60?)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/typeset.go:99 +0x45
golang.org/x/tools/go/ssa.emitConv(0xc000272e00, {0x7dd9cca91f90, 0xc0001d9300}, {0x726cd8, 0xc000244d40})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/emit.go:317 +0x67b
golang.org/x/tools/go/ssa.emitStore(0xc000272e00, {0x729c18, 0xc000232fc0}, {0x7dd9cca91f90, 0xc0001d9300}, 0x3d)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/emit.go:418 +0x58
golang.org/x/tools/go/ssa.(*address).store(0xc0002418c0, 0xc000272e00, {0x7dd9cca91f90?, 0xc0001d9300?})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/lvalue.go:42 +0x45
golang.org/x/tools/go/ssa.(*storebuf).emit(...)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:543
golang.org/x/tools/go/ssa.(*builder).assignStmt(0xc0002407e0, 0xc000272e00, {0xc0000141c0, 0x1, 0x3?}, {0xc0000141e0, 0x1, 0xc000241f80?}, 0x1)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:1223 +0x41c
golang.org/x/tools/go/ssa.(*builder).stmt(0xc0002407e0, 0xc000272e00, {0x727880?, 0xc00010e500?})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:2712 +0xd13
golang.org/x/tools/go/ssa.(*builder).stmtList(...)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:964
golang.org/x/tools/go/ssa.(*builder).stmt(0xc0002407e0, 0xc000272e00, {0x727790?, 0xc00007e8a0?})
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:2745 +0x1046
golang.org/x/tools/go/ssa.(*builder).buildFromSyntax(0xc0002407e0, 0xc000272e00)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:2951 +0x265
golang.org/x/tools/go/ssa.(*builder).buildFunction(0xc0002407e0?, 0xc000272e00)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:2904 +0x186
golang.org/x/tools/go/ssa.(*builder).iterate(0xc0002407e0)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:2889 +0x25
golang.org/x/tools/go/ssa.(*Package).build(0xc0001d8b80)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:3172 +0xce
sync.(*Once).doSlow(0xc000234e10?, 0xc000032720?)
/usr/lib/go/src/sync/once.go:76 +0xb4
sync.(*Once).Do(...)
/usr/lib/go/src/sync/once.go:67
golang.org/x/tools/go/ssa.(*Package).Build(...)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/builder.go:3161
golang.org/x/tools/go/ssa/ssautil.BuildPackage(0xc0001308c0, 0xc00010e3c0, 0xc000032720, {0xc0000580b0, 0x1, 0x1}, 0x14c)
/home/mateusz/go/pkg/mod/golang.org/x/[email protected]/go/ssa/ssautil/load.go:187 +0x475
main.main()
/tmp/cc/main.go:44 +0x17c
exit status 2
This happens only when ssa.InstantiateGenerics
is passed to BuildPackage
.
CC @adonovan @timothy-king per https://dev.golang.org/owners
Activity