]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't convert to interface{} for un-comparable types in generic switch
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Fri, 1 Jul 2022 09:33:54 +0000 (16:33 +0700)
committerCuong Manh Le <cuong.manhle.vn@gmail.com>
Fri, 8 Jul 2022 12:57:49 +0000 (12:57 +0000)
Fixes #53635

Change-Id: I41f383be8870432fc0d29fa83687911ddd8217f1
Reviewed-on: https://go-review.googlesource.com/c/go/+/415634
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/noder/stencil.go
test/fixedbugs/issue53635.go [new file with mode: 0644]

index 796a74052863176d404e6ef74b5848fdf2eb4eaa..1534a1fa49ccfd3b4c475839e340baafa68b7ec0 100644 (file)
@@ -1214,6 +1214,9 @@ func (subst *subster) node(n ir.Node) ir.Node {
                        if m.Tag != nil && m.Tag.Op() == ir.OTYPESW {
                                break // Nothing to do here for type switches.
                        }
+                       if m.Tag != nil && !types.IsComparable(m.Tag.Type()) {
+                               break // Nothing to do here for un-comparable types.
+                       }
                        if m.Tag != nil && !m.Tag.Type().IsEmptyInterface() && m.Tag.Type().HasShape() {
                                // To implement a switch on a value that is or has a type parameter, we first convert
                                // that thing we're switching on to an interface{}.
diff --git a/test/fixedbugs/issue53635.go b/test/fixedbugs/issue53635.go
new file mode 100644 (file)
index 0000000..bea5493
--- /dev/null
@@ -0,0 +1,31 @@
+// run
+
+// Copyright 2022 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 main
+
+func main() {
+       f[int]()
+}
+
+func f[T any]() {
+       switch []T(nil) {
+       case nil:
+       default:
+               panic("FAIL")
+       }
+
+       switch (func() T)(nil) {
+       case nil:
+       default:
+               panic("FAIL")
+       }
+
+       switch (map[int]T)(nil) {
+       case nil:
+       default:
+               panic("FAIL")
+       }
+}