|  | 
|  | 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