]> git.lizzy.rs Git - rust.git/commitdiff
Rollup merge of #105655 - RedDocMD:bug-105645, r=oli-obk
authorfee1-dead <ent3rm4n@gmail.com>
Mon, 9 Jan 2023 15:35:27 +0000 (23:35 +0800)
committerGitHub <noreply@github.com>
Mon, 9 Jan 2023 15:35:27 +0000 (23:35 +0800)
Remove invalid case for mutable borrow suggestion

If we have a call such as `foo(&mut buf)` and after reference
collapsing the type is inferred as `&T` where-as the required type is
`&mut T`, don't suggest `foo(&mut mut buf)`. This is wrong syntactically
and the issue lies elsewhere, not in the borrow.

Fixes #105645

compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs
src/test/ui/suggestions/issue-105645.rs [new file with mode: 0644]
src/test/ui/suggestions/issue-105645.stderr [new file with mode: 0644]

index c52365ae3b7c7309cc90bd44db5de64e07573482..439854958270c4851385dd0d97d930a5edf559e4 100644 (file)
@@ -1519,6 +1519,13 @@ fn suggest_change_mut(
                         .source_map()
                         .span_take_while(span, |c| c.is_whitespace() || *c == '&');
                     if points_at_arg && mutability.is_not() && refs_number > 0 {
+                        // If we have a call like foo(&mut buf), then don't suggest foo(&mut mut buf)
+                        if snippet
+                            .trim_start_matches(|c: char| c.is_whitespace() || c == '&')
+                            .starts_with("mut")
+                        {
+                            return;
+                        }
                         err.span_suggestion_verbose(
                             sp,
                             "consider changing this borrow's mutability",
diff --git a/src/test/ui/suggestions/issue-105645.rs b/src/test/ui/suggestions/issue-105645.rs
new file mode 100644 (file)
index 0000000..681ce1c
--- /dev/null
@@ -0,0 +1,8 @@
+fn main() {
+    let mut buf = [0u8; 50];
+    let mut bref = buf.as_slice();
+    foo(&mut bref);
+    //~^ ERROR 4:9: 4:18: the trait bound `&[u8]: std::io::Write` is not satisfied [E0277]
+}
+
+fn foo(_: &mut impl std::io::Write) {}
diff --git a/src/test/ui/suggestions/issue-105645.stderr b/src/test/ui/suggestions/issue-105645.stderr
new file mode 100644 (file)
index 0000000..895f5ff
--- /dev/null
@@ -0,0 +1,18 @@
+error[E0277]: the trait bound `&[u8]: std::io::Write` is not satisfied
+  --> $DIR/issue-105645.rs:4:9
+   |
+LL |     foo(&mut bref);
+   |     --- ^^^^^^^^^ the trait `std::io::Write` is not implemented for `&[u8]`
+   |     |
+   |     required by a bound introduced by this call
+   |
+   = help: the trait `std::io::Write` is implemented for `&mut [u8]`
+note: required by a bound in `foo`
+  --> $DIR/issue-105645.rs:8:21
+   |
+LL | fn foo(_: &mut impl std::io::Write) {}
+   |                     ^^^^^^^^^^^^^^ required by this bound in `foo`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.