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