]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gc: fix race compilation failure 'non-orig name'
authorRuss Cox <rsc@golang.org>
Wed, 28 May 2014 03:59:27 +0000 (23:59 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 28 May 2014 03:59:27 +0000 (23:59 -0400)
CL 51010045 fixed the first one of these:

        cmd/gc: return canonical Node* from temp

        For historical reasons, temp was returning a copy
        of the created Node*, not the original Node*.
        This meant that if analysis recorded information in the
        returned node (for example, n->addrtaken = 1), the
        analysis would not show up on the original Node*, the
        one kept in fn->dcl and consulted during liveness
        bitmap creation.

        Correct this, and watch for it when setting addrtaken.

        Fixes #7083.

        R=khr, dave, minux.ma
        CC=golang-codereviews
        https://golang.org/cl/51010045

CL 53200043 fixed the second:

        cmd/gc: fix race build

        Missed this case in CL 51010045.

        TBR=khr
        CC=golang-codereviews
        https://golang.org/cl/53200043

This CL fixes the third. There are only three nod(OXXX, ...)
calls in sinit.c, so maybe we're done. Embarassing that it
took three CLs to find all three.

Fixes #8028.

LGTM=khr
R=golang-codereviews, khr
CC=golang-codereviews, iant
https://golang.org/cl/100800046

src/cmd/gc/sinit.c
test/fixedbugs/issue8028.go [new file with mode: 0644]

index e285352306684ab09f8d2532a0f7520ac09c63cd..59804cd8d0325d7c026fb08e88c1cd4bb99036c0 100644 (file)
@@ -354,6 +354,7 @@ staticcopy(Node *l, Node *r, NodeList **out)
                        else {
                                ll = nod(OXXX, N, N);
                                *ll = n1;
+                               ll->orig = ll; // completely separate copy
                                if(!staticassign(ll, e->expr, out)) {
                                        // Requires computation, but we're
                                        // copying someone else's computation.
diff --git a/test/fixedbugs/issue8028.go b/test/fixedbugs/issue8028.go
new file mode 100644 (file)
index 0000000..7ceb902
--- /dev/null
@@ -0,0 +1,27 @@
+// compile
+
+// Copyright 2014 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.
+
+// Issue 8028. Used to fail in -race mode with "non-orig name" error.
+
+package p
+
+var (
+       t2 = T{F, "s1"}
+       t1 = T{F, "s2"}
+
+       tt = [...]T{t1, t2}
+)
+
+type I interface{}
+
+type T struct {
+       F func() I
+       S string
+}
+
+type E struct{}
+
+func F() I { return new(E) }