Skip to content

Commit

Permalink
go/types, types2: unalias tilde terms in underIs
Browse files Browse the repository at this point in the history
Unalias the ~T terms during underIs. Before, if T was an alias
of U, it may pass T to the iteration function. The iterator
function expects an underlying type, under(U), to be passed.
This caused several bugs where underIs is used without
eventually taking the underlying type.

Updates #68935
Fixes #68903

Change-Id: Ie8691d8dddaea00e1dcba94d17c0f1b021fc49a2
Reviewed-on: https://go-review.googlesource.com/c/go/+/606075
Reviewed-by: Robert Griesemer <gri@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
timothy-king committed Aug 20, 2024
1 parent 6fb6ace commit 1a90dcd
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 4 deletions.
4 changes: 2 additions & 2 deletions src/cmd/compile/internal/types2/typeset.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,8 +131,8 @@ func (s *_TypeSet) underIs(f func(Type) bool) bool {
}
for _, t := range s.terms {
assert(t.typ != nil)
// x == under(x) for ~x terms
u := t.typ
// Unalias(x) == under(x) for ~x terms
u := Unalias(t.typ)
if !t.tilde {
u = under(u)
}
Expand Down
4 changes: 2 additions & 2 deletions src/go/types/typeset.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions src/internal/types/testdata/fixedbugs/issue68903.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// Copyright 2024 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 = [4]int
type B = map[string]interface{}

func _[T ~A](x T) {
_ = len(x)
}

func _[U ~A](x U) {
_ = cap(x)
}

func _[V ~A]() {
_ = V{}
}

func _[W ~B](a interface{}) {
_ = a.(W)["key"]
}
26 changes: 26 additions & 0 deletions src/internal/types/testdata/fixedbugs/issue68935.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// Copyright 2024 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 = struct {
F string
G int
}

func Make[T ~A]() T {
return T{
F: "blah",
G: 1234,
}
}

type N struct {
F string
G int
}

func _() {
_ = Make[N]()
}

0 comments on commit 1a90dcd

Please sign in to comment.