]> Cypherpunks.ru repositories - gostls13.git/commit
go/types, types2: use type nest to detect type cycles (fix validType)
authorRobert Griesemer <gri@golang.org>
Wed, 1 Jun 2022 03:59:55 +0000 (20:59 -0700)
committerRobert Griesemer <gri@golang.org>
Mon, 6 Jun 2022 18:24:19 +0000 (18:24 +0000)
commit07eca49055f7ef0d73be2ca28dcc5d489db129b9
tree5c2c69d43136e33552bbdec1ec917d4a8df7a8c1
parent770146d5a857e8606222276040c6712b48e27e0e
go/types, types2: use type nest to detect type cycles (fix validType)

validType was using a global type info map to detect invalid recursive
types, which was incorrect. Instead, change the algorithm as follows:

- Rather than using a "seen" (or typeInfo) map which is cumbersome to
  update correctly, use the stack of embedding types (the type nest)
  to check whether a type is embedded within itself, directly or
  indirectly.

- Use Identical for type comparisons which correctly considers identity
  of instantiated generic types.

- As before, maintain the full path of types leading to a cycle. But
  unlike before, track the named types rather than their objects, for
  a smaller slice ([]*Named rather than []Object), and convert to an
  object list only when needed for error reporting.

- As an optimization, keep track of valid *Named types (Checker.valids).
  This prevents pathological cases from consuming excessive computation
  time.

- Add clarifying comments and document invariants.

Based on earlier insights by David Chase (see also CL 408818).

Fixes #52698.

Change-Id: I5e4598c58afcf4ab987a426c5c4b7b28bdfcf5ea
Reviewed-on: https://go-review.googlesource.com/c/go/+/409694
Reviewed-by: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
src/cmd/compile/internal/types2/check.go
src/cmd/compile/internal/types2/testdata/fixedbugs/issue52698.go [new file with mode: 0644]
src/cmd/compile/internal/types2/validtype.go
src/go/types/check.go
src/go/types/testdata/fixedbugs/issue52698.go [new file with mode: 0644]
src/go/types/validtype.go