@@ -169,5 +169,67 @@ StringTraps.test("UTF8ViewIndex/offsetCrash")
169
169
_ = s8. utf8 [ i]
170
170
}
171
171
172
+ StringTraps . test ( " UnicodeScalarView index(before:) trap on startIndex " )
173
+ . skip (
174
+ . custom( { _isFastAssertConfiguration ( ) } ,
175
+ reason: " trap is not guaranteed to happen in -Ounchecked " ) )
176
+ . code {
177
+ guard #available( SwiftStdlib 5 . 7 , * ) else { return }
178
+
179
+ let s = " abc "
180
+ var i = s. unicodeScalars. endIndex
181
+ i = s. unicodeScalars. index ( before: i)
182
+ i = s. unicodeScalars. index ( before: i)
183
+ i = s. unicodeScalars. index ( before: i)
184
+ expectCrashLater ( )
185
+ i = s. unicodeScalars. index ( before: i)
186
+ }
187
+
188
+ StringTraps . test ( " UnicodeScalarView index(before:) trap on startIndex after scalar alignment " )
189
+ . skip (
190
+ . custom( { _isFastAssertConfiguration ( ) } ,
191
+ reason: " trap is not guaranteed to happen in -Ounchecked " ) )
192
+ . code {
193
+ guard #available( SwiftStdlib 5 . 7 , * ) else { return }
194
+
195
+ let s = " 🥦 Floret of broccoli "
196
+ var i = s. utf8. index ( after: s. utf8. startIndex)
197
+ expectCrashLater ( )
198
+ // `i` is equivalent to `s.startIndex` as far as `String.UnicodeScalarView` is
199
+ // concerned
200
+ i = s. unicodeScalars. index ( before: i)
201
+ }
202
+
203
+ StringTraps . test ( " UnicodeScalarView index(after:) trap on endIndex " )
204
+ . skip (
205
+ . custom( { _isFastAssertConfiguration ( ) } ,
206
+ reason: " trap is not guaranteed to happen in -Ounchecked " ) )
207
+ . code {
208
+ guard #available( SwiftStdlib 5 . 7 , * ) else { return }
209
+
210
+ let s = " abc "
211
+ var i = s. unicodeScalars. startIndex
212
+ i = s. unicodeScalars. index ( after: i)
213
+ i = s. unicodeScalars. index ( after: i)
214
+ i = s. unicodeScalars. index ( after: i)
215
+ expectCrashLater ( )
216
+ i = s. unicodeScalars. index ( after: i)
217
+ }
218
+
219
+ StringTraps . test ( " UnicodeScalarView index(after:) trap on i > endIndex " )
220
+ . skip (
221
+ . custom( { _isFastAssertConfiguration ( ) } ,
222
+ reason: " trap is not guaranteed to happen in -Ounchecked " ) )
223
+ . code {
224
+ guard #available( SwiftStdlib 5 . 7 , * ) else { return }
225
+
226
+ let long = " abcd "
227
+ var i = long. unicodeScalars. endIndex
228
+
229
+ let s = " abc "
230
+ expectCrashLater ( )
231
+ i = s. unicodeScalars. index ( after: i)
232
+ }
233
+
172
234
runAllTests ( )
173
235
0 commit comments