From 4111b21cb02876c1a326aeff120cf1357a31fa53 Mon Sep 17 00:00:00 2001 From: Michael Ilseman Date: Mon, 26 Nov 2018 12:13:07 -0800 Subject: [PATCH] [String] Bug fix for empty-range getCharacters --- stdlib/public/core/StringUTF16View.swift | 2 ++ validation-test/stdlib/StringBreadcrumbs.swift | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/stdlib/public/core/StringUTF16View.swift b/stdlib/public/core/StringUTF16View.swift index 04713784023d0..bd9b7146c344e 100644 --- a/stdlib/public/core/StringUTF16View.swift +++ b/stdlib/public/core/StringUTF16View.swift @@ -537,6 +537,8 @@ extension String { ) { _internalInvariant(_guts.isFastUTF8) + if _slowPath(range.isEmpty) { return } + return _guts.withFastUTF8 { utf8 in var writeIdx = 0 let writeEnd = buffer.count diff --git a/validation-test/stdlib/StringBreadcrumbs.swift b/validation-test/stdlib/StringBreadcrumbs.swift index 450bb10701478..8cab27cede900 100644 --- a/validation-test/stdlib/StringBreadcrumbs.swift +++ b/validation-test/stdlib/StringBreadcrumbs.swift @@ -38,14 +38,17 @@ let StringBreadcrumbsTests = TestSuite("StringBreadcrumbsTests") func validateBreadcrumbs(_ str: String) { var utf16CodeUnits = Array(str.utf16) - var utf16Indices = Array(str.utf16.indices) var outputBuffer = Array(repeating: 0, count: utf16CodeUnits.count) - for i in 0..<(utf16CodeUnits.count-1) { - for j in (i+1).. <=> Range expectEqual(utf16Indices[i], indexRange.lowerBound) expectEqual(utf16Indices[j], indexRange.upperBound) @@ -69,6 +72,13 @@ func validateBreadcrumbs(_ str: String) { } } +StringBreadcrumbsTests.test("uniform strings") { + validateBreadcrumbs(smallASCII) + validateBreadcrumbs(largeASCII) + validateBreadcrumbs(smallUnicode) + validateBreadcrumbs(largeUnicode) +} + StringBreadcrumbsTests.test("largeString") { validateBreadcrumbs(largeString) }