Skip to content

Commit ee9b47d

Browse files
committed
Move is_hir_ty_cfg_dependant to util,
add stuff on pointer::cast` to the document for `cast_ptr_alignment` and fix line numbers in the test.
1 parent f50ded0 commit ee9b47d

File tree

3 files changed

+22
-20
lines changed

3 files changed

+22
-20
lines changed

clippy_lints/src/types.rs

+8-18
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use if_chain::if_chain;
88
use rustc_ast::{FloatTy, IntTy, LitFloatType, LitIntType, LitKind, UintTy};
99
use rustc_errors::{Applicability, DiagnosticBuilder};
1010
use rustc_hir as hir;
11-
use rustc_hir::def::Res;
1211
use rustc_hir::intravisit::{walk_body, walk_expr, walk_ty, FnKind, NestedVisitorMap, Visitor};
1312
use rustc_hir::{
1413
BinOpKind, Block, Body, Expr, ExprKind, FnDecl, FnRetTy, FnSig, GenericArg, GenericBounds, GenericParamKind, HirId,
@@ -33,9 +32,9 @@ use crate::consts::{constant, Constant};
3332
use crate::utils::paths;
3433
use crate::utils::sugg::Sugg;
3534
use crate::utils::{
36-
clip, comparisons, differing_macro_contexts, higher, in_constant, indent_of, int_bits, is_type_diagnostic_item,
37-
last_path_segment, match_def_path, match_path, meets_msrv, method_chain_args, multispan_sugg,
38-
numeric_literal::NumericLiteral, qpath_res, reindent_multiline, sext, snippet, snippet_opt,
35+
clip, comparisons, differing_macro_contexts, higher, in_constant, indent_of, int_bits, is_hir_ty_cfg_dependant,
36+
is_type_diagnostic_item, last_path_segment, match_def_path, match_path, meets_msrv, method_chain_args,
37+
multispan_sugg, numeric_literal::NumericLiteral, qpath_res, reindent_multiline, sext, snippet, snippet_opt,
3938
snippet_with_applicability, snippet_with_macro_callsite, span_lint, span_lint_and_help, span_lint_and_sugg,
4039
span_lint_and_then, unsext,
4140
};
@@ -1282,8 +1281,8 @@ declare_clippy_lint! {
12821281
}
12831282

12841283
declare_clippy_lint! {
1285-
/// **What it does:** Checks for casts from a less-strictly-aligned pointer to a
1286-
/// more-strictly-aligned pointer
1284+
/// **What it does:** Checks for casts, using `as` or `pointer::cast`,
1285+
/// from a less-strictly-aligned pointer to a more-strictly-aligned pointer
12871286
///
12881287
/// **Why is this bad?** Dereferencing the resulting pointer may be undefined
12891288
/// behavior.
@@ -1296,6 +1295,9 @@ declare_clippy_lint! {
12961295
/// ```rust
12971296
/// let _ = (&1u8 as *const u8) as *const u16;
12981297
/// let _ = (&mut 1u8 as *mut u8) as *mut u16;
1298+
///
1299+
/// (&1u8 as *const u8).cast::<u16>();
1300+
/// (&mut 1u8 as *mut u8).cast::<u16>();
12991301
/// ```
13001302
pub CAST_PTR_ALIGNMENT,
13011303
pedantic,
@@ -1725,18 +1727,6 @@ fn get_numeric_literal<'e>(expr: &'e Expr<'e>) -> Option<&'e Lit> {
17251727
}
17261728
}
17271729

1728-
fn is_hir_ty_cfg_dependant(cx: &LateContext<'_>, ty: &hir::Ty<'_>) -> bool {
1729-
if_chain! {
1730-
if let TyKind::Path(QPath::Resolved(_, path)) = ty.kind;
1731-
if let Res::Def(_, def_id) = path.res;
1732-
then {
1733-
cx.tcx.has_attr(def_id, sym::cfg) || cx.tcx.has_attr(def_id, sym::cfg_attr)
1734-
} else {
1735-
false
1736-
}
1737-
}
1738-
}
1739-
17401730
fn show_unnecessary_cast(cx: &LateContext<'_>, expr: &Expr<'_>, literal_str: &str, cast_from: Ty<'_>, cast_to: Ty<'_>) {
17411731
let literal_kind_name = if cast_from.is_integral() { "integer" } else { "float" };
17421732
span_lint_and_sugg(

clippy_lints/src/utils/mod.rs

+12
Original file line numberDiff line numberDiff line change
@@ -1686,6 +1686,18 @@ macro_rules! unwrap_cargo_metadata {
16861686
}};
16871687
}
16881688

1689+
pub fn is_hir_ty_cfg_dependant(cx: &LateContext<'_>, ty: &hir::Ty<'_>) -> bool {
1690+
if_chain! {
1691+
if let TyKind::Path(QPath::Resolved(_, path)) = ty.kind;
1692+
if let Res::Def(_, def_id) = path.res;
1693+
then {
1694+
cx.tcx.has_attr(def_id, sym::cfg) || cx.tcx.has_attr(def_id, sym::cfg_attr)
1695+
} else {
1696+
false
1697+
}
1698+
}
1699+
}
1700+
16891701
#[cfg(test)]
16901702
mod test {
16911703
use super::{reindent_multiline, without_block_comments};

tests/ui/cast_alignment.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@ LL | (&mut 1u8 as *mut u8) as *mut u16;
1313
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1414

1515
error: casting from `*const u8` to a more-strictly-aligned pointer (`*const u16`) (1 < 2 bytes)
16-
--> $DIR/cast_alignment.rs:15:5
16+
--> $DIR/cast_alignment.rs:16:5
1717
|
1818
LL | (&1u8 as *const u8).cast::<u16>();
1919
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2020

2121
error: casting from `*mut u8` to a more-strictly-aligned pointer (`*mut u16`) (1 < 2 bytes)
22-
--> $DIR/cast_alignment.rs:16:5
22+
--> $DIR/cast_alignment.rs:17:5
2323
|
2424
LL | (&mut 1u8 as *mut u8).cast::<u16>();
2525
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0 commit comments

Comments
 (0)