@@ -1204,22 +1204,16 @@ fn test_from_iter_specialization_with_iterator_adapters() {
1204
1204
#[ test]
1205
1205
fn test_in_place_specialization_step_up_down ( ) {
1206
1206
fn assert_in_place_trait < T : InPlaceIterable > ( _: & T ) { }
1207
- let src = vec ! [ [ 0u8 ; 4 ] ; 256 ] ;
1208
- let srcptr = src. as_ptr ( ) ;
1209
- let src_cap = src. capacity ( ) ;
1210
- let iter = src. into_iter ( ) . flatten ( ) ;
1211
- assert_in_place_trait ( & iter) ;
1212
- let sink = iter. collect :: < Vec < _ > > ( ) ;
1213
- let sinkptr = sink. as_ptr ( ) ;
1214
- assert_eq ! ( srcptr as * const u8 , sinkptr) ;
1215
- assert_eq ! ( src_cap * 4 , sink. capacity( ) ) ;
1216
1207
1217
- let iter = sink. into_iter ( ) . array_chunks :: < 4 > ( ) ;
1208
+ let src = vec ! [ 0u8 ; 1024 ] ;
1209
+ let srcptr = src. as_ptr ( ) ;
1210
+ let src_bytes = src. capacity ( ) ;
1211
+ let iter = src. into_iter ( ) . array_chunks :: < 4 > ( ) ;
1218
1212
assert_in_place_trait ( & iter) ;
1219
1213
let sink = iter. collect :: < Vec < _ > > ( ) ;
1220
1214
let sinkptr = sink. as_ptr ( ) ;
1221
- assert_eq ! ( srcptr, sinkptr) ;
1222
- assert_eq ! ( src_cap , sink. capacity( ) ) ;
1215
+ assert_eq ! ( srcptr. addr ( ) , sinkptr. addr ( ) ) ;
1216
+ assert_eq ! ( src_bytes , sink. capacity( ) * 4 ) ;
1223
1217
1224
1218
let mut src: Vec < u8 > = Vec :: with_capacity ( 17 ) ;
1225
1219
let src_bytes = src. capacity ( ) ;
@@ -1236,13 +1230,6 @@ fn test_in_place_specialization_step_up_down() {
1236
1230
let sink: Vec < [ u8 ; 2 ] > = iter. collect ( ) ;
1237
1231
assert_eq ! ( sink. len( ) , 8 ) ;
1238
1232
assert ! ( sink. capacity( ) <= 25 ) ;
1239
-
1240
- let src = vec ! [ [ 0u8 ; 4 ] ; 256 ] ;
1241
- let srcptr = src. as_ptr ( ) ;
1242
- let iter = src. into_iter ( ) . flat_map ( |a| a. into_iter ( ) . map ( |b| b. wrapping_add ( 1 ) ) ) ;
1243
- assert_in_place_trait ( & iter) ;
1244
- let sink = iter. collect :: < Vec < _ > > ( ) ;
1245
- assert_eq ! ( srcptr as * const u8 , sink. as_ptr( ) ) ;
1246
1233
}
1247
1234
1248
1235
#[ test]
@@ -1350,6 +1337,20 @@ fn test_collect_after_iterator_clone() {
1350
1337
assert_eq ! ( v, [ 1 , 1 , 1 , 1 , 1 ] ) ;
1351
1338
assert ! ( v. len( ) <= v. capacity( ) ) ;
1352
1339
}
1340
+
1341
+ // regression test for #135103, similar to the one above Flatten/FlatMap had an unsound InPlaceIterable
1342
+ // implementation.
1343
+ #[ test]
1344
+ fn test_flatten_clone ( ) {
1345
+ const S : String = String :: new ( ) ;
1346
+
1347
+ let v = vec ! [ [ S , "Hello World!" . into( ) ] , [ S , S ] ] ;
1348
+ let mut i = v. into_iter ( ) . flatten ( ) ;
1349
+ let _ = i. next ( ) ;
1350
+ let result: Vec < String > = i. clone ( ) . collect ( ) ;
1351
+ assert_eq ! ( result, [ "Hello World!" , "" , "" ] ) ;
1352
+ }
1353
+
1353
1354
#[ test]
1354
1355
fn test_cow_from ( ) {
1355
1356
let borrowed: & [ _ ] = & [ "borrowed" , "(slice)" ] ;
0 commit comments