Skip to content

Commit 56124b8

Browse files
committed
add comment and .clone() test case
1 parent d5d2189 commit 56124b8

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

clippy_lints/src/loops/char_indices_as_byte_indices.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ fn check_index_usage<'tcx>(
8484
let is_string_like = |ty: Ty<'_>| ty.is_str() || is_type_lang_item(cx, ty, LangItem::String);
8585
let message = match parent_expr.kind {
8686
ExprKind::MethodCall(segment, recv, ..)
87+
// We currently only lint `str` methods (which `String` can deref to), so a `.is_str()` check is sufficient here
88+
// (contrary to the `ExprKind::Index` case which needs to handle both with `is_string_like` because `String` implements
89+
// `Index` directly and no deref to `str` would happen in that case).
8790
if cx.typeck_results().expr_ty_adjusted(recv).peel_refs().is_str()
8891
&& BYTE_INDEX_METHODS.contains(&segment.ident.name.as_str())
8992
&& eq_expr_value(cx, chars_recv, recv) =>
@@ -126,7 +129,7 @@ fn check_index_usage<'tcx>(
126129
/// but for `.get(..idx)` we want to consider the method call the consuming expression,
127130
/// which requires skipping past the range expression.
128131
fn index_consumed_at<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> Option<&'tcx Expr<'tcx>> {
129-
for (_, node) in cx.tcx.hir().parent_iter(expr.hir_id) {
132+
for (_, node) in cx.tcx.hir_parent_iter(expr.hir_id) {
130133
match node {
131134
Node::Expr(expr) if higher::Range::hir(expr).is_some() => {},
132135
Node::ExprField(_) => {},

tests/ui/char_indices_as_byte_indices.rs

+6
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ fn good(prim: &str, prim2: &str) {
5454
// str method taking a usize that doesn't represent a byte index
5555
prim.splitn(idx, prim2);
5656
}
57+
58+
let mut string = "äa".to_owned();
59+
for (idx, _) in string.clone().chars().enumerate() {
60+
// Even though the receiver is the same expression, it should not be treated as the same value.
61+
string.clone().remove(idx);
62+
}
5763
}
5864

5965
fn main() {}

0 commit comments

Comments
 (0)