Migrate 'explicit destructor call' diagnostic
This commit is contained in:
parent
ca2b74f1ae
commit
6e2adbf6a3
6 changed files with 56 additions and 30 deletions
|
@ -33,6 +33,10 @@ hir_typeck_expected_default_return_type = expected `()` because of default retur
|
||||||
|
|
||||||
hir_typeck_expected_return_type = expected `{$expected}` because of return type
|
hir_typeck_expected_return_type = expected `{$expected}` because of return type
|
||||||
|
|
||||||
|
hir_typeck_explicit_destructor = explicit use of destructor method
|
||||||
|
.label = explicit destructor calls not allowed
|
||||||
|
.suggestion = consider using `drop` function
|
||||||
|
|
||||||
hir_typeck_field_multiply_specified_in_initializer =
|
hir_typeck_field_multiply_specified_in_initializer =
|
||||||
field `{$ident}` specified more than once
|
field `{$ident}` specified more than once
|
||||||
.label = used more than once
|
.label = used more than once
|
||||||
|
|
|
@ -2,9 +2,10 @@ use super::method::probe::ProbeScope;
|
||||||
use super::method::MethodCallee;
|
use super::method::MethodCallee;
|
||||||
use super::{Expectation, FnCtxt, TupleArgumentsFlag};
|
use super::{Expectation, FnCtxt, TupleArgumentsFlag};
|
||||||
|
|
||||||
|
use crate::errors;
|
||||||
use crate::type_error_struct;
|
use crate::type_error_struct;
|
||||||
use rustc_ast::util::parser::PREC_POSTFIX;
|
use rustc_ast::util::parser::PREC_POSTFIX;
|
||||||
use rustc_errors::{struct_span_err, Applicability, Diagnostic, ErrorGuaranteed, StashKey};
|
use rustc_errors::{Applicability, Diagnostic, ErrorGuaranteed, StashKey};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{self, CtorKind, DefKind, Namespace, Res};
|
use rustc_hir::def::{self, CtorKind, DefKind, Namespace, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
@ -44,23 +45,15 @@ pub fn check_legal_trait_for_method_call(
|
||||||
trait_id: DefId,
|
trait_id: DefId,
|
||||||
) {
|
) {
|
||||||
if tcx.lang_items().drop_trait() == Some(trait_id) {
|
if tcx.lang_items().drop_trait() == Some(trait_id) {
|
||||||
let mut err = struct_span_err!(tcx.sess, span, E0040, "explicit use of destructor method");
|
let sugg = if let Some(receiver) = receiver.filter(|s| !s.is_empty()) {
|
||||||
err.span_label(span, "explicit destructor calls not allowed");
|
errors::ExplicitDestructorCallSugg::Snippet {
|
||||||
|
lo: expr_span.shrink_to_lo(),
|
||||||
let (sp, suggestion) = receiver
|
hi: receiver.shrink_to_hi().to(expr_span.shrink_to_hi()),
|
||||||
.and_then(|s| tcx.sess.source_map().span_to_snippet(s).ok())
|
}
|
||||||
.filter(|snippet| !snippet.is_empty())
|
} else {
|
||||||
.map(|snippet| (expr_span, format!("drop({snippet})")))
|
errors::ExplicitDestructorCallSugg::Empty(span)
|
||||||
.unwrap_or_else(|| (span, "drop".to_string()));
|
};
|
||||||
|
tcx.sess.emit_err(errors::ExplicitDestructorCall { span, sugg });
|
||||||
err.span_suggestion(
|
|
||||||
sp,
|
|
||||||
"consider using `drop` function",
|
|
||||||
suggestion,
|
|
||||||
Applicability::MaybeIncorrect,
|
|
||||||
);
|
|
||||||
|
|
||||||
err.emit();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,6 +129,29 @@ pub enum ExpectedReturnTypeLabel<'tcx> {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(hir_typeck_explicit_destructor, code = "E0040")]
|
||||||
|
pub struct ExplicitDestructorCall {
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
#[subdiagnostic]
|
||||||
|
pub sugg: ExplicitDestructorCallSugg,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Subdiagnostic)]
|
||||||
|
pub enum ExplicitDestructorCallSugg {
|
||||||
|
#[suggestion(hir_typeck_suggestion, code = "drop", applicability = "maybe-incorrect")]
|
||||||
|
Empty(#[primary_span] Span),
|
||||||
|
#[multipart_suggestion(hir_typeck_suggestion, style = "short")]
|
||||||
|
Snippet {
|
||||||
|
#[suggestion_part(code = "drop(")]
|
||||||
|
lo: Span,
|
||||||
|
#[suggestion_part(code = ")")]
|
||||||
|
hi: Span,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(hir_typeck_missing_parentheses_in_range, code = "E0689")]
|
#[diag(hir_typeck_missing_parentheses_in_range, code = "E0689")]
|
||||||
pub struct MissingParenthesesInRange {
|
pub struct MissingParenthesesInRange {
|
||||||
|
|
|
@ -2,10 +2,12 @@ error[E0040]: explicit use of destructor method
|
||||||
--> $DIR/E0040.rs:16:7
|
--> $DIR/E0040.rs:16:7
|
||||||
|
|
|
|
||||||
LL | x.drop();
|
LL | x.drop();
|
||||||
| --^^^^--
|
| ^^^^ explicit destructor calls not allowed
|
||||||
| | |
|
|
|
||||||
| | explicit destructor calls not allowed
|
help: consider using `drop` function
|
||||||
| help: consider using `drop` function: `drop(x)`
|
|
|
||||||
|
LL | drop(x);
|
||||||
|
| +++++ ~
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,12 @@ error[E0040]: explicit use of destructor method
|
||||||
--> $DIR/explicit-call-to-dtor.rs:15:7
|
--> $DIR/explicit-call-to-dtor.rs:15:7
|
||||||
|
|
|
|
||||||
LL | x.drop();
|
LL | x.drop();
|
||||||
| --^^^^--
|
| ^^^^ explicit destructor calls not allowed
|
||||||
| | |
|
|
|
||||||
| | explicit destructor calls not allowed
|
help: consider using `drop` function
|
||||||
| help: consider using `drop` function: `drop(x)`
|
|
|
||||||
|
LL | drop(x);
|
||||||
|
| +++++ ~
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,12 @@ error[E0040]: explicit use of destructor method
|
||||||
--> $DIR/explicit-call-to-supertrait-dtor.rs:22:14
|
--> $DIR/explicit-call-to-supertrait-dtor.rs:22:14
|
||||||
|
|
|
|
||||||
LL | self.drop();
|
LL | self.drop();
|
||||||
| -----^^^^--
|
| ^^^^ explicit destructor calls not allowed
|
||||||
| | |
|
|
|
||||||
| | explicit destructor calls not allowed
|
help: consider using `drop` function
|
||||||
| help: consider using `drop` function: `drop(self)`
|
|
|
||||||
|
LL | drop(self);
|
||||||
|
| +++++ ~
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue