mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 09:14:20 +00:00
9e153ccd45
Detect calls to .clone() on T: !Clone types on borrowck errors When encountering a lifetime error on a type that *holds* a type that doesn't implement `Clone`, explore the item's body for potential calls to `.clone()` that are only cloning the reference `&T` instead of `T` because `T: !Clone`. If we find this, suggest `T: Clone`. ``` error[E0502]: cannot borrow `*list` as mutable because it is also borrowed as immutable --> $DIR/clone-on-ref.rs:7:5 | LL | for v in list.iter() { | ---- immutable borrow occurs here LL | cloned_items.push(v.clone()) | ------- this call doesn't do anything, the result is still `&T` because `T` doesn't implement `Clone` LL | } LL | list.push(T::default()); | ^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here LL | LL | drop(cloned_items); | ------------ immutable borrow later used here | help: consider further restricting this bound | LL | fn foo<T: Default + Clone>(list: &mut Vec<T>) { | +++++++ ``` ``` error[E0505]: cannot move out of `x` because it is borrowed --> $DIR/clone-on-ref.rs:23:10 | LL | fn qux(x: A) { | - binding `x` declared here LL | let a = &x; | -- borrow of `x` occurs here LL | let b = a.clone(); | ------- this call doesn't do anything, the result is still `&A` because `A` doesn't implement `Clone` LL | drop(x); | ^ move out of `x` occurs here LL | LL | println!("{b:?}"); | ----- borrow later used here | help: consider annotating `A` with `#[derive(Clone)]` | LL + #[derive(Clone)] LL | struct A; | ``` Fix #48677. |
||
---|---|---|
.. | ||
auxiliary | ||
bindings-after-at | ||
move-ref-patterns | ||
usefulness | ||
byte-string-inference.rs | ||
complexity_limit.rs | ||
complexity_limit.stderr | ||
for-loop-bad-item.rs | ||
for-loop-bad-item.stderr | ||
ignore-all-the-things.rs | ||
incorrect-placement-of-pattern-modifiers.fixed | ||
incorrect-placement-of-pattern-modifiers.rs | ||
incorrect-placement-of-pattern-modifiers.stderr | ||
integer-range-binding.rs | ||
issue-6449.rs | ||
issue-8351-1.rs | ||
issue-8351-2.rs | ||
issue-10392.rs | ||
issue-11577.rs | ||
issue-12582.rs | ||
issue-14221.rs | ||
issue-14221.stderr | ||
issue-15080.rs | ||
issue-17718-patterns.rs | ||
issue-17718-patterns.stderr | ||
issue-22546.rs | ||
issue-22546.stderr | ||
issue-27320.rs | ||
issue-28992-empty.rs | ||
issue-28992-empty.stderr | ||
issue-52240.rs | ||
issue-52240.stderr | ||
issue-66270-pat-struct-parser-recovery.rs | ||
issue-66270-pat-struct-parser-recovery.stderr | ||
issue-67037-pat-tup-scrut-ty-diff-less-fields.rs | ||
issue-67037-pat-tup-scrut-ty-diff-less-fields.stderr | ||
issue-67776-match-same-name-enum-variant-refs.rs | ||
issue-67776-match-same-name-enum-variant-refs.stderr | ||
issue-68393-let-pat-assoc-constant.rs | ||
issue-68393-let-pat-assoc-constant.stderr | ||
issue-72565.rs | ||
issue-72565.stderr | ||
issue-72574-1.rs | ||
issue-72574-1.stderr | ||
issue-72574-2.rs | ||
issue-72574-2.stderr | ||
issue-74539.rs | ||
issue-74539.stderr | ||
issue-74702.rs | ||
issue-74702.stderr | ||
issue-74954.rs | ||
issue-80186-mut-binding-help-suggestion.rs | ||
issue-80186-mut-binding-help-suggestion.stderr | ||
issue-88074-pat-range-type-inference-err.rs | ||
issue-88074-pat-range-type-inference-err.stderr | ||
issue-88074-pat-range-type-inference.rs | ||
issue-92074-macro-ice.rs | ||
issue-92074-macro-ice.stderr | ||
issue-94866.rs | ||
issue-94866.stderr | ||
issue-95878.rs | ||
issue-95878.stderr | ||
issue-106552.rs | ||
issue-106552.stderr | ||
issue-106862.fixed | ||
issue-106862.rs | ||
issue-106862.stderr | ||
issue-110508.rs | ||
issue-114896.rs | ||
issue-114896.stderr | ||
issue-115599.rs | ||
issue-115599.stderr | ||
issue-117626.rs | ||
non-constant-in-const-path.rs | ||
non-constant-in-const-path.stderr | ||
non-structural-match-types.rs | ||
non-structural-match-types.stderr | ||
pat-shadow-in-nested-binding.rs | ||
pat-shadow-in-nested-binding.stderr | ||
pat-struct-field-expr-has-type.rs | ||
pat-struct-field-expr-has-type.stderr | ||
pat-tuple-bad-type.rs | ||
pat-tuple-bad-type.stderr | ||
pat-tuple-field-count-cross.rs | ||
pat-tuple-field-count-cross.stderr | ||
pat-tuple-overfield.rs | ||
pat-tuple-overfield.stderr | ||
pat-tuple-underfield.rs | ||
pat-tuple-underfield.stderr | ||
pat-type-err-formal-param.rs | ||
pat-type-err-formal-param.stderr | ||
pat-type-err-let-stmt.rs | ||
pat-type-err-let-stmt.stderr | ||
patkind-litrange-no-expr.rs | ||
patkind-litrange-no-expr.stderr | ||
pattern-bad-ref-box-order.fixed | ||
pattern-bad-ref-box-order.rs | ||
pattern-bad-ref-box-order.stderr | ||
pattern-binding-disambiguation.rs | ||
pattern-binding-disambiguation.stderr | ||
pattern-error-continue.rs | ||
pattern-error-continue.stderr | ||
pattern-ident-path-generics.rs | ||
pattern-ident-path-generics.stderr | ||
pattern-tyvar-2.rs | ||
pattern-tyvar-2.stderr | ||
pattern-tyvar.rs | ||
pattern-tyvar.stderr | ||
range-pattern-meant-to-be-slice-rest-pattern.rs | ||
range-pattern-meant-to-be-slice-rest-pattern.stderr | ||
rest-pat-semantic-disallowed.rs | ||
rest-pat-semantic-disallowed.stderr | ||
rest-pat-syntactic.rs | ||
rest-pat-syntactic.stderr | ||
size-and-align.rs | ||
slice-array-infer.rs | ||
slice-pattern-refutable.rs | ||
slice-pattern-refutable.stderr | ||
slice-patterns-ambiguity.rs | ||
slice-patterns-ambiguity.stderr | ||
slice-patterns-irrefutable.rs | ||
slice-patterns-irrefutable.stderr | ||
slice-patterns-nested.rs | ||
suggest-adding-appropriate-missing-pattern-excluding-comments.fixed | ||
suggest-adding-appropriate-missing-pattern-excluding-comments.rs | ||
suggest-adding-appropriate-missing-pattern-excluding-comments.stderr |