]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't re-typecheck while importing
authorKeith Randall <khr@golang.org>
Tue, 14 Dec 2021 04:11:07 +0000 (20:11 -0800)
committerKeith Randall <khr@golang.org>
Thu, 16 Dec 2021 00:34:10 +0000 (00:34 +0000)
The imported code is already typechecked. NodAddrAt typechecks its
argument, which is unnecessary here and leads to errors when
typechecking unexported field references in other packages' code.

Mark the node is question as already typechecked, so we don't
retypecheck it.

Fixes #50148

Change-Id: I9789e3e7dd4d58ec095675e27b1c98389f7a0c44
Reviewed-on: https://go-review.googlesource.com/c/go/+/371554
Trust: Keith Randall <khr@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
Trust: Dan Scales <danscales@google.com>
Reviewed-by: Dan Scales <danscales@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/cmd/compile/internal/typecheck/iimport.go
test/typeparam/structinit.dir/a.go [new file with mode: 0644]
test/typeparam/structinit.dir/b.go [new file with mode: 0644]
test/typeparam/structinit.dir/main.go [new file with mode: 0644]
test/typeparam/structinit.go [new file with mode: 0644]

index 09f87df5803eec2bfac3b2c1c00b1947a6ff3d59..bc34d3933a96835718903b4c43aaa2c6b64ced85 100644 (file)
@@ -1630,11 +1630,16 @@ func (r *importReader) node() ir.Node {
                return n
 
        case ir.OADDR, ir.OPTRLIT:
-               n := NodAddrAt(r.pos(), r.expr())
                if go117ExportTypes {
+                       pos := r.pos()
+                       expr := r.expr()
+                       expr.SetTypecheck(1) // we do this for all nodes after importing, but do it now so markAddrOf can see it.
+                       n := NodAddrAt(pos, expr)
                        n.SetOp(op)
                        n.SetType(r.typ())
+                       return n
                }
+               n := NodAddrAt(r.pos(), r.expr())
                return n
 
        case ir.ODEREF:
diff --git a/test/typeparam/structinit.dir/a.go b/test/typeparam/structinit.dir/a.go
new file mode 100644 (file)
index 0000000..c76d155
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2021 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 S[T any] struct {
+}
+
+func (b *S[T]) build() *X[T] {
+       return &X[T]{f:0}
+}
+type X[T any] struct {
+       f int
+}
diff --git a/test/typeparam/structinit.dir/b.go b/test/typeparam/structinit.dir/b.go
new file mode 100644 (file)
index 0000000..40a929b
--- /dev/null
@@ -0,0 +1,12 @@
+// Copyright 2021 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 B() {
+       var x a.S[int]
+       _ = x
+}
diff --git a/test/typeparam/structinit.dir/main.go b/test/typeparam/structinit.dir/main.go
new file mode 100644 (file)
index 0000000..c564171
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2021 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 main
+
+import "./b"
+
+func main() {
+       b.B()
+}
diff --git a/test/typeparam/structinit.go b/test/typeparam/structinit.go
new file mode 100644 (file)
index 0000000..76930e5
--- /dev/null
@@ -0,0 +1,7 @@
+// rundir -G=3
+
+// Copyright 2021 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