aboutsummaryrefslogtreecommitdiff
path: root/test/typeparam
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2022-01-06 12:39:37 -0800
committerDan Scales <danscales@google.com>2022-01-07 18:40:16 +0000
commitf1596d76f488e4d82d217418df4191f34b71d117 (patch)
tree1771b8b19ecd2dd2588330fe92c88600045dc631 /test/typeparam
parentade5488d75fefc4afd72f2f6090f4c823c93d083 (diff)
downloadgo-f1596d76f488e4d82d217418df4191f34b71d117.tar.xz
cmd/compile: fix conv of slice of user-define byte type to string
types2 allows the conversion of a slice of a user-defined byte type B (not builtin uint8 or byte) to string. But runtime.slicebytetostring requires a []byte argument, so add in a CONVNOP from []B to []byte if needed. Same for the conversion of a slice of user-defined rune types to string. I made the same change in the transformations of the old typechecker, so as to keep tcConv() and transformConv() in sync. That fixes the bug for -G=0 mode as well. Fixes #23536 Change-Id: Ic79364427f27489187f3f8015bdfbf0769a70d69 Reviewed-on: https://go-review.googlesource.com/c/go/+/376056 Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Keith Randall <khr@golang.org> Trust: Dan Scales <danscales@google.com> Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'test/typeparam')
-rw-r--r--test/typeparam/issue23536.go32
1 files changed, 32 insertions, 0 deletions
diff --git a/test/typeparam/issue23536.go b/test/typeparam/issue23536.go
new file mode 100644
index 0000000000..a4f061802f
--- /dev/null
+++ b/test/typeparam/issue23536.go
@@ -0,0 +1,32 @@
+// run -gcflags=-G=3
+
+// 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.
+
+// Test case where a slice of a user-defined byte type (not uint8 or byte) is
+// converted to a string. Same for slice of runes.
+
+package main
+
+type MyByte byte
+
+type MyRune rune
+
+func f[T []MyByte](x T) string {
+ return string(x)
+}
+
+func g[T []MyRune](x T) string {
+ return string(x)
+}
+
+func main() {
+ var y []MyByte
+ _ = f(y)
+ _ = string(y)
+
+ var z []MyRune
+ _ = g(z)
+ _ = string(z)
+}