Skip to content

Commit

Permalink
cmd/compile/internal/types2: port CL 576975 to types2
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
adonovan authored and gopherbot committed Apr 15, 2024
1 parent b107d95 commit cfbe6cd
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 0 deletions.
25 changes: 25 additions & 0 deletions src/cmd/compile/internal/types2/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
5 changes: 5 additions & 0 deletions src/cmd/compile/internal/types2/decl.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down

0 comments on commit cfbe6cd

Please sign in to comment.