diff options
| author | Jacob Pratt <jacob@jhpratt.dev> | 2025-01-13 20:43:45 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-13 20:43:45 -0500 |
| commit | 54c324f47b8b38a9a0e20ca1c21233b309e39a04 (patch) | |
| tree | 196001e3257f8759ee6019e5126b2fdfed836f7b /compiler/rustc_codegen_llvm/src/errors.rs | |
| parent | 81f742954a48af17a2a5c57cc708164245a48329 (diff) | |
| parent | 4438b3211f32f85145a9d30fcd107206899d722c (diff) | |
| download | rust-54c324f47b8b38a9a0e20ca1c21233b309e39a04.tar.gz rust-54c324f47b8b38a9a0e20ca1c21233b309e39a04.zip | |
Rollup merge of #134977 - estebank:issue-112357, r=BoxyUwU
Detect `mut arg: &Ty` meant to be `arg: &mut Ty` and provide structured suggestion
When a newcomer attempts to use an "out parameter" using borrows, they sometimes get confused and instead of mutating the borrow they try to mutate the function-local binding instead. This leads to either type errors (due to assigning an owned value to a mutable binding of reference type) or a multitude of lifetime errors and unused binding warnings.
This change adds a suggestion to the type error
```
error[E0308]: mismatched types
--> $DIR/mut-arg-of-borrowed-type-meant-to-be-arg-of-mut-borrow.rs:6:14
|
LL | fn change_object(mut object: &Object) {
| ------- expected due to this parameter type
LL | let object2 = Object;
LL | object = object2;
| ^^^^^^^ expected `&Object`, found `Object`
|
help: you might have meant to mutate the pointed at value being passed in, instead of changing the reference in the local binding
|
LL ~ fn change_object(object: &mut Object) {
LL | let object2 = Object;
LL ~ *object = object2;
|
```
and to the unused assignment lint
```
error: value assigned to `object` is never read
--> $DIR/mut-arg-of-borrowed-type-meant-to-be-arg-of-mut-borrow.rs:11:5
|
LL | object = &object2;
| ^^^^^^
|
note: the lint level is defined here
--> $DIR/mut-arg-of-borrowed-type-meant-to-be-arg-of-mut-borrow.rs:1:9
|
LL | #![deny(unused_assignments, unused_variables)]
| ^^^^^^^^^^^^^^^^^^
help: you might have meant to mutate the pointed at value being passed in, instead of changing the reference in the local binding
|
LL ~ fn change_object2(object: &mut Object) {
LL | let object2 = Object;
LL ~ *object = object2;
|
```
Fix #112357.
Diffstat (limited to 'compiler/rustc_codegen_llvm/src/errors.rs')
0 files changed, 0 insertions, 0 deletions
