Fixes regression from Go 1.22.
Fixes #67540.
For #67547.
Change-Id: I61f642970c6a9bd8567654bb5ecf645ae77b3bcc
Reviewed-on: https://go-review.googlesource.com/c/go/+/587159
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Auto-Submit: Robert Griesemer <gri@google.com>
return true
}
- // "V and T have identical underlying types if tags are ignored
- // and V and T are not type parameters"
- V := x.typ
+ origT := T
+ V := Unalias(x.typ)
+ T = Unalias(T)
Vu := under(V)
Tu := under(T)
Vp, _ := V.(*TypeParam)
Tp, _ := T.(*TypeParam)
+
+ // "V and T have identical underlying types if tags are ignored
+ // and V and T are not type parameters"
if IdenticalIgnoreTags(Vu, Tu) && Vp == nil && Tp == nil {
return true
}
}
x.typ = V.typ
if !x.convertibleTo(check, T, cause) {
- errorf("cannot convert %s (in %s) to type %s", V.typ, Vp, T)
+ errorf("cannot convert %s (in %s) to type %s", V.typ, Vp, origT)
return false
}
return true
return true
}
- // "V and T have identical underlying types if tags are ignored
- // and V and T are not type parameters"
- V := x.typ
+ origT := T
+ V := Unalias(x.typ)
+ T = Unalias(T)
Vu := under(V)
Tu := under(T)
Vp, _ := V.(*TypeParam)
Tp, _ := T.(*TypeParam)
+
+ // "V and T have identical underlying types if tags are ignored
+ // and V and T are not type parameters"
if IdenticalIgnoreTags(Vu, Tu) && Vp == nil && Tp == nil {
return true
}
}
x.typ = V.typ
if !x.convertibleTo(check, T, cause) {
- errorf("cannot convert %s (in %s) to type %s", V.typ, Vp, T)
+ errorf("cannot convert %s (in %s) to type %s", V.typ, Vp, origT)
return false
}
return true
var m A
clear(m) // don't report an error for m
}
+
+type S1 struct {
+ x int "S1.x"
+}
+
+type S2 struct {
+ x int "S2.x"
+}
+
+func _[P1 S1, P2 S2]() {
+ type A = P1
+ var p A
+ _ = P2(p) // conversion must be valid
+}
+
+func _[P1 S1, P2 S2]() {
+ var p P1
+ type A = P2
+ _ = A(p) // conversion must be valid
+}
+
+func _[P int | string]() {
+ var p P
+ type A = int
+ // preserve target type name A in error messages when using Alias types
+ // (test are run with and without Alias types enabled, so we need to
+ // keep both A and int in the error message)
+ _ = A(p /* ERRORx "cannot convert string .* to type (A|int)" */)
+}
+
+// Test case for go.dev/issue/67540.
+func _() {
+ type (
+ S struct{}
+ A = *S
+ T S
+ )
+ var p A
+ _ = (*T)(p)
+}