diff options
| author | Dan Scales <danscales@google.com> | 2022-01-06 12:39:37 -0800 |
|---|---|---|
| committer | Dan Scales <danscales@google.com> | 2022-01-07 18:40:16 +0000 |
| commit | f1596d76f488e4d82d217418df4191f34b71d117 (patch) | |
| tree | 1771b8b19ecd2dd2588330fe92c88600045dc631 /test/typeparam | |
| parent | ade5488d75fefc4afd72f2f6090f4c823c93d083 (diff) | |
| download | go-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.go | 32 |
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) +} |
