1
Fork 0

do not use stringly typed diagnostics

This commit is contained in:
Deadbeef 2023-06-11 08:18:56 +00:00
parent 1e36f7e9ae
commit 1caed51673
3 changed files with 31 additions and 26 deletions

View file

@ -478,13 +478,11 @@ lint_requested_level = requested on the command line with `{$level} {$lint_name}
lint_supertrait_as_deref_target = `{$t}` implements `Deref` with supertrait `{$target_principal}` as target lint_supertrait_as_deref_target = `{$t}` implements `Deref` with supertrait `{$target_principal}` as target
.label = target type is set here .label = target type is set here
lint_suspicious_double_ref_op = lint_suspicious_double_ref_clone =
using `.{$call}()` on a double reference, which returns `{$ty}` instead of {$op -> using `.clone()` on a double reference, which returns `{$ty}` instead of cloning the inner type
*[should_not_happen] [{$op}]
[deref] dereferencing lint_suspicious_double_ref_deref =
[borrow] borrowing using `.deref()` on a double reference, which returns `{$ty}` instead of dereferencing the inner type
[clone] cloning
} the inner type
lint_trivial_untranslatable_diag = diagnostic with static strings only lint_trivial_untranslatable_diag = diagnostic with static strings only

View file

@ -1231,11 +1231,15 @@ pub struct NoopMethodCallDiag<'a> {
} }
#[derive(LintDiagnostic)] #[derive(LintDiagnostic)]
#[diag(lint_suspicious_double_ref_op)] #[diag(lint_suspicious_double_ref_deref)]
pub struct SuspiciousDoubleRefDiag<'a> { pub struct SuspiciousDoubleRefDerefDiag<'a> {
pub call: Symbol, pub ty: Ty<'a>,
}
#[derive(LintDiagnostic)]
#[diag(lint_suspicious_double_ref_clone)]
pub struct SuspiciousDoubleRefCloneDiag<'a> {
pub ty: Ty<'a>, pub ty: Ty<'a>,
pub op: &'static str,
} }
// pass_by_value.rs // pass_by_value.rs

View file

@ -1,5 +1,7 @@
use crate::context::LintContext; use crate::context::LintContext;
use crate::lints::{NoopMethodCallDiag, SuspiciousDoubleRefDiag}; use crate::lints::{
NoopMethodCallDiag, SuspiciousDoubleRefCloneDiag, SuspiciousDoubleRefDerefDiag,
};
use crate::LateContext; use crate::LateContext;
use crate::LateLintPass; use crate::LateLintPass;
use rustc_hir::def::DefKind; use rustc_hir::def::DefKind;
@ -102,13 +104,6 @@ impl<'tcx> LateLintPass<'tcx> for NoopMethodCall {
// (Re)check that it implements the noop diagnostic. // (Re)check that it implements the noop diagnostic.
let Some(name) = cx.tcx.get_diagnostic_name(i.def_id()) else { return }; let Some(name) = cx.tcx.get_diagnostic_name(i.def_id()) else { return };
let op = match name {
sym::noop_method_borrow => "borrow",
sym::noop_method_clone => "clone",
sym::noop_method_deref => "deref",
_ => return,
};
let receiver_ty = cx.typeck_results().expr_ty(receiver); let receiver_ty = cx.typeck_results().expr_ty(receiver);
let expr_ty = cx.typeck_results().expr_ty_adjusted(expr); let expr_ty = cx.typeck_results().expr_ty_adjusted(expr);
let arg_adjustments = cx.typeck_results().expr_adjustments(receiver); let arg_adjustments = cx.typeck_results().expr_adjustments(receiver);
@ -129,14 +124,22 @@ impl<'tcx> LateLintPass<'tcx> for NoopMethodCall {
NoopMethodCallDiag { method: call.ident.name, receiver_ty, label: span }, NoopMethodCallDiag { method: call.ident.name, receiver_ty, label: span },
); );
} else { } else {
if op == "borrow" { match name {
return; // If `type_of(x) == T` and `x.borrow()` is used to get `&T`,
} // then that should be allowed
cx.emit_spanned_lint( sym::noop_method_borrow => return,
sym::noop_method_clone => cx.emit_spanned_lint(
SUSPICIOUS_DOUBLE_REF_OP, SUSPICIOUS_DOUBLE_REF_OP,
span, span,
SuspiciousDoubleRefDiag { call: call.ident.name, ty: expr_ty, op }, SuspiciousDoubleRefCloneDiag { ty: expr_ty },
) ),
sym::noop_method_deref => cx.emit_spanned_lint(
SUSPICIOUS_DOUBLE_REF_OP,
span,
SuspiciousDoubleRefDerefDiag { ty: expr_ty },
),
_ => return,
}
} }
} }
} }