This code detects the case where one of the borrows is inside the let init expr while the other end is not. If that happens, we don't want to suggest adding a semicolon, because it won't work.
47 lines
917 B
Rust
47 lines
917 B
Rust
// https://github.com/rust-lang/rust/issues/133941
|
|
use std::marker::PhantomData;
|
|
|
|
struct Bar<'a>(PhantomData<&'a mut i32>);
|
|
|
|
impl<'a> Drop for Bar<'a> {
|
|
fn drop(&mut self) {}
|
|
}
|
|
|
|
struct Foo();
|
|
|
|
impl Foo {
|
|
fn f(&mut self) -> Option<Bar<'_>> {
|
|
None
|
|
}
|
|
|
|
fn g(&mut self) {}
|
|
}
|
|
|
|
fn main() {
|
|
let mut foo = Foo();
|
|
while let Some(_) = foo.f() {
|
|
//~^ HELP matches!
|
|
foo.g();
|
|
//~^ ERROR [E0499]
|
|
}
|
|
if let Some(_) = foo.f() {
|
|
//~^ HELP matches!
|
|
foo.g();
|
|
//~^ ERROR [E0499]
|
|
}
|
|
while let Some(_x) = foo.f() {
|
|
foo.g();
|
|
//~^ ERROR [E0499]
|
|
}
|
|
if let Some(_x) = foo.f() {
|
|
foo.g();
|
|
//~^ ERROR [E0499]
|
|
}
|
|
while let Some(_x) = {let _x = foo.f(); foo.g(); None::<()>} {
|
|
//~^ ERROR [E0499]
|
|
}
|
|
if let Some(_x) = {let _x = foo.f(); foo.g(); None::<()>} {
|
|
//~^ ERROR [E0499]
|
|
}
|
|
}
|