]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix compile failure for lazily resolved shadowed types
authorMatthew Dempsky <mdempsky@google.com>
Thu, 21 Jun 2018 23:12:17 +0000 (16:12 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Fri, 22 Jun 2018 17:57:09 +0000 (17:57 +0000)
If expanding an inline function body required lazily expanding a
package-scoped type whose identifier was shadowed within the function
body, the lazy expansion would instead overwrite the local symbol
definition instead of the package-scoped symbol. This was due to
importsym using s.Def instead of s.PkgDef.

Unfortunately, this is yet another consequence of the current awkward
scope handling code.

Passes toolstash-check.

Fixes #25984.

Change-Id: Ia7033e1749a883e6e979c854d4b12b0b28083dd8
Reviewed-on: https://go-review.googlesource.com/120456
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/gc/export.go
src/cmd/compile/internal/types/scope.go
test/fixedbugs/issue25984.dir/p.go [new file with mode: 0644]
test/fixedbugs/issue25984.dir/q.go [new file with mode: 0644]
test/fixedbugs/issue25984.go [new file with mode: 0644]

index cd71db3a14ac2873f2a698aa21d1b0165dee34d1..becc4e1f3b3840f6b9a8277bebcb92f71194a497 100644 (file)
@@ -89,7 +89,7 @@ func dumpexport(bout *bio.Writer) {
 }
 
 func importsym(ipkg *types.Pkg, pos src.XPos, s *types.Sym, op Op) *Node {
-       n := asNode(s.Def)
+       n := asNode(s.PkgDef())
        if n == nil {
                // iimport should have created a stub ONONAME
                // declaration for all imported symbols. The exception
@@ -100,7 +100,7 @@ func importsym(ipkg *types.Pkg, pos src.XPos, s *types.Sym, op Op) *Node {
                }
 
                n = dclname(s)
-               s.Def = asTypesNode(n)
+               s.SetPkgDef(asTypesNode(n))
                s.Importdef = ipkg
        }
        if n.Op != ONONAME && n.Op != op {
index 156174746f4d470018632a9e69b4617187f18763..40d3d86ef11a4168db0f5f7c0221a1e94353ed88 100644 (file)
@@ -80,15 +80,24 @@ func IsDclstackValid() bool {
 
 // PkgDef returns the definition associated with s at package scope.
 func (s *Sym) PkgDef() *Node {
+       return *s.pkgDefPtr()
+}
+
+// SetPkgDef sets the definition associated with s at package scope.
+func (s *Sym) SetPkgDef(n *Node) {
+       *s.pkgDefPtr() = n
+}
+
+func (s *Sym) pkgDefPtr() **Node {
        // Look for outermost saved declaration, which must be the
        // package scope definition, if present.
        for _, d := range dclstack {
                if s == d.sym {
-                       return d.def
+                       return &d.def
                }
        }
 
        // Otherwise, the declaration hasn't been shadowed within a
        // function scope.
-       return s.Def
+       return &s.Def
 }
diff --git a/test/fixedbugs/issue25984.dir/p.go b/test/fixedbugs/issue25984.dir/p.go
new file mode 100644 (file)
index 0000000..306d6a4
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright 2018 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
+
+type m struct {
+       link *m
+}
+
+var head *m
+
+func F(m *int) bool {
+       return head != nil
+}
diff --git a/test/fixedbugs/issue25984.dir/q.go b/test/fixedbugs/issue25984.dir/q.go
new file mode 100644 (file)
index 0000000..64d2587
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2018 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 q
+
+import "./p"
+
+func G() {
+       p.F(nil)
+}
diff --git a/test/fixedbugs/issue25984.go b/test/fixedbugs/issue25984.go
new file mode 100644 (file)
index 0000000..128cf9d
--- /dev/null
@@ -0,0 +1,7 @@
+// compiledir
+
+// Copyright 2018 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