| 
 | 1 | +use core::cell::RefCell;  | 
 | 2 | +use core::iter::zip;  | 
1 | 3 | use core::num::NonZero;  | 
2 | 4 | 
 
  | 
3 | 5 | /// A wrapper struct that implements `Eq` and `Ord` based on the wrapped  | 
@@ -642,6 +644,26 @@ fn test_collect_for_tuples() {  | 
642 | 644 |     assert!(e.2 == d);  | 
643 | 645 | }  | 
644 | 646 | 
 
  | 
 | 647 | +#[test]  | 
 | 648 | +fn test_extend_for_tuple_side_effects_order() {  | 
 | 649 | +    struct TrackingExtender<'a, T>(&'static str, &'a RefCell<Vec<(&'static str, Vec<T>)>>, Vec<T>);  | 
 | 650 | +    impl<T: Clone> Extend<T> for TrackingExtender<'_, T> {  | 
 | 651 | +        fn extend<I: IntoIterator<Item = T>>(&mut self, i: I) {  | 
 | 652 | +            let items = Vec::from_iter(i);  | 
 | 653 | +            self.1.borrow_mut().push((self.0, items.clone()));  | 
 | 654 | +            self.2.extend(items);  | 
 | 655 | +        }  | 
 | 656 | +    }  | 
 | 657 | + | 
 | 658 | +    let effects = RefCell::new(vec![]);  | 
 | 659 | +    let l = TrackingExtender("l", &effects, vec![]);  | 
 | 660 | +    let r = TrackingExtender("r", &effects, vec![]);  | 
 | 661 | +    let mut p = ((l, r), ());  | 
 | 662 | +    p.extend(zip([(1, 2), (3, 4)], [(), ()]));  | 
 | 663 | +    let effects = effects.into_inner();  | 
 | 664 | +    assert_eq!(effects, [("l", vec![1]), ("r", vec![2]), ("l", vec![3]), ("r", vec![4])]);  | 
 | 665 | +}  | 
 | 666 | + | 
645 | 667 | // just tests by whether or not this compiles  | 
646 | 668 | fn _empty_impl_all_auto_traits<T>() {  | 
647 | 669 |     use std::panic::{RefUnwindSafe, UnwindSafe};  | 
 | 
0 commit comments