1 // This is testing an attempt to corrupt the discriminant of the match
2 // arm in a guard, followed by an attempt to continue matching on that
3 // corrupted discriminant in the remaining match arms.
5 // Basically this is testing that our new NLL feature of emitting a
6 // fake read on each match arm is catching cases like this.
8 // This case is interesting because it includes a guard that
9 // diverges, and therefore a single final fake-read at the very end
10 // after the final match arm would not suffice.
12 // It is also interesting because the access to the corrupted data
13 // occurs in the pattern-match itself, and not in the guard
19 let mut x
= &mut Some(&2);
20 let force_fn_once
= ForceFnOnce
;
22 &mut None
=> panic
!("unreachable"),
25 // ForceFnOnce needed to exploit #27282
26 (|| { *x = None; drop(force_fn_once); }
)();
27 //~^ ERROR cannot mutably borrow `x` in match guard [E0510]
31 // this segfaults if we corrupted the discriminant, because
32 // the compiler gets to *assume* that it cannot be the `None`
33 // case, even though that was the effect of the guard.
38 _
=> panic
!("unreachable"),