]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typealias] cmd/compile: avoid false positive cycles from type aliases
authorMatthew Dempsky <mdempsky@google.com>
Thu, 26 Jan 2017 17:00:56 +0000 (09:00 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 26 Jan 2017 18:35:13 +0000 (18:35 +0000)
For #18130.
Fixes #18640.

Change-Id: I26cf1d1b78cca6ef207cc4333f30a9011ef347c9
Reviewed-on: https://go-review.googlesource.com/35831
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/gc/main.go
test/fixedbugs/issue18640.go [new file with mode: 0644]

index a861a3556b8f5a7598b9b8672edce008bf722dd2..11f0547d5e8082bfa0d0e189d1aad945f6fbf39e 100644 (file)
@@ -339,13 +339,15 @@ func Main() {
        // Phase 1: const, type, and names and types of funcs.
        //   This will gather all the information about types
        //   and methods but doesn't depend on any of it.
+       //   We also defer type alias declarations until phase 2
+       //   to avoid cycles like #18640.
        defercheckwidth()
 
        // Don't use range--typecheck can add closures to xtop.
        timings.Start("fe", "typecheck", "top1")
        for i := 0; i < len(xtop); i++ {
                n := xtop[i]
-               if op := n.Op; op != ODCL && op != OAS && op != OAS2 {
+               if op := n.Op; op != ODCL && op != OAS && op != OAS2 && (op != ODCLTYPE || !n.Left.Name.Param.Alias) {
                        xtop[i] = typecheck(n, Etop)
                }
        }
@@ -357,7 +359,7 @@ func Main() {
        timings.Start("fe", "typecheck", "top2")
        for i := 0; i < len(xtop); i++ {
                n := xtop[i]
-               if op := n.Op; op == ODCL || op == OAS || op == OAS2 {
+               if op := n.Op; op == ODCL || op == OAS || op == OAS2 || op == ODCLTYPE && n.Left.Name.Param.Alias {
                        xtop[i] = typecheck(n, Etop)
                }
        }
diff --git a/test/fixedbugs/issue18640.go b/test/fixedbugs/issue18640.go
new file mode 100644 (file)
index 0000000..c4f948b
--- /dev/null
@@ -0,0 +1,26 @@
+// compile
+
+// Copyright 2017 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 (
+       a = b
+       b struct {
+               *a
+       }
+
+       c struct {
+               *d
+       }
+       d = c
+
+       e = f
+       f = g
+       g = []h
+       h i
+       i = j
+       j = e
+)