--- /dev/null
+// Copyright 2021 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.
+
+// Verify that we get an empty type set (not just an error)
+// when using an invalid ~A.
+
+package p
+
+type A int
+type C interface {
+ ~ /* ERROR invalid use of ~ */ A
+}
+
+func f[_ C]() {}
+func g[_ interface{ C }]() {}
+func h[_ C | int]() {}
+
+func _() {
+ _ = f[int /* ERROR cannot implement C \(empty type set\) */]
+ _ = g[int /* ERROR cannot implement interface{C} \(empty type set\) */]
+ _ = h[int]
+}
var allTerms termlist
for _, t := range utyp.terms {
var terms termlist
- switch u := under(t.typ).(type) {
- case *Interface:
+ u := under(t.typ)
+ if ui, _ := u.(*Interface); ui != nil {
// For now we don't permit type parameters as constraints.
assert(!isTypeParam(t.typ))
- terms = computeInterfaceTypeSet(check, pos, u).terms
- default:
- if t.typ == Typ[Invalid] {
- continue
+ terms = computeInterfaceTypeSet(check, pos, ui).terms
+ } else if t.typ == Typ[Invalid] {
+ continue
+ } else {
+ if t.tilde && !Identical(t.typ, u) {
+ // There is no underlying type which is t.typ.
+ // The corresponding type set is empty.
+ t = nil // ∅ term
}
terms = termlist{(*term)(t)}
}