--- /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.
+
+package p
+
+type M interface {
+ m()
+}
+
+type C interface {
+ comparable
+}
+
+type _ interface{
+ int | M // ERROR cannot use p\.M in union \(p\.M contains methods\)
+ int | comparable // ERROR cannot use comparable in union
+ int | C // ERROR cannot use p\.C in union \(p\.C embeds comparable\)
+}
// in the beginning. Embedded interfaces with tilde are excluded above. If we reach
// here, we must have at least two terms in the union.
if f != nil && !f.typeSet().IsTypeSet() {
- check.errorf(tlist[i], "cannot use %s in union (interface contains methods)", t)
+ switch {
+ case f.typeSet().NumMethods() != 0:
+ check.errorf(tlist[i], "cannot use %s in union (%s contains methods)", t, t)
+ case t.typ == universeComparable.Type():
+ check.error(tlist[i], "cannot use comparable in union")
+ case f.typeSet().comparable:
+ check.errorf(tlist[i], "cannot use %s in union (%s embeds comparable)", t, t)
+ default:
+ panic("not a type set but no methods and not comparable")
+ }
continue // don't report another error for t
}