Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/compile: internal compiler error: got untyped bool for autotmp #17551

Closed
wendigo opened this issue Oct 22, 2016 · 7 comments
Closed

cmd/compile: internal compiler error: got untyped bool for autotmp #17551

wendigo opened this issue Oct 22, 2016 · 7 comments
Labels
FrozenDueToAge NeedsFix The path to resolution is known, but the work has not been done.
Milestone

Comments

@wendigo
Copy link

wendigo commented Oct 22, 2016

Please answer these questions before submitting your issue. Thanks!

What version of Go are you using (go version)?

go version devel +eb15cf1 Sat Oct 22 01:23:14 2016 +0000 darwin/amd64

What operating system and processor architecture are you using (go env)?

GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/mateusz.gajewski/Desktop/Projects/"
GORACE=""
GOROOT="/usr/local/Cellar/go/HEAD-eb15cf1/libexec"
GOTOOLDIR="/usr/local/Cellar/go/HEAD-eb15cf1/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/43/1y0rrqr55zq3f8cj5wpkt1kmhc7r33/T/go-build002271164=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"

What did you do?

This is minimal example I've been able to create to reproduce this error (works in go 1.7.3):

package main
import "fmt"

func main() {
        _, x := X()
        fmt.Printf("x = %v\n", x)
}

func X() (i int, ok bool) {
        ii := int(1)
        return ii, 0 <= ii && ii <= 0x7fffffff
}

What did you expect to see?

x = true

What did you see instead?

./main.go:11: internal compiler error: got untyped bool for autotmp_7

goroutine 1 [running]:
runtime/debug.Stack(0x0, 0x0, 0x0)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/runtime/debug/stack.go:24 +0x79
cmd/compile/internal/gc.Fatalf(0x644878, 0xd, 0xc42039b580, 0x2, 0x2)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/subr.go:165 +0x226
cmd/compile/internal/gc.typecheckdef(0xc420408b40, 0xc420097140)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/typecheck.go:3779 +0x3e6
cmd/compile/internal/gc.typecheck1(0xc420408b40, 0x22, 0x0)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/typecheck.go:266 +0xca51
cmd/compile/internal/gc.typecheck(0xc420408b40, 0x22, 0xc42039c558)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/typecheck.go:188 +0x602
cmd/compile/internal/gc.typecheckas(0xc420408bd0)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/typecheck.go:3253 +0x78
cmd/compile/internal/gc.typecheck1(0xc420408bd0, 0x1, 0x690898)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/typecheck.go:1963 +0x37ce
cmd/compile/internal/gc.typecheck(0xc420408bd0, 0x1, 0xc420408a20)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/typecheck.go:188 +0x602
cmd/compile/internal/gc.copyexpr(0xc420408a20, 0xc420096840, 0xc42038db10, 0x10)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/subr.go:1336 +0x68
cmd/compile/internal/gc.cheapexpr(0xc420408a20, 0xc42038db10, 0x10)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/subr.go:1350 +0x5d
cmd/compile/internal/gc.safeexpr(0xc420408a20, 0xc42038db10, 0xc42038d0e0)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/subr.go:1330 +0x1fd
cmd/compile/internal/gc.walkexprlistsafe(0xc42007cef0, 0x2, 0x2, 0xc42038db10)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/walk.go:401 +0x56
cmd/compile/internal/gc.walkstmt(0xc42038db00, 0xc42038d9e0)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/walk.go:337 +0x478
cmd/compile/internal/gc.walkstmtlist(0xc420385f80, 0x5, 0x8)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/walk.go:80 +0x44
cmd/compile/internal/gc.walk(0xc42038cbd0)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/walk.go:65 +0x1c0
cmd/compile/internal/gc.compile(0xc42038cbd0)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/pgen.go:347 +0x1c5
cmd/compile/internal/gc.funccompile(0xc42038cbd0)
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/dcl.go:1303 +0xdc
cmd/compile/internal/gc.Main()
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/internal/gc/main.go:476 +0x1f50
main.main()
    /usr/local/Cellar/go/HEAD-eb15cf1/libexec/src/cmd/compile/main.go:47 +0x15d

Works with:

  • explicit type: return ii, bool(0 <= ii && ii <= 0x7fffffff)
  • X signature: func X() (int, bool)
@wendigo wendigo changed the title compiler: internal compiler error: got untyped bool for autotmp_7 compiler: internal compiler error: got untyped bool for autotmp Oct 22, 2016
@wendigo wendigo changed the title compiler: internal compiler error: got untyped bool for autotmp cmd/compile: internal compiler error: got untyped bool for autotmp Oct 22, 2016
@0xmohit
Copy link
Contributor

0xmohit commented Oct 22, 2016

This appears to be a side-effect of 6286188.

@ianlancetaylor ianlancetaylor added this to the Go1.8 milestone Oct 22, 2016
@ianlancetaylor
Copy link
Contributor

CC @randall77 @josharian

@josharian
Copy link
Contributor

Thanks for the concise test case. In my (somewhat long) queue.

@josharian josharian self-assigned this Oct 22, 2016
@wendigo
Copy link
Author

wendigo commented Oct 22, 2016

@josharian I had to extract it from the code I've been working on. Glad to be able to help :)

@odeke-em
Copy link
Member

Interestingly the bug only manifests with a named return signature
ie this works alright the difference being:

6c6
< func Y() (int, bool) {
---
> func Y() (i int, ok bool) {

Passes

package main
func main() {
        _, y := Y()
        if y {}
}
func Y() (int, bool) { 
        ii := int(1)
        return ii, 0 <= ii && ii < 20
}

Fails

package main

func main() {
    _, _ = Y()
}
func Y() (i int, ok bool) {
    ii := int(1)
    return ii, 0 <= ii && ii < 20
}
./fails.go:8: internal compiler error: got untyped bool for autotmp_2

goroutine 1 [running]:
runtime/debug.Stack(0x0, 0x0, 0x0)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/runtime/debug/stack.go:24 +0x79
cmd/compile/internal/gc.Fatalf(0x644b18, 0xd, 0xc42031d540, 0x2, 0x2)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/subr.go:165 +0x226
cmd/compile/internal/gc.typecheckdef(0xc4203655f0, 0xc42031d640)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/typecheck.go:3782 +0x488
cmd/compile/internal/gc.typecheck1(0xc4203655f0, 0x22, 0xc420356520)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/typecheck.go:266 +0xca51
cmd/compile/internal/gc.typecheck(0xc4203655f0, 0x22, 0x4e7e9f)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/typecheck.go:188 +0x602
cmd/compile/internal/gc.typecheckas(0xc420365680)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/typecheck.go:3253 +0x78
cmd/compile/internal/gc.typecheck1(0xc420365680, 0x1, 0x690bf4)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/typecheck.go:1963 +0x37ce
cmd/compile/internal/gc.typecheck(0xc420365680, 0x1, 0xc4203654d0)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/typecheck.go:188 +0x602
cmd/compile/internal/gc.copyexpr(0xc4203654d0, 0xc4200189c0, 0xc4203566d0, 0x10)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/subr.go:1336 +0x68
cmd/compile/internal/gc.cheapexpr(0xc4203654d0, 0xc4203566d0, 0x10)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/subr.go:1350 +0x5d
cmd/compile/internal/gc.safeexpr(0xc4203654d0, 0xc4203566d0, 0xc420349dd0)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/subr.go:1330 +0x1fd
cmd/compile/internal/gc.walkexprlistsafe(0xc420012c80, 0x2, 0x2, 0xc4203566d0)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/walk.go:401 +0x56
cmd/compile/internal/gc.walkstmt(0xc4203566c0, 0xc4203565a0)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/walk.go:337 +0x478
cmd/compile/internal/gc.walkstmtlist(0xc420335600, 0x5, 0x8)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/walk.go:80 +0x44
cmd/compile/internal/gc.walk(0xc4203498c0)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/walk.go:65 +0x1c0
cmd/compile/internal/gc.compile(0xc4203498c0)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/pgen.go:347 +0x1c5
cmd/compile/internal/gc.funccompile(0xc4203498c0)
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/dcl.go:1303 +0xdc
cmd/compile/internal/gc.Main()
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/internal/gc/main.go:476 +0x1f50
main.main()
    /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/cmd/compile/main.go:47 +0x15d

@wendigo
Copy link
Author

wendigo commented Oct 23, 2016

@odeke-em yeah, I mentioned it in the issue. Error does not occur when there is single named bool returned.

Also, these combinations will work:

  • return 0 <= 1 && ii <= 0x7fffffff, ii
  • return 0 <= ii && 1 <= 0x7fffffff, ii
  • return 0 <= 1 && 0 <= 0x7fffffff, ii

So probably as @0xmohit mentioned it's a side effect of optimization introduced in 6286188

@quentinmit quentinmit added the NeedsFix The path to resolution is known, but the work has not been done. label Oct 24, 2016
@gopherbot
Copy link

CL https://golang.org/cl/31857 mentions this issue.

@golang golang locked and limited conversation to collaborators Oct 24, 2017
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
FrozenDueToAge NeedsFix The path to resolution is known, but the work has not been done.
Projects
None yet
Development

No branches or pull requests

7 participants