Skip to content

Commit

Permalink
Fix structured suggestion for explicit drop call
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Jan 18, 2021
1 parent 2e46cb3 commit 70a43e0
Show file tree
Hide file tree
Showing 15 changed files with 107 additions and 27 deletions.
18 changes: 9 additions & 9 deletions compiler/rustc_typeck/src/check/callee.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1163,7 +1163,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
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 {
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_typeck/src/check/method/confirm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
self.tcx,
self.span,
Some(self.self_expr.span),
self.call_expr.span,
trait_def_id,
),
ty::ImplContainer(..) => {}
Expand Down
18 changes: 18 additions & 0 deletions src/test/ui/error-codes/E0040.fixed
Original file line number Diff line number Diff line change
@@ -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
}
3 changes: 3 additions & 0 deletions src/test/ui/error-codes/E0040.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// run-rustfix
struct Foo {
x: i32,
}
Expand All @@ -10,6 +11,8 @@ impl Drop for Foo {

fn main() {
let mut x = Foo { x: -7 };
x.x = 0;
println!("{}", x.x);
x.drop();
//~^ ERROR E0040
}
10 changes: 5 additions & 5 deletions src/test/ui/error-codes/E0040.stderr
Original file line number Diff line number Diff line change
@@ -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

Expand Down
16 changes: 16 additions & 0 deletions src/test/ui/explicit/explicit-call-to-dtor.fixed
Original file line number Diff line number Diff line change
@@ -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
}
2 changes: 2 additions & 0 deletions src/test/ui/explicit/explicit-call-to-dtor.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// run-rustfix
struct Foo {
x: isize
}
Expand All @@ -10,5 +11,6 @@ impl Drop for Foo {

fn main() {
let x = Foo { x: 3 };
println!("{}", x.x);
x.drop(); //~ ERROR explicit use of destructor method
}
10 changes: 5 additions & 5 deletions src/test/ui/explicit/explicit-call-to-dtor.stderr
Original file line number Diff line number Diff line change
@@ -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

Expand Down
26 changes: 26 additions & 0 deletions src/test/ui/explicit/explicit-call-to-supertrait-dtor.fixed
Original file line number Diff line number Diff line change
@@ -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);
}
5 changes: 4 additions & 1 deletion src/test/ui/explicit/explicit-call-to-supertrait-dtor.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
// run-rustfix
struct Foo {
x: isize
}

trait Bar : Drop {
#[allow(drop_bounds)]
trait Bar: Drop {
fn blah(&self);
}

Expand All @@ -20,4 +22,5 @@ impl Bar for Foo {

fn main() {
let x = Foo { x: 3 };
println!("{}", x.x);
}
10 changes: 5 additions & 5 deletions src/test/ui/explicit/explicit-call-to-supertrait-dtor.stderr
Original file line number Diff line number Diff line change
@@ -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

Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/illegal-ufcs-drop.fixed
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions src/test/ui/illegal-ufcs-drop.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// run-rustfix
struct Foo;

impl Drop for Foo {
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/illegal-ufcs-drop.stderr
Original file line number Diff line number Diff line change
@@ -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)
| ^^^^^^^^^^
Expand Down

0 comments on commit 70a43e0

Please sign in to comment.