Rollup merge of #72383 - DarkEld3r:issue-72322, r=matthewjasper
Suggest using std::mem::drop function instead of explicit destructor call I would prefer to give a better suggestion that includes code example, but I'm currently stuck on getting the correct span for that. Closes #72322.
This commit is contained in:
commit
9c1f2035a9
@ -21,11 +21,31 @@ use rustc_target::spec::abi;
|
|||||||
/// Checks that it is legal to call methods of the trait corresponding
|
/// Checks that it is legal to call methods of the trait corresponding
|
||||||
/// to `trait_id` (this only cares about the trait, not the specific
|
/// to `trait_id` (this only cares about the trait, not the specific
|
||||||
/// method that is called).
|
/// method that is called).
|
||||||
pub fn check_legal_trait_for_method_call(tcx: TyCtxt<'_>, span: Span, trait_id: DefId) {
|
pub fn check_legal_trait_for_method_call(
|
||||||
|
tcx: TyCtxt<'_>,
|
||||||
|
span: Span,
|
||||||
|
receiver: Option<Span>,
|
||||||
|
trait_id: DefId,
|
||||||
|
) {
|
||||||
if tcx.lang_items().drop_trait() == Some(trait_id) {
|
if tcx.lang_items().drop_trait() == Some(trait_id) {
|
||||||
struct_span_err!(tcx.sess, span, E0040, "explicit use of destructor method")
|
let mut err = struct_span_err!(tcx.sess, span, E0040, "explicit use of destructor method");
|
||||||
.span_label(span, "explicit destructor calls not allowed")
|
err.span_label(span, "explicit destructor calls not allowed");
|
||||||
.emit();
|
|
||||||
|
let snippet = 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) };
|
||||||
|
|
||||||
|
err.span_suggestion(
|
||||||
|
span,
|
||||||
|
&format!("consider using `drop` function: `{}`", suggestion),
|
||||||
|
String::new(),
|
||||||
|
Applicability::Unspecified,
|
||||||
|
);
|
||||||
|
|
||||||
|
err.emit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,9 +597,12 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
|||||||
fn enforce_illegal_method_limitations(&self, pick: &probe::Pick<'_>) {
|
fn enforce_illegal_method_limitations(&self, pick: &probe::Pick<'_>) {
|
||||||
// Disallow calls to the method `drop` defined in the `Drop` trait.
|
// Disallow calls to the method `drop` defined in the `Drop` trait.
|
||||||
match pick.item.container {
|
match pick.item.container {
|
||||||
ty::TraitContainer(trait_def_id) => {
|
ty::TraitContainer(trait_def_id) => callee::check_legal_trait_for_method_call(
|
||||||
callee::check_legal_trait_for_method_call(self.tcx, self.span, trait_def_id)
|
self.tcx,
|
||||||
}
|
self.span,
|
||||||
|
Some(self.self_expr.span),
|
||||||
|
trait_def_id,
|
||||||
|
),
|
||||||
ty::ImplContainer(..) => {}
|
ty::ImplContainer(..) => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5433,7 +5433,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
|
debug!("instantiate_value_path: def_id={:?} container={:?}", def_id, container);
|
||||||
match container {
|
match container {
|
||||||
ty::TraitContainer(trait_did) => {
|
ty::TraitContainer(trait_did) => {
|
||||||
callee::check_legal_trait_for_method_call(tcx, span, trait_did)
|
callee::check_legal_trait_for_method_call(tcx, span, None, trait_did)
|
||||||
}
|
}
|
||||||
ty::ImplContainer(impl_def_id) => {
|
ty::ImplContainer(impl_def_id) => {
|
||||||
if segments.len() == 1 {
|
if segments.len() == 1 {
|
||||||
|
@ -2,7 +2,10 @@ error[E0040]: explicit use of destructor method
|
|||||||
--> $DIR/E0040.rs:13:7
|
--> $DIR/E0040.rs:13:7
|
||||||
|
|
|
|
||||||
LL | x.drop();
|
LL | x.drop();
|
||||||
| ^^^^ explicit destructor calls not allowed
|
| ^^^^
|
||||||
|
| |
|
||||||
|
| explicit destructor calls not allowed
|
||||||
|
| help: consider using `drop` function: `drop(x)`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -2,7 +2,10 @@ error[E0040]: explicit use of destructor method
|
|||||||
--> $DIR/explicit-call-to-dtor.rs:13:7
|
--> $DIR/explicit-call-to-dtor.rs:13:7
|
||||||
|
|
|
|
||||||
LL | x.drop();
|
LL | x.drop();
|
||||||
| ^^^^ explicit destructor calls not allowed
|
| ^^^^
|
||||||
|
| |
|
||||||
|
| explicit destructor calls not allowed
|
||||||
|
| help: consider using `drop` function: `drop(x)`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -2,7 +2,10 @@ error[E0040]: explicit use of destructor method
|
|||||||
--> $DIR/explicit-call-to-supertrait-dtor.rs:17:14
|
--> $DIR/explicit-call-to-supertrait-dtor.rs:17:14
|
||||||
|
|
|
|
||||||
LL | self.drop();
|
LL | self.drop();
|
||||||
| ^^^^ explicit destructor calls not allowed
|
| ^^^^
|
||||||
|
| |
|
||||||
|
| explicit destructor calls not allowed
|
||||||
|
| help: consider using `drop` function: `drop(self)`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -2,7 +2,10 @@ error[E0040]: explicit use of destructor method
|
|||||||
--> $DIR/illegal-ufcs-drop.rs:8:5
|
--> $DIR/illegal-ufcs-drop.rs:8:5
|
||||||
|
|
|
|
||||||
LL | Drop::drop(&mut Foo)
|
LL | Drop::drop(&mut Foo)
|
||||||
| ^^^^^^^^^^ explicit destructor calls not allowed
|
| ^^^^^^^^^^
|
||||||
|
| |
|
||||||
|
| explicit destructor calls not allowed
|
||||||
|
| help: consider using `drop` function: `drop`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user