Fix sliced_string_as_bytes FP with a RangeFull

This commit is contained in:
Yotam Ofek 2025-10-12 20:46:14 +03:00
parent 540e2f4a2a
commit 386451c16a
3 changed files with 20 additions and 2 deletions

View file

@ -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))
{

View file

@ -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();
}

View file

@ -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();
}