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.
Fixes #68905
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>
(cherry picked from commit
1a90dcdaaf46d9dd0ee61781dcb9b6e05b80d926)
Reviewed-on: https://go-review.googlesource.com/c/go/+/607635
}
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)
}
}
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)
}
--- /dev/null
+// 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"]
+}
--- /dev/null
+// 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]()
+}