Change:
} } <ins> fn and_chain(&self) { // issue-103107 if self.option_loud_drop(1).is_some() // 1 && self.option_loud_drop(2).is_some() // 2 && self.option_loud_drop(3).is_some() // 3 && self.option_loud_drop(4).is_some() // 4 && self.option_loud_drop(5).is_some() // 5 { self.print(6); // 6 } let _ = self.option_loud_drop(7).is_some() // 1 && self.option_loud_drop(8).is_some() // 2 && self.option_loud_drop(9).is_some(); // 3 self.print(10); // 4 // Test associativity if self.option_loud_drop(11).is_some() // 1 && (self.option_loud_drop(12).is_some() // 2 && self.option_loud_drop(13).is_some() // 3 && self.option_loud_drop(14).is_some()) // 4 && self.option_loud_drop(15).is_some() // 5 { self.print(16); // 6 } } fn or_chain(&self) { // issue-103107 if self.option_loud_drop(1).is_none() // 1 || self.option_loud_drop(2).is_none() // 2 || self.option_loud_drop(3).is_none() // 3 || self.option_loud_drop(4).is_none() // 4 || self.option_loud_drop(5).is_some() // 5 { self.print(6); // 6 } let _ = self.option_loud_drop(7).is_none() // 1 || self.option_loud_drop(8).is_none() // 2 || self.option_loud_drop(9).is_none(); // 3 self.print(10); // 4 // Test associativity if self.option_loud_drop(11).is_none() // 1 || (self.option_loud_drop(12).is_none() // 2 || self.option_loud_drop(13).is_none() // 3 || self.option_loud_drop(14).is_none()) // 4 || self.option_loud_drop(15).is_some() // 5 { self.print(16); // 6 } } fn mixed_and_or_chain(&self) { // issue-103107 if self.option_loud_drop(1).is_none() // 1 || self.option_loud_drop(2).is_none() // 2 || self.option_loud_drop(3).is_some() // 3 && self.option_loud_drop(4).is_some() // 4 && self.option_loud_drop(5).is_none() // 5 || self.option_loud_drop(6).is_none() // 6 || self.option_loud_drop(7).is_some() // 7 { self.print(8); // 8 } } </ins> fn let_chain(&self) { // take the "then" branch <del> if self.option_loud_drop(2).is_some() // 2 && self.option_loud_drop(1).is_some() // 1 </del> <ins> if self.option_loud_drop(1).is_some() // 1 && self.option_loud_drop(2).is_some() // 2 </ins> && let Some(_d) = self.option_loud_drop(4) { // 4 self.print(3); // 3 } // take the "else" branch <del> if self.option_loud_drop(6).is_some() // 2 && self.option_loud_drop(5).is_some() // 1 </del> <ins> if self.option_loud_drop(5).is_some() // 1 && self.option_loud_drop(6).is_some() // 2 </ins> && let None = self.option_loud_drop(8) { // 4 unreachable!(); } else {

Discussion:
If you consider the following program: It will print "2,3,4,1," four times. The issue occurs on recent nightly as well as all the way back to 1.0.0. This is a bit weird IMO, and makes && and chains non-associative. IMO it's a bug that should be fixed to print "1,2,3,4,". IDK how much we can do about this at the current point, given backwards compatibility concerns. It might not stop programs from compiling, but programs might differ in their runtime output. There is with the name "Stabilize drop order" but if you read the text, it only concerns the drop order of structs, vecs, tuples, etc. Also, after the merge, the RFC author themself made a PR to add regression tests in , and mentioned that that PR was enough for getting the RFC tested. The RFC didn't include anything about && chains. I think the language should not be interpreted too generally. It took a long time until in which we we got some further drop order tests for "established" language constructs, while there have been many PRs with drop order tests for let-else. Originally I've discovered this in: , but given that it's so visible, I'm sure that someone else has already complained about this. Maybe one can just implement the change to "1,2,3,4," and make a crater run for it? cc label T-lang