1 use clippy_utils
::diagnostics
::span_lint_and_help
;
2 use clippy_utils
::is_from_proc_macro
;
3 use rustc_hir
::{Expr, ExprKind}
;
4 use rustc_lint
::{LateContext, LateLintPass, LintContext}
;
5 use rustc_middle
::lint
::in_external_macro
;
6 use rustc_session
::{declare_lint_pass, declare_tool_lint}
;
10 /// Checks for usage of `as` conversions.
12 /// Note that this lint is specialized in linting *every single* use of `as`
13 /// regardless of whether good alternatives exist or not.
14 /// If you want more precise lints for `as`, please consider using these separate lints:
15 /// `unnecessary_cast`, `cast_lossless/cast_possible_truncation/cast_possible_wrap/cast_precision_loss/cast_sign_loss`,
16 /// `fn_to_numeric_cast(_with_truncation)`, `char_lit_as_u8`, `ref_to_mut` and `ptr_as_ptr`.
17 /// There is a good explanation the reason why this lint should work in this way and how it is useful
18 /// [in this issue](https://github.com/rust-lang/rust-clippy/issues/5122).
20 /// ### Why is this bad?
21 /// `as` conversions will perform many kinds of
22 /// conversions, including silently lossy conversions and dangerous coercions.
23 /// There are cases when it makes sense to use `as`, so the lint is
39 /// f(a.try_into().expect("Unexpected u16 overflow in f"));
41 #[clippy::version = "1.41.0"]
44 "using a potentially dangerous silent `as` conversion"
47 declare_lint_pass
!(AsConversions
=> [AS_CONVERSIONS
]);
49 impl<'tcx
> LateLintPass
<'tcx
> for AsConversions
{
50 fn check_expr(&mut self, cx
: &LateContext
<'tcx
>, expr
: &Expr
<'tcx
>) {
51 if in_external_macro(cx
.sess(), expr
.span
) || is_from_proc_macro(cx
, expr
) {
55 if let ExprKind
::Cast(_
, _
) = expr
.kind
{
60 "using a potentially dangerous silent `as` conversion",
62 "consider using a safe wrapper for this conversion",