1
0
mirror of https://github.com/golang/go synced 2024-11-23 22:00:11 -07:00

cmd/compile/internal/types2: better error message when using comparable in union

Fixes #49602.

Change-Id: I3499f8a485a2c8ec8afc74c5ef7b20d42c943a05
Reviewed-on: https://go-review.googlesource.com/c/go/+/372674
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Robert Griesemer 2021-12-15 19:50:33 -08:00
parent 33a1a93a92
commit c3561dd346
2 changed files with 29 additions and 1 deletions

View File

@ -0,0 +1,19 @@
// 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\)
}

View File

@ -108,7 +108,16 @@ func parseUnion(check *Checker, uexpr syntax.Expr) Type {
// 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
}