]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: simplify {defer,resume}checkwidth logic
authorMatthew Dempsky <mdempsky@google.com>
Fri, 30 Aug 2019 21:54:21 +0000 (14:54 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 3 Sep 2019 17:38:32 +0000 (17:38 +0000)
This CL extends {defer,resume}checkwidth to support nesting, which
simplifies usage.

Updates #33658.

Change-Id: Ib3ffb8a7cabfae2cbeba74e21748c228436f4726
Reviewed-on: https://go-review.googlesource.com/c/go/+/192721
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/gc/align.go
src/cmd/compile/internal/gc/iimport.go
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/gc/typecheck.go
test/fixedbugs/bug195.go
test/fixedbugs/issue23823.go

index 34e69676f7967212caaceabdf529da7860710f63..d6251adc7a402ebb7a4379ed79e7cca2ca81160d 100644 (file)
@@ -217,7 +217,7 @@ func dowidth(t *types.Type) {
        }
 
        // defer checkwidth calls until after we're done
-       defercalc++
+       defercheckwidth()
 
        lno := lineno
        if asNode(t.Nod) != nil {
@@ -391,11 +391,7 @@ func dowidth(t *types.Type) {
 
        lineno = lno
 
-       if defercalc == 1 {
-               resumecheckwidth()
-       } else {
-               defercalc--
-       }
+       resumecheckwidth()
 }
 
 // when a type's width should be known, we call checkwidth
@@ -440,24 +436,18 @@ func checkwidth(t *types.Type) {
 }
 
 func defercheckwidth() {
-       // we get out of sync on syntax errors, so don't be pedantic.
-       if defercalc != 0 && nerrors == 0 {
-               Fatalf("defercheckwidth")
-       }
-       defercalc = 1
+       defercalc++
 }
 
 func resumecheckwidth() {
-       if defercalc == 0 {
-               Fatalf("resumecheckwidth")
-       }
-
-       for len(deferredTypeStack) > 0 {
-               t := deferredTypeStack[len(deferredTypeStack)-1]
-               deferredTypeStack = deferredTypeStack[:len(deferredTypeStack)-1]
-               t.SetDeferwidth(false)
-               dowidth(t)
+       if defercalc == 1 {
+               for len(deferredTypeStack) > 0 {
+                       t := deferredTypeStack[len(deferredTypeStack)-1]
+                       deferredTypeStack = deferredTypeStack[:len(deferredTypeStack)-1]
+                       t.SetDeferwidth(false)
+                       dowidth(t)
+               }
        }
 
-       defercalc = 0
+       defercalc--
 }
index 38a7201a63a50305f9ca49998176c58be5a07f8d..4f44c5486846938420ad6a0bcc7781e5dfeeff28 100644 (file)
@@ -298,21 +298,10 @@ func (r *importReader) doDecl(n *Node) {
 
                // We also need to defer width calculations until
                // after the underlying type has been assigned.
-               //
-               // TODO(mdempsky): Add nesting support directly to
-               // {defer,resume}checkwidth? Width calculations are
-               // already deferred during initial typechecking, but
-               // not when we're expanding inline function bodies, so
-               // we currently need to handle both cases here.
-               deferring := defercalc != 0
-               if !deferring {
-                       defercheckwidth()
-               }
+               defercheckwidth()
                underlying := r.typ()
                copytype(typenod(t), underlying)
-               if !deferring {
-                       resumecheckwidth()
-               }
+               resumecheckwidth()
 
                if underlying.IsInterface() {
                        break
index db1f9d20e4a7acea08d28e097582fdebde860cdb..12ebfb871b491b521658d68f1a32039746c102a4 100644 (file)
@@ -527,7 +527,6 @@ func Main(archInit func(*Arch)) {
        //   We also defer type alias declarations until phase 2
        //   to avoid cycles like #18640.
        //   TODO(gri) Remove this again once we have a fix for #25838.
-       defercheckwidth()
 
        // Don't use range--typecheck can add closures to xtop.
        timings.Start("fe", "typecheck", "top1")
@@ -549,7 +548,6 @@ func Main(archInit func(*Arch)) {
                        xtop[i] = typecheck(n, ctxStmt)
                }
        }
-       resumecheckwidth()
 
        // Phase 3: Type check function bodies.
        // Don't use range--typecheck can add closures to xtop.
@@ -1035,7 +1033,6 @@ func loadsys() {
 
        inimport = true
        typecheckok = true
-       defercheckwidth()
 
        typs := runtimeTypes()
        for _, d := range runtimeDecls {
@@ -1052,7 +1049,6 @@ func loadsys() {
        }
 
        typecheckok = false
-       resumecheckwidth()
        inimport = false
 }
 
index b50f23da82f5baf1bc661c41388feddfc3cdf5a9..610c9066b88104858558cd0908ad772ef5c57bf6 100644 (file)
@@ -3669,9 +3669,7 @@ func typecheckdef(n *Node) {
                }
 
                // regular type declaration
-               if Curfn != nil {
-                       defercheckwidth()
-               }
+               defercheckwidth()
                n.SetWalkdef(1)
                setTypeNode(n, types.New(TFORW))
                n.Type.Sym = n.Sym
@@ -3682,9 +3680,7 @@ func typecheckdef(n *Node) {
                        // but it was reported. Silence future errors.
                        n.Type.SetBroke(true)
                }
-               if Curfn != nil {
-                       resumecheckwidth()
-               }
+               resumecheckwidth()
        }
 
 ret:
index 8d392bda715053541b64a8de59e9158aa0195c0c..496c0be6100e3d9db59f5bd80d92852e5025d89d 100644 (file)
@@ -18,10 +18,10 @@ type I4 interface { // GC_ERROR "invalid recursive type"
        I4      // GCCGO_ERROR "interface"
 }
 
-type I5 interface {
+type I5 interface { // GC_ERROR "invalid recursive type"
        I6      // GCCGO_ERROR "interface"
 }
 
-type I6 interface { // GC_ERROR "invalid recursive type"
+type I6 interface {
        I5      // GCCGO_ERROR "interface"
 }
index 707cbd3624fdc3b5a542ffba07f6d75af02aa098..2f802d09886064a7a3c75e1e4546b5862b0a0e73 100644 (file)
@@ -6,10 +6,10 @@
 
 package p
 
-type I1 = interface { // ERROR "invalid recursive type"
+type I1 = interface {
        I2
 }
 
-type I2 interface {
+type I2 interface { // ERROR "invalid recursive type"
        I1
 }