aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlan Donovan <adonovan@google.com>2024-04-15 14:50:39 -0400
committerGopher Robot <gobot@golang.org>2024-04-15 19:10:02 +0000
commitcfbe6cd9bb1595e07ede1ffb1fff610819ffab00 (patch)
treeadbcd74f35b44daf3cd650d0d3c1bcebbdf0010b /src
parentb107d95b9a66bfe7150fd4f2915e9bb876a6999a (diff)
downloadgo-cfbe6cd9bb1595e07ede1ffb1fff610819ffab00.tar.xz
cmd/compile/internal/types2: port CL 576975 to types2
This CL ports to types2 the (passing) test from CL 576975, which fixed a bug in go/types. Updates #66704 Updates #65294 Change-Id: Icdf77e39ed177d9f9ecc435d5125f02f2ee4dd0f Reviewed-on: https://go-review.googlesource.com/c/go/+/579015 Auto-Submit: Alan Donovan <adonovan@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/compile/internal/types2/api_test.go25
-rw-r--r--src/cmd/compile/internal/types2/decl.go5
2 files changed, 30 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/types2/api_test.go b/src/cmd/compile/internal/types2/api_test.go
index 008a5302ab..cd979815bf 100644
--- a/src/cmd/compile/internal/types2/api_test.go
+++ b/src/cmd/compile/internal/types2/api_test.go
@@ -2985,3 +2985,28 @@ func TestTooNew(t *testing.T) {
}
}
}
+
+// This is a regression test for #66704.
+func TestUnaliasTooSoonInCycle(t *testing.T) {
+ t.Setenv("GODEBUG", "gotypesalias=1")
+ const src = `package a
+
+var x T[B] // this appears to cause Unalias to be called on B while still Invalid
+
+type T[_ any] struct{}
+type A T[B]
+type B = T[A]
+`
+
+ f := mustParse(src)
+ pkg, err := new(Config).Check("a", []*syntax.File{f}, nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ B := pkg.Scope().Lookup("B")
+ got, want := Unalias(B.Type()).String(), "a.T[a.A]"
+ if got != want {
+ t.Errorf("Unalias(type B = T[A]) = %q, want %q", got, want)
+ }
+}
diff --git a/src/cmd/compile/internal/types2/decl.go b/src/cmd/compile/internal/types2/decl.go
index ed7784a6b8..8bf9c58307 100644
--- a/src/cmd/compile/internal/types2/decl.go
+++ b/src/cmd/compile/internal/types2/decl.go
@@ -512,6 +512,11 @@ func (check *Checker) typeDecl(obj *TypeName, tdecl *syntax.TypeDecl, def *TypeN
// TODO(gri) Should be able to use nil instead of Typ[Invalid] to mark
// the alias as incomplete. Currently this causes problems
// with certain cycles. Investigate.
+ //
+ // NOTE(adonovan): to avoid the Invalid being prematurely observed
+ // by (e.g.) a var whose type is an unfinished cycle,
+ // Unalias does not memoize if Invalid. Perhaps we should use a
+ // special sentinel distinct from Invalid.
alias := check.newAlias(obj, Typ[Invalid])
setDefType(def, alias)