]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/types2: better error message when using comparable in union
authorRobert Griesemer <gri@golang.org>
Thu, 16 Dec 2021 03:50:33 +0000 (19:50 -0800)
committerRobert Griesemer <gri@golang.org>
Fri, 17 Dec 2021 00:14:51 +0000 (00:14 +0000)
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>

src/cmd/compile/internal/types2/testdata/fixedbugs/issue49602.go2 [new file with mode: 0644]
src/cmd/compile/internal/types2/union.go

diff --git a/src/cmd/compile/internal/types2/testdata/fixedbugs/issue49602.go2 b/src/cmd/compile/internal/types2/testdata/fixedbugs/issue49602.go2
new file mode 100644 (file)
index 0000000..9edbf14
--- /dev/null
@@ -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\)
+}
index 6f66260af4618963cdb4b4f85f4fba35d3039195..3c0df04ccdc7769376f69801af00139649da723d 100644 (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
                        }