Skip to content

x/tools/go/ssa: panic in emitConv in InstantiateGenerics mode #71899

Open
@mateusz834

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    BugReportIssues describing a possible bug in the Go implementation.ToolsThis label describes issues relating to any tools in the x/tools repository.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions