]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix importing rewritten f(g()) calls
authorMatthew Dempsky <mdempsky@google.com>
Mon, 18 Mar 2019 19:19:26 +0000 (12:19 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Mon, 18 Mar 2019 19:43:38 +0000 (19:43 +0000)
golang.org/cl/166983 started serializing the Ninit field of OCALL
nodes within function inline bodies (necessary to fix a regression in
building crypto/ecdsa with -gcflags=-l=4), but this means the Ninit
field needs to be typechecked when the imported function body is used.

It's unclear why this wasn't necessary for the crypto/ecdsa
regression.

Fixes #30907.

Change-Id: Id5f0bf3c4d17bbd6d5318913b859093c93a0a20c
Reviewed-on: https://go-review.googlesource.com/c/go/+/168199
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/issue30907.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue30907.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue30907.go [new file with mode: 0644]

index 2468f52b743ff83d9d66553bf0f501ed698f49d0..a746b3418046a7971f648a1fe07a1f24c4eff102 100644 (file)
@@ -1239,6 +1239,7 @@ func typecheck1(n *Node, top int) (res *Node) {
 
        // call and call like
        case OCALL:
+               typecheckslice(n.Ninit.Slice(), ctxStmt) // imported rewritten f(g()) calls (#30907)
                n.Left = typecheck(n.Left, ctxExpr|Etype|ctxCallee)
                if n.Left.Diag() {
                        n.SetDiag(true)
diff --git a/test/fixedbugs/issue30907.dir/a.go b/test/fixedbugs/issue30907.dir/a.go
new file mode 100644 (file)
index 0000000..e1a5c0c
--- /dev/null
@@ -0,0 +1,19 @@
+// Copyright 2019 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 UUID string
+
+func New() UUID {
+       return Must(NewRandom())
+}
+
+func NewRandom() (UUID, error) {
+       return "", nil
+}
+
+func Must(uuid UUID, err error) UUID {
+       return uuid
+}
diff --git a/test/fixedbugs/issue30907.dir/b.go b/test/fixedbugs/issue30907.dir/b.go
new file mode 100644 (file)
index 0000000..f4f5fc4
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 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 p
+
+import "./a"
+
+func F() {
+       a.New()
+}
diff --git a/test/fixedbugs/issue30907.go b/test/fixedbugs/issue30907.go
new file mode 100644 (file)
index 0000000..973ae1d
--- /dev/null
@@ -0,0 +1,7 @@
+// compiledir
+
+// Copyright 2019 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