aboutsummaryrefslogtreecommitdiff
path: root/src/strings/clone_test.go
diff options
context:
space:
mode:
authorMartin Möhrmann <martin@golang.org>2021-11-01 06:42:01 +0100
committerMartin Möhrmann <martin@golang.org>2021-11-01 14:45:28 +0000
commit82f902ae8e2b7f7eff0cdb087e47e939cc296a62 (patch)
tree90fdfdaacdb208e39bcbb9efbe4a5b0e5fe72944 /src/strings/clone_test.go
parent4056934e483c51fa046f9c2d1ee35f0385b84d91 (diff)
downloadgo-82f902ae8e2b7f7eff0cdb087e47e939cc296a62.tar.xz
strings: align Clone output with string([]byte(""))
Add a comment how strings of length 0 are treated and that they always will result in the return of a string equal to the constant string "". The previous implementation would return a string header that uses runtime.zerobase as the backing array pointer while the string constant "" has 0 as pointer value. Using 0 has the backing array pointer is also the behaviour of string([]byte(input)) which makes the new behaviour a better drop in replacement. Change-Id: Ic5460e9494b6708edbdfa4361e878d50db54ba10 Reviewed-on: https://go-review.googlesource.com/c/go/+/360255 Trust: Martin Möhrmann <martin@golang.org> Run-TryBot: Martin Möhrmann <martin@golang.org> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/strings/clone_test.go')
-rw-r--r--src/strings/clone_test.go11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/strings/clone_test.go b/src/strings/clone_test.go
index 5396771047..a9ba8add23 100644
--- a/src/strings/clone_test.go
+++ b/src/strings/clone_test.go
@@ -11,9 +11,13 @@ import (
"unsafe"
)
+var emptyString string
+
func TestClone(t *testing.T) {
var cloneTests = []string{
"",
+ strings.Clone(""),
+ strings.Repeat("a", 42)[:0],
"short",
strings.Repeat("a", 42),
}
@@ -25,9 +29,14 @@ func TestClone(t *testing.T) {
inputHeader := (*reflect.StringHeader)(unsafe.Pointer(&input))
cloneHeader := (*reflect.StringHeader)(unsafe.Pointer(&clone))
- if inputHeader.Data == cloneHeader.Data {
+ if len(input) != 0 && cloneHeader.Data == inputHeader.Data {
t.Errorf("Clone(%q) return value should not reference inputs backing memory.", input)
}
+
+ emptyHeader := (*reflect.StringHeader)(unsafe.Pointer(&emptyString))
+ if len(input) == 0 && cloneHeader.Data != emptyHeader.Data {
+ t.Errorf("Clone(%#v) return value should be equal to empty string.", inputHeader)
+ }
}
}