Fix sliced_string_as_bytes FP with a RangeFull
This commit is contained in:
parent
540e2f4a2a
commit
386451c16a
3 changed files with 20 additions and 2 deletions
|
|
@ -1,15 +1,21 @@
|
|||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||
use clippy_utils::higher;
|
||||
use clippy_utils::res::MaybeDef;
|
||||
use clippy_utils::source::snippet_with_applicability;
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_hir::{Expr, ExprKind, LangItem, is_range_literal};
|
||||
use rustc_hir::{Expr, ExprKind, LangItem};
|
||||
use rustc_lint::LateContext;
|
||||
|
||||
use super::SLICED_STRING_AS_BYTES;
|
||||
|
||||
/// Checks if `index` is any type of range except `RangeFull` (i.e. `..`)
|
||||
fn is_bounded_range_literal(cx: &LateContext<'_>, index: &Expr<'_>) -> bool {
|
||||
higher::Range::hir(cx, index).is_some_and(|range| Option::or(range.start, range.end).is_some())
|
||||
}
|
||||
|
||||
pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, recv: &Expr<'_>) {
|
||||
if let ExprKind::Index(indexed, index, _) = recv.kind
|
||||
&& is_range_literal(index)
|
||||
&& is_bounded_range_literal(cx, index)
|
||||
&& let ty = cx.typeck_results().expr_ty(indexed).peel_refs()
|
||||
&& (ty.is_str() || ty.is_lang_item(cx, LangItem::String))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -32,6 +32,12 @@ fn main() {
|
|||
let bytes = &"consectetur adipiscing".as_bytes()[..=5];
|
||||
//~^ sliced_string_as_bytes
|
||||
|
||||
// this lint is a perf lint meant to catch utf-8 alignment checks.
|
||||
// while the slicing here *is* redundant, it's more like a needless borrow, and shouldn't affect
|
||||
// perf
|
||||
let bytes = s[..].as_bytes();
|
||||
let bytes = string[..].as_bytes();
|
||||
|
||||
let f = Foo;
|
||||
let bytes = f[0..4].as_bytes();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,12 @@ fn main() {
|
|||
let bytes = "consectetur adipiscing"[..=5].as_bytes();
|
||||
//~^ sliced_string_as_bytes
|
||||
|
||||
// this lint is a perf lint meant to catch utf-8 alignment checks.
|
||||
// while the slicing here *is* redundant, it's more like a needless borrow, and shouldn't affect
|
||||
// perf
|
||||
let bytes = s[..].as_bytes();
|
||||
let bytes = string[..].as_bytes();
|
||||
|
||||
let f = Foo;
|
||||
let bytes = f[0..4].as_bytes();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue