Fix structured suggestion for explicit drop
call
This commit is contained in:
parent
2e46cb38f1
commit
70a43e07f6
@ -25,24 +25,24 @@ pub fn check_legal_trait_for_method_call(
|
||||
tcx: TyCtxt<'_>,
|
||||
span: Span,
|
||||
receiver: Option<Span>,
|
||||
expr_span: Span,
|
||||
trait_id: DefId,
|
||||
) {
|
||||
if tcx.lang_items().drop_trait() == Some(trait_id) {
|
||||
let mut err = struct_span_err!(tcx.sess, span, E0040, "explicit use of destructor method");
|
||||
err.span_label(span, "explicit destructor calls not allowed");
|
||||
|
||||
let snippet = receiver
|
||||
let (sp, suggestion) = receiver
|
||||
.and_then(|s| tcx.sess.source_map().span_to_snippet(s).ok())
|
||||
.unwrap_or_default();
|
||||
|
||||
let suggestion =
|
||||
if snippet.is_empty() { "drop".to_string() } else { format!("drop({})", snippet) };
|
||||
.filter(|snippet| !snippet.is_empty())
|
||||
.map(|snippet| (expr_span, format!("drop({})", snippet)))
|
||||
.unwrap_or_else(|| (span, "drop".to_string()));
|
||||
|
||||
err.span_suggestion(
|
||||
span,
|
||||
&format!("consider using `drop` function: `{}`", suggestion),
|
||||
String::new(),
|
||||
Applicability::Unspecified,
|
||||
sp,
|
||||
"consider using `drop` function",
|
||||
suggestion,
|
||||
Applicability::MaybeIncorrect,
|
||||
);
|
||||
|
||||
err.emit();
|
||||
|
@ -1163,7 +1163,7 @@ pub fn instantiate_value_path(
|
||||
debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
|
||||
match container {
|
||||
ty::TraitContainer(trait_did) => {
|
||||
callee::check_legal_trait_for_method_call(tcx, span, None, trait_did)
|
||||
callee::check_legal_trait_for_method_call(tcx, span, None, span, trait_did)
|
||||
}
|
||||
ty::ImplContainer(impl_def_id) => {
|
||||
if segments.len() == 1 {
|
||||
|
@ -507,6 +507,7 @@ fn enforce_illegal_method_limitations(&self, pick: &probe::Pick<'_>) {
|
||||
self.tcx,
|
||||
self.span,
|
||||
Some(self.self_expr.span),
|
||||
self.call_expr.span,
|
||||
trait_def_id,
|
||||
),
|
||||
ty::ImplContainer(..) => {}
|
||||
|
18
src/test/ui/error-codes/E0040.fixed
Normal file
18
src/test/ui/error-codes/E0040.fixed
Normal file
@ -0,0 +1,18 @@
|
||||
// run-rustfix
|
||||
struct Foo {
|
||||
x: i32,
|
||||
}
|
||||
|
||||
impl Drop for Foo {
|
||||
fn drop(&mut self) {
|
||||
println!("kaboom");
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut x = Foo { x: -7 };
|
||||
x.x = 0;
|
||||
println!("{}", x.x);
|
||||
drop(x);
|
||||
//~^ ERROR E0040
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
// run-rustfix
|
||||
struct Foo {
|
||||
x: i32,
|
||||
}
|
||||
@ -10,6 +11,8 @@ fn drop(&mut self) {
|
||||
|
||||
fn main() {
|
||||
let mut x = Foo { x: -7 };
|
||||
x.x = 0;
|
||||
println!("{}", x.x);
|
||||
x.drop();
|
||||
//~^ ERROR E0040
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
error[E0040]: explicit use of destructor method
|
||||
--> $DIR/E0040.rs:13:7
|
||||
--> $DIR/E0040.rs:16:7
|
||||
|
|
||||
LL | x.drop();
|
||||
| ^^^^
|
||||
| |
|
||||
| explicit destructor calls not allowed
|
||||
| help: consider using `drop` function: `drop(x)`
|
||||
| --^^^^--
|
||||
| | |
|
||||
| | explicit destructor calls not allowed
|
||||
| help: consider using `drop` function: `drop(x)`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
16
src/test/ui/explicit/explicit-call-to-dtor.fixed
Normal file
16
src/test/ui/explicit/explicit-call-to-dtor.fixed
Normal file
@ -0,0 +1,16 @@
|
||||
// run-rustfix
|
||||
struct Foo {
|
||||
x: isize
|
||||
}
|
||||
|
||||
impl Drop for Foo {
|
||||
fn drop(&mut self) {
|
||||
println!("kaboom");
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x = Foo { x: 3 };
|
||||
println!("{}", x.x);
|
||||
drop(x); //~ ERROR explicit use of destructor method
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
// run-rustfix
|
||||
struct Foo {
|
||||
x: isize
|
||||
}
|
||||
@ -10,5 +11,6 @@ fn drop(&mut self) {
|
||||
|
||||
fn main() {
|
||||
let x = Foo { x: 3 };
|
||||
println!("{}", x.x);
|
||||
x.drop(); //~ ERROR explicit use of destructor method
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
error[E0040]: explicit use of destructor method
|
||||
--> $DIR/explicit-call-to-dtor.rs:13:7
|
||||
--> $DIR/explicit-call-to-dtor.rs:15:7
|
||||
|
|
||||
LL | x.drop();
|
||||
| ^^^^
|
||||
| |
|
||||
| explicit destructor calls not allowed
|
||||
| help: consider using `drop` function: `drop(x)`
|
||||
| --^^^^--
|
||||
| | |
|
||||
| | explicit destructor calls not allowed
|
||||
| help: consider using `drop` function: `drop(x)`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
26
src/test/ui/explicit/explicit-call-to-supertrait-dtor.fixed
Normal file
26
src/test/ui/explicit/explicit-call-to-supertrait-dtor.fixed
Normal file
@ -0,0 +1,26 @@
|
||||
// run-rustfix
|
||||
struct Foo {
|
||||
x: isize
|
||||
}
|
||||
|
||||
#[allow(drop_bounds)]
|
||||
trait Bar: Drop {
|
||||
fn blah(&self);
|
||||
}
|
||||
|
||||
impl Drop for Foo {
|
||||
fn drop(&mut self) {
|
||||
println!("kaboom");
|
||||
}
|
||||
}
|
||||
|
||||
impl Bar for Foo {
|
||||
fn blah(&self) {
|
||||
drop(self); //~ ERROR explicit use of destructor method
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let x = Foo { x: 3 };
|
||||
println!("{}", x.x);
|
||||
}
|
@ -1,8 +1,10 @@
|
||||
// run-rustfix
|
||||
struct Foo {
|
||||
x: isize
|
||||
}
|
||||
|
||||
trait Bar : Drop {
|
||||
#[allow(drop_bounds)]
|
||||
trait Bar: Drop {
|
||||
fn blah(&self);
|
||||
}
|
||||
|
||||
@ -20,4 +22,5 @@ fn blah(&self) {
|
||||
|
||||
fn main() {
|
||||
let x = Foo { x: 3 };
|
||||
println!("{}", x.x);
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
error[E0040]: explicit use of destructor method
|
||||
--> $DIR/explicit-call-to-supertrait-dtor.rs:17:14
|
||||
--> $DIR/explicit-call-to-supertrait-dtor.rs:19:14
|
||||
|
|
||||
LL | self.drop();
|
||||
| ^^^^
|
||||
| |
|
||||
| explicit destructor calls not allowed
|
||||
| help: consider using `drop` function: `drop(self)`
|
||||
| -----^^^^--
|
||||
| | |
|
||||
| | explicit destructor calls not allowed
|
||||
| help: consider using `drop` function: `drop(self)`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
10
src/test/ui/illegal-ufcs-drop.fixed
Normal file
10
src/test/ui/illegal-ufcs-drop.fixed
Normal file
@ -0,0 +1,10 @@
|
||||
// run-rustfix
|
||||
struct Foo;
|
||||
|
||||
impl Drop for Foo {
|
||||
fn drop(&mut self) {}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
drop(&mut Foo) //~ ERROR explicit use of destructor method
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
// run-rustfix
|
||||
struct Foo;
|
||||
|
||||
impl Drop for Foo {
|
||||
|
@ -1,5 +1,5 @@
|
||||
error[E0040]: explicit use of destructor method
|
||||
--> $DIR/illegal-ufcs-drop.rs:8:5
|
||||
--> $DIR/illegal-ufcs-drop.rs:9:5
|
||||
|
|
||||
LL | Drop::drop(&mut Foo)
|
||||
| ^^^^^^^^^^
|
||||
|
Loading…
Reference in New Issue
Block a user