diff --git a/stdlib/public/core/StringLegacy.swift b/stdlib/public/core/StringLegacy.swift index c2e69a4426102..30f13ae928901 100644 --- a/stdlib/public/core/StringLegacy.swift +++ b/stdlib/public/core/StringLegacy.swift @@ -124,12 +124,16 @@ extension String { public func hasPrefix(_ prefix: String) -> Bool { if _fastPath(self._guts.isNFCFastUTF8 && prefix._guts.isNFCFastUTF8) { guard prefix._guts.count <= self._guts.count else { return false } - return prefix._guts.withFastUTF8 { nfcPrefix in + let isPrefix = prefix._guts.withFastUTF8 { nfcPrefix in let prefixEnd = nfcPrefix.count return self._guts.withFastUTF8(range: 0.. Bool { if _fastPath(self._guts.isNFCFastUTF8 && suffix._guts.isNFCFastUTF8) { - guard suffix._guts.count <= self._guts.count else { return false } - return suffix._guts.withFastUTF8 { nfcSuffix in - let suffixStart = self._guts.count - nfcSuffix.count + let suffixStart = self._guts.count - suffix._guts.count + guard suffixStart >= 0 else { return false } + let isSuffix = suffix._guts.withFastUTF8 { nfcSuffix in return self._guts.withFastUTF8(range: suffixStart.. ComparisonTest in - switch (test.expectedUnicodeCollation, test.lhs, test.rhs) { - - case (.gt, "\r\n", "\n"): - return test.replacingPredicate(.objCRuntime( - "blocked on rdar://problem/19036555")) - - default: - return test - } -} - -for test in substringTests { +for test in tests { StringTests.test("hasPrefix,hasSuffix: line \(test.loc.line)") .skip(.nativeRuntime( "String.has{Prefix,Suffix} defined when _runtime(_ObjC)")) @@ -532,4 +517,15 @@ StringTests.test("_isIdentical(to:)") { expectTrue(g._isIdentical(to: g)) } +StringTests.test("hasPrefix/hasSuffix vs Character boundaries") { + // https://github.com/apple/swift/issues/67427 + let s1 = "\r\n" + let s2 = "\r\n" + "cafe" + "\r\n" + + expectFalse(s1.hasPrefix("\r")) + expectFalse(s1.hasSuffix("\n")) + expectFalse(s2.hasPrefix("\r")) + expectFalse(s2.hasSuffix("\n")) +} + runAllTests()