diff options
author | Robert Griesemer <gri@golang.org> | 2021-12-16 16:28:38 -0800 |
---|---|---|
committer | Robert Findley <rfindley@google.com> | 2021-12-20 15:13:56 +0000 |
commit | 7c94355b738170cf06484d502af7f2d935831c2b (patch) | |
tree | 33e6d750279986aac7ab31c46f511caf3916c69f /src/go | |
parent | a2004de0885cc3796fed6dff54678efb8ffa4d01 (diff) | |
download | go-7c94355b738170cf06484d502af7f2d935831c2b.tar.gz go-7c94355b738170cf06484d502af7f2d935831c2b.zip |
go/types: better error message when using comparable in union
This is a port of CL 372674 from types2 to go/types with
minor adjustments for error handling.
For #49602.
Change-Id: I726081325a2ff2d5690d11ddc8a830bbcbd8ab33
Reviewed-on: https://go-review.googlesource.com/c/go/+/372954
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
Diffstat (limited to 'src/go')
-rw-r--r-- | src/go/types/testdata/fixedbugs/issue49602.go2 | 19 | ||||
-rw-r--r-- | src/go/types/union.go | 11 |
2 files changed, 29 insertions, 1 deletions
diff --git a/src/go/types/testdata/fixedbugs/issue49602.go2 b/src/go/types/testdata/fixedbugs/issue49602.go2 new file mode 100644 index 0000000000..208501fafd --- /dev/null +++ b/src/go/types/testdata/fixedbugs/issue49602.go2 @@ -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\) +} diff --git a/src/go/types/union.go b/src/go/types/union.go index 7cd5b2a88b..9c59279447 100644 --- a/src/go/types/union.go +++ b/src/go/types/union.go @@ -111,7 +111,16 @@ func parseUnion(check *Checker, uexpr ast.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], _InvalidUnion, "cannot use %s in union (interface contains methods)", t) + switch { + case f.typeSet().NumMethods() != 0: + check.errorf(tlist[i], _InvalidUnion, "cannot use %s in union (%s contains methods)", t, t) + case t.typ == universeComparable.Type(): + check.error(tlist[i], _InvalidUnion, "cannot use comparable in union") + case f.typeSet().comparable: + check.errorf(tlist[i], _InvalidUnion, "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 } |