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:
parent
33a1a93a92
commit
c3561dd346
19
src/cmd/compile/internal/types2/testdata/fixedbugs/issue49602.go2
vendored
Normal file
19
src/cmd/compile/internal/types2/testdata/fixedbugs/issue49602.go2
vendored
Normal 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\)
|
||||
}
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user