]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix incomplete export data when inlining with local variables.
authorRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 1 Nov 2012 18:06:52 +0000 (19:06 +0100)
committerRémy Oudompheng <oudomphe@phare.normalesup.org>
Thu, 1 Nov 2012 18:06:52 +0000 (19:06 +0100)
When local declarations needed unexported types, these could
be missing in the export data.

Fixes build with -gcflags -lll, except for exp/gotype.

R=golang-dev, rsc, lvd
CC=golang-dev
https://golang.org/cl/6813067

src/cmd/gc/export.c
test/fixedbugs/bug467.dir/p1.go [new file with mode: 0644]
test/fixedbugs/bug467.dir/p2.go [new file with mode: 0644]
test/fixedbugs/bug467.dir/p3.go [new file with mode: 0644]
test/fixedbugs/bug467.go [new file with mode: 0644]

index d139808913a82f65280ff76f5c978500ea52de65..7f977874a1bfedff7e59e6d146e346fec9a5fa13 100644 (file)
@@ -119,6 +119,17 @@ reexportdep(Node *n)
                }
                break;
 
+       case ODCL:
+               // Local variables in the bodies need their type.
+               t = n->left->type;
+               if(t != types[t->etype] && t != idealbool && t != idealstring) {
+                       if(isptr[t->etype])
+                               t = t->type;
+                       if (t && t->sym && t->sym->def && t->sym->pkg != localpkg  && t->sym->pkg != builtinpkg) {
+                               exportlist = list(exportlist, t->sym->def);
+                       }
+               }
+               break;
 
        case OLITERAL:
                t = n->type;
diff --git a/test/fixedbugs/bug467.dir/p1.go b/test/fixedbugs/bug467.dir/p1.go
new file mode 100644 (file)
index 0000000..538b554
--- /dev/null
@@ -0,0 +1,5 @@
+package p1
+
+type SockaddrUnix int
+
+func (s SockaddrUnix) Error() string { return "blah" }
diff --git a/test/fixedbugs/bug467.dir/p2.go b/test/fixedbugs/bug467.dir/p2.go
new file mode 100644 (file)
index 0000000..d80d3a3
--- /dev/null
@@ -0,0 +1,5 @@
+package p2
+
+import "./p1"
+
+func SockUnix() error { var s *p1.SockaddrUnix; return s }
diff --git a/test/fixedbugs/bug467.dir/p3.go b/test/fixedbugs/bug467.dir/p3.go
new file mode 100644 (file)
index 0000000..c795646
--- /dev/null
@@ -0,0 +1,7 @@
+package main
+
+import "./p2"
+
+func main() {
+       _ = p2.SockUnix()
+}
diff --git a/test/fixedbugs/bug467.go b/test/fixedbugs/bug467.go
new file mode 100644 (file)
index 0000000..d73adba
--- /dev/null
@@ -0,0 +1,10 @@
+// compiledir
+
+// Copyright 2012 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.
+
+// Exported data for inlining could forget types of
+// local variables declared in inlinable bodies.
+
+package ignored