@@ -375,14 +375,16 @@ impl str {
375375 // Safety: We have written only valid ASCII to our vec
376376 let mut s = unsafe { String :: from_utf8_unchecked ( out) } ;
377377
378- for ( i, c) in rest[ .. ] . char_indices ( ) {
378+ for ( i, c) in rest. char_indices ( ) {
379379 if c == 'Σ' {
380380 // Σ maps to σ, except at the end of a word where it maps to ς.
381381 // This is the only conditional (contextual) but language-independent mapping
382382 // in `SpecialCasing.txt`,
383383 // so hard-code it rather than have a generic "condition" mechanism.
384384 // See https://github.com/rust-lang/rust/issues/26035
385- map_uppercase_sigma ( rest, i, & mut s)
385+ let out_len = self . len ( ) - rest. len ( ) ;
386+ let sigma_lowercase = map_uppercase_sigma ( & self , i + out_len) ;
387+ s. push ( sigma_lowercase) ;
386388 } else {
387389 match conversions:: to_lower ( c) {
388390 [ a, '\0' , _] => s. push ( a) ,
@@ -400,13 +402,13 @@ impl str {
400402 }
401403 return s;
402404
403- fn map_uppercase_sigma ( from : & str , i : usize , to : & mut String ) {
405+ fn map_uppercase_sigma ( from : & str , i : usize ) -> char {
404406 // See https://www.unicode.org/versions/Unicode7.0.0/ch03.pdf#G33992
405407 // for the definition of `Final_Sigma`.
406408 debug_assert ! ( 'Σ' . len_utf8( ) == 2 ) ;
407409 let is_word_final = case_ignorable_then_cased ( from[ ..i] . chars ( ) . rev ( ) )
408410 && !case_ignorable_then_cased ( from[ i + 2 ..] . chars ( ) ) ;
409- to . push_str ( if is_word_final { "ς" } else { "σ" } ) ;
411+ if is_word_final { 'ς' } else { 'σ' }
410412 }
411413
412414 fn case_ignorable_then_cased < I : Iterator < Item = char > > ( iter : I ) -> bool {
0 commit comments