diff options
| author | bors <bors@rust-lang.org> | 2020-11-22 23:59:48 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-11-22 23:59:48 +0000 |
| commit | 32da90b431919eedb3e281a91caea063ba4edb77 (patch) | |
| tree | 8b730b4ad40ba1357221d5944e49071e1ccf0182 /src | |
| parent | a0d664bae6ca79c54cc054aa2403198e105190a2 (diff) | |
| parent | 41c033b2f7b2eb770bb9b4169e0bbaf051c6c7b1 (diff) | |
| download | rust-32da90b431919eedb3e281a91caea063ba4edb77.tar.gz rust-32da90b431919eedb3e281a91caea063ba4edb77.zip | |
Auto merge of #79319 - m-ou-se:rollup-d9n5viq, r=m-ou-se
Rollup of 10 pull requests
Successful merges:
- #76941 (Add f{32,64}::is_subnormal)
- #77697 (Split each iterator adapter and source into individual modules)
- #78305 (Stabilize alloc::Layout const functions)
- #78608 (Stabilize refcell_take)
- #78793 (Clean up `StructuralEq` docs)
- #79267 (BTreeMap: address namespace conflicts)
- #79293 (Add test for eval order for a+=b)
- #79295 (BTreeMap: fix minor testing mistakes in #78903)
- #79297 (BTreeMap: swap the names of NodeRef::new and Root::new_leaf)
- #79299 (Stabilise `then`)
Failed merges:
r? `@ghost`
`@rustbot` modify labels: rollup
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/expr/compound-assignment/eval-order.rs | 76 | ||||
| -rw-r--r-- | src/test/ui/issues/issue-31173.stderr | 6 | ||||
| -rw-r--r-- | src/test/ui/mismatched_types/issue-36053-2.stderr | 2 |
3 files changed, 81 insertions, 3 deletions
diff --git a/src/test/ui/expr/compound-assignment/eval-order.rs b/src/test/ui/expr/compound-assignment/eval-order.rs new file mode 100644 index 00000000000..658adae193e --- /dev/null +++ b/src/test/ui/expr/compound-assignment/eval-order.rs @@ -0,0 +1,76 @@ +// Test evaluation order of operands of the compound assignment operators + +// run-pass + +use std::ops::AddAssign; + +enum Side { + Lhs, + Rhs, +} + +// In the following tests, we place our value into a wrapper type so that we +// can do an element access as the outer place expression. If we just had the +// block expression, it'd be a value expression and not compile. +struct Wrapper<T>(T); + +// Evaluation order for `a op= b` where typeof(a) and typeof(b) are primitives +// is first `b` then `a`. +fn primitive_compound() { + let mut side_order = vec![]; + let mut int = Wrapper(0); + + { + side_order.push(Side::Lhs); + int + }.0 += { + side_order.push(Side::Rhs); + 0 + }; + + assert!(matches!(side_order[..], [Side::Rhs, Side::Lhs])); +} + +// Evaluation order for `a op=b` otherwise is first `a` then `b`. +fn generic_compound<T: AddAssign<T> + Default>() { + let mut side_order = vec![]; + let mut add_assignable: Wrapper<T> = Wrapper(Default::default()); + + { + side_order.push(Side::Lhs); + add_assignable + }.0 += { + side_order.push(Side::Rhs); + Default::default() + }; + + assert!(matches!(side_order[..], [Side::Lhs, Side::Rhs])); +} + +fn custom_compound() { + struct Custom; + + impl AddAssign<()> for Custom { + fn add_assign(&mut self, _: ()) { + // this block purposely left blank + } + } + + let mut side_order = vec![]; + let mut custom = Wrapper(Custom); + + { + side_order.push(Side::Lhs); + custom + }.0 += { + side_order.push(Side::Rhs); + }; + + assert!(matches!(side_order[..], [Side::Lhs, Side::Rhs])); +} + +fn main() { + primitive_compound(); + generic_compound::<i32>(); + custom_compound(); +} diff --git a/src/test/ui/issues/issue-31173.stderr b/src/test/ui/issues/issue-31173.stderr index 818e004ffc8..d371703e295 100644 --- a/src/test/ui/issues/issue-31173.stderr +++ b/src/test/ui/issues/issue-31173.stderr @@ -13,11 +13,13 @@ error[E0599]: no method named `collect` found for struct `Cloned<TakeWhile<&mut LL | .collect(); | ^^^^^^^ method not found in `Cloned<TakeWhile<&mut std::vec::IntoIter<u8>, [closure@$DIR/issue-31173.rs:6:39: 9:6]>>` | - ::: $SRC_DIR/core/src/iter/adapters/mod.rs:LL:COL + ::: $SRC_DIR/core/src/iter/adapters/cloned.rs:LL:COL | LL | pub struct Cloned<I> { | -------------------- doesn't satisfy `_: Iterator` -... + | + ::: $SRC_DIR/core/src/iter/adapters/take_while.rs:LL:COL + | LL | pub struct TakeWhile<I, P> { | -------------------------- doesn't satisfy `<_ as Iterator>::Item = &_` | diff --git a/src/test/ui/mismatched_types/issue-36053-2.stderr b/src/test/ui/mismatched_types/issue-36053-2.stderr index 0b1fcf58e2e..2efd37b4738 100644 --- a/src/test/ui/mismatched_types/issue-36053-2.stderr +++ b/src/test/ui/mismatched_types/issue-36053-2.stderr @@ -15,7 +15,7 @@ LL | once::<&str>("str").fuse().filter(|a: &str| true).count(); | doesn't satisfy `<_ as FnOnce<(&&str,)>>::Output = bool` | doesn't satisfy `_: FnMut<(&&str,)>` | - ::: $SRC_DIR/core/src/iter/adapters/mod.rs:LL:COL + ::: $SRC_DIR/core/src/iter/adapters/filter.rs:LL:COL | LL | pub struct Filter<I, P> { | ----------------------- doesn't satisfy `_: Iterator` |
