about summary refs log tree commit diff
diff options
context:
space:
mode:
authormejrs <>2022-09-27 13:06:31 +0200
committermejrs <>2022-09-27 21:42:09 +0200
commitf3ac328d584b83bb7f0b4faa0f7a5699151b3ce9 (patch)
treecf8dc2045284ed418f109b2b9db461b0d3116d26
parentc4c94151321b8018ceb06ccff359109b8fed6bfe (diff)
downloadrust-f3ac328d584b83bb7f0b4faa0f7a5699151b3ce9.tar.gz
rust-f3ac328d584b83bb7f0b4faa0f7a5699151b3ce9.zip
Address feedback
-rw-r--r--compiler/rustc_hir_analysis/src/check/method/suggest.rs61
-rw-r--r--compiler/rustc_span/src/symbol.rs1
-rw-r--r--library/core/src/cell.rs2
-rw-r--r--library/std/src/sync/rwlock.rs1
-rw-r--r--library/std/src/thread/local.rs2
-rw-r--r--src/test/ui/suggestions/inner_type.fixed16
-rw-r--r--src/test/ui/suggestions/inner_type.rs16
-rw-r--r--src/test/ui/suggestions/inner_type.stderr40
-rw-r--r--src/test/ui/suggestions/inner_type2.rs2
-rw-r--r--src/test/ui/suggestions/inner_type2.stderr2
10 files changed, 113 insertions, 30 deletions
diff --git a/compiler/rustc_hir_analysis/src/check/method/suggest.rs b/compiler/rustc_hir_analysis/src/check/method/suggest.rs
index 1ff2575bcc5..c43dc8c134d 100644
--- a/compiler/rustc_hir_analysis/src/check/method/suggest.rs
+++ b/compiler/rustc_hir_analysis/src/check/method/suggest.rs
@@ -1428,7 +1428,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                             item_name,
                             field_ty,
                             call_expr,
-                            ProbeScope::AllTraits,
+                            ProbeScope::TraitsInScope,
                         )
                         .ok()
                         .map(|pick| (variant, field, pick))
@@ -1500,59 +1500,88 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                             item_name,
                             ty,
                             call_expr,
-                            ProbeScope::AllTraits,
+                            ProbeScope::TraitsInScope,
                         )  else { return; };
 
                 let name = self.ty_to_value_string(actual);
                 let inner_id = kind.did();
+                let mutable = if let Some(AutorefOrPtrAdjustment::Autoref { mutbl, .. }) =
+                    pick.autoref_or_ptr_adjustment
+                {
+                    Some(mutbl)
+                } else {
+                    None
+                };
 
                 if tcx.is_diagnostic_item(sym::LocalKey, inner_id) {
-                    err.help("use `with` or `try_with` to access the contents of threadlocals");
+                    err.help("use `with` or `try_with` to access thread local storage");
                 } else if Some(kind.did()) == tcx.lang_items().maybe_uninit() {
                     err.help(format!(
                         "if this `{name}` has been initialized, \
                         use one of the `assume_init` methods to access the inner value"
                     ));
                 } else if tcx.is_diagnostic_item(sym::RefCell, inner_id) {
-                    match pick.autoref_or_ptr_adjustment {
-                        Some(AutorefOrPtrAdjustment::Autoref {
-                            mutbl: Mutability::Not, ..
-                        }) => {
+                    match mutable {
+                        Some(Mutability::Not) => {
                             err.span_suggestion_verbose(
                                 expr.span.shrink_to_hi(),
                                 format!(
-                                    "use `.borrow()` to borrow the {ty}, \
-                                panicking if any outstanding mutable borrows exist."
+                                    "use `.borrow()` to borrow the `{ty}`, \
+                                    panicking if any outstanding mutable borrows exist."
                                 ),
                                 ".borrow()",
                                 Applicability::MaybeIncorrect,
                             );
                         }
-                        Some(AutorefOrPtrAdjustment::Autoref {
-                            mutbl: Mutability::Mut, ..
-                        }) => {
+                        Some(Mutability::Mut) => {
                             err.span_suggestion_verbose(
                                 expr.span.shrink_to_hi(),
                                 format!(
-                                    "use `.borrow_mut()` to mutably borrow the {ty}, \
-                                panicking if any outstanding borrows exist."
+                                    "use `.borrow_mut()` to mutably borrow the `{ty}`, \
+                                    panicking if any outstanding borrows exist."
                                 ),
                                 ".borrow_mut()",
                                 Applicability::MaybeIncorrect,
                             );
                         }
-                        _ => return,
+                        None => return,
                     }
                 } else if tcx.is_diagnostic_item(sym::Mutex, inner_id) {
                     err.span_suggestion_verbose(
                         expr.span.shrink_to_hi(),
                         format!(
-                            "use `.lock()` to borrow the {ty}, \
+                            "use `.lock()` to borrow the `{ty}`, \
                             blocking the current thread until it can be acquired"
                         ),
                         ".lock().unwrap()",
                         Applicability::MaybeIncorrect,
                     );
+                } else if tcx.is_diagnostic_item(sym::RwLock, inner_id) {
+                    match mutable {
+                        Some(Mutability::Not) => {
+                            err.span_suggestion_verbose(
+                                expr.span.shrink_to_hi(),
+                                format!(
+                                    "use `.read()` to borrow the `{ty}`, \
+                                    blocking the current thread until it can be acquired"
+                                ),
+                                ".read().unwrap()",
+                                Applicability::MaybeIncorrect,
+                            );
+                        }
+                        Some(Mutability::Mut) => {
+                            err.span_suggestion_verbose(
+                                expr.span.shrink_to_hi(),
+                                format!(
+                                    "use `.write()` to mutably borrow the `{ty}`, \
+                                    blocking the current thread until it can be acquired"
+                                ),
+                                ".write().unwrap()",
+                                Applicability::MaybeIncorrect,
+                            );
+                        }
+                        None => return,
+                    }
                 } else {
                     return;
                 };
diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs
index 6101c1c47e3..67ffc573b99 100644
--- a/compiler/rustc_span/src/symbol.rs
+++ b/compiler/rustc_span/src/symbol.rs
@@ -276,6 +276,7 @@ symbols! {
         Rust,
         RustcDecodable,
         RustcEncodable,
+        RwLock,
         RwLockReadGuard,
         RwLockWriteGuard,
         Send,
diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs
index cf7b1b358c9..288cab1ef39 100644
--- a/library/core/src/cell.rs
+++ b/library/core/src/cell.rs
@@ -614,7 +614,7 @@ impl<T, const N: usize> Cell<[T; N]> {
 /// A mutable memory location with dynamically checked borrow rules
 ///
 /// See the [module-level documentation](self) for more.
-#[rustc_diagnostic_item = "RefCell"]
+#[cfg_attr(not(test), rustc_diagnostic_item = "RefCell")]
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct RefCell<T: ?Sized> {
     borrow: Cell<BorrowFlag>,
diff --git a/library/std/src/sync/rwlock.rs b/library/std/src/sync/rwlock.rs
index 9ab781561e9..ee2c79b6669 100644
--- a/library/std/src/sync/rwlock.rs
+++ b/library/std/src/sync/rwlock.rs
@@ -76,6 +76,7 @@ use crate::sys_common::rwlock as sys;
 ///
 /// [`Mutex`]: super::Mutex
 #[stable(feature = "rust1", since = "1.0.0")]
+#[cfg_attr(not(test), rustc_diagnostic_item = "RwLock")]
 pub struct RwLock<T: ?Sized> {
     inner: sys::MovableRwLock,
     poison: poison::Flag,
diff --git a/library/std/src/thread/local.rs b/library/std/src/thread/local.rs
index 1d728349951..ffd17dc9909 100644
--- a/library/std/src/thread/local.rs
+++ b/library/std/src/thread/local.rs
@@ -95,7 +95,7 @@ use crate::fmt;
 /// [loader lock]: https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-best-practices
 /// [`JoinHandle::join`]: crate::thread::JoinHandle::join
 /// [`with`]: LocalKey::with
-#[rustc_diagnostic_item = "LocalKey"]
+#[cfg_attr(not(test), rustc_diagnostic_item = "LocalKey")]
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct LocalKey<T: 'static> {
     // This outer `LocalKey<T>` type is what's going to be stored in statics,
diff --git a/src/test/ui/suggestions/inner_type.fixed b/src/test/ui/suggestions/inner_type.fixed
index f6dc7c4ce17..327bf7caa72 100644
--- a/src/test/ui/suggestions/inner_type.fixed
+++ b/src/test/ui/suggestions/inner_type.fixed
@@ -16,15 +16,25 @@ fn main() {
 
     other_item.borrow().method();
     //~^ ERROR no method named `method` found for struct `RefCell` in the current scope [E0599]
-    //~| HELP use `.borrow()` to borrow the Struct<u32>, panicking if any outstanding mutable borrows exist.
+    //~| HELP use `.borrow()` to borrow the `Struct<u32>`, panicking if any outstanding mutable borrows exist.
 
     other_item.borrow_mut().some_mutable_method();
     //~^ ERROR no method named `some_mutable_method` found for struct `RefCell` in the current scope [E0599]
-    //~| HELP use `.borrow_mut()` to mutably borrow the Struct<u32>, panicking if any outstanding borrows exist.
+    //~| HELP use `.borrow_mut()` to mutably borrow the `Struct<u32>`, panicking if any outstanding borrows exist.
 
     let another_item = std::sync::Mutex::new(Struct { p: 42_u32 });
 
     another_item.lock().unwrap().method();
     //~^ ERROR no method named `method` found for struct `Mutex` in the current scope [E0599]
-    //~| HELP use `.lock()` to borrow the Struct<u32>, blocking the current thread until it can be acquired
+    //~| HELP use `.lock()` to borrow the `Struct<u32>`, blocking the current thread until it can be acquired
+
+    let another_item = std::sync::RwLock::new(Struct { p: 42_u32 });
+
+    another_item.read().unwrap().method();
+    //~^ ERROR no method named `method` found for struct `RwLock` in the current scope [E0599]
+    //~| HELP use `.read()` to borrow the `Struct<u32>`, blocking the current thread until it can be acquired
+
+    another_item.write().unwrap().some_mutable_method();
+    //~^ ERROR no method named `some_mutable_method` found for struct `RwLock` in the current scope [E0599]
+    //~| HELP use `.write()` to mutably borrow the `Struct<u32>`, blocking the current thread until it can be acquired
 }
\ No newline at end of file
diff --git a/src/test/ui/suggestions/inner_type.rs b/src/test/ui/suggestions/inner_type.rs
index b42067c047c..a8c1c5d386a 100644
--- a/src/test/ui/suggestions/inner_type.rs
+++ b/src/test/ui/suggestions/inner_type.rs
@@ -16,15 +16,25 @@ fn main() {
 
     other_item.method();
     //~^ ERROR no method named `method` found for struct `RefCell` in the current scope [E0599]
-    //~| HELP use `.borrow()` to borrow the Struct<u32>, panicking if any outstanding mutable borrows exist.
+    //~| HELP use `.borrow()` to borrow the `Struct<u32>`, panicking if any outstanding mutable borrows exist.
 
     other_item.some_mutable_method();
     //~^ ERROR no method named `some_mutable_method` found for struct `RefCell` in the current scope [E0599]
-    //~| HELP use `.borrow_mut()` to mutably borrow the Struct<u32>, panicking if any outstanding borrows exist.
+    //~| HELP use `.borrow_mut()` to mutably borrow the `Struct<u32>`, panicking if any outstanding borrows exist.
 
     let another_item = std::sync::Mutex::new(Struct { p: 42_u32 });
 
     another_item.method();
     //~^ ERROR no method named `method` found for struct `Mutex` in the current scope [E0599]
-    //~| HELP use `.lock()` to borrow the Struct<u32>, blocking the current thread until it can be acquired
+    //~| HELP use `.lock()` to borrow the `Struct<u32>`, blocking the current thread until it can be acquired
+
+    let another_item = std::sync::RwLock::new(Struct { p: 42_u32 });
+
+    another_item.method();
+    //~^ ERROR no method named `method` found for struct `RwLock` in the current scope [E0599]
+    //~| HELP use `.read()` to borrow the `Struct<u32>`, blocking the current thread until it can be acquired
+
+    another_item.some_mutable_method();
+    //~^ ERROR no method named `some_mutable_method` found for struct `RwLock` in the current scope [E0599]
+    //~| HELP use `.write()` to mutably borrow the `Struct<u32>`, blocking the current thread until it can be acquired
 }
\ No newline at end of file
diff --git a/src/test/ui/suggestions/inner_type.stderr b/src/test/ui/suggestions/inner_type.stderr
index f2b25944c8b..00d52f0f1d3 100644
--- a/src/test/ui/suggestions/inner_type.stderr
+++ b/src/test/ui/suggestions/inner_type.stderr
@@ -9,7 +9,7 @@ note: the method `method` exists on the type `Struct<u32>`
    |
 LL |     pub fn method(&self) {}
    |     ^^^^^^^^^^^^^^^^^^^^
-help: use `.borrow()` to borrow the Struct<u32>, panicking if any outstanding mutable borrows exist.
+help: use `.borrow()` to borrow the `Struct<u32>`, panicking if any outstanding mutable borrows exist.
    |
 LL |     other_item.borrow().method();
    |               +++++++++
@@ -25,7 +25,7 @@ note: the method `some_mutable_method` exists on the type `Struct<u32>`
    |
 LL |     pub fn some_mutable_method(&mut self) {}
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-help: use `.borrow_mut()` to mutably borrow the Struct<u32>, panicking if any outstanding borrows exist.
+help: use `.borrow_mut()` to mutably borrow the `Struct<u32>`, panicking if any outstanding borrows exist.
    |
 LL |     other_item.borrow_mut().some_mutable_method();
    |               +++++++++++++
@@ -41,11 +41,43 @@ note: the method `method` exists on the type `Struct<u32>`
    |
 LL |     pub fn method(&self) {}
    |     ^^^^^^^^^^^^^^^^^^^^
-help: use `.lock()` to borrow the Struct<u32>, blocking the current thread until it can be acquired
+help: use `.lock()` to borrow the `Struct<u32>`, blocking the current thread until it can be acquired
    |
 LL |     another_item.lock().unwrap().method();
    |                 ++++++++++++++++
 
-error: aborting due to 3 previous errors
+error[E0599]: no method named `method` found for struct `RwLock` in the current scope
+  --> $DIR/inner_type.rs:33:18
+   |
+LL |     another_item.method();
+   |                  ^^^^^^ method not found in `RwLock<Struct<u32>>`
+   |
+note: the method `method` exists on the type `Struct<u32>`
+  --> $DIR/inner_type.rs:9:5
+   |
+LL |     pub fn method(&self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^
+help: use `.read()` to borrow the `Struct<u32>`, blocking the current thread until it can be acquired
+   |
+LL |     another_item.read().unwrap().method();
+   |                 ++++++++++++++++
+
+error[E0599]: no method named `some_mutable_method` found for struct `RwLock` in the current scope
+  --> $DIR/inner_type.rs:37:18
+   |
+LL |     another_item.some_mutable_method();
+   |                  ^^^^^^^^^^^^^^^^^^^ method not found in `RwLock<Struct<u32>>`
+   |
+note: the method `some_mutable_method` exists on the type `Struct<u32>`
+  --> $DIR/inner_type.rs:11:5
+   |
+LL |     pub fn some_mutable_method(&mut self) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+help: use `.write()` to mutably borrow the `Struct<u32>`, blocking the current thread until it can be acquired
+   |
+LL |     another_item.write().unwrap().some_mutable_method();
+   |                 +++++++++++++++++
+
+error: aborting due to 5 previous errors
 
 For more information about this error, try `rustc --explain E0599`.
diff --git a/src/test/ui/suggestions/inner_type2.rs b/src/test/ui/suggestions/inner_type2.rs
index 694c0adfd06..8dea8100c28 100644
--- a/src/test/ui/suggestions/inner_type2.rs
+++ b/src/test/ui/suggestions/inner_type2.rs
@@ -17,7 +17,7 @@ thread_local! {
 fn main() {
     STRUCT.method();
     //~^ ERROR no method named `method` found for struct `LocalKey` in the current scope [E0599]
-    //~| HELP use `with` or `try_with` to access the contents of threadlocals
+    //~| HELP use `with` or `try_with` to access thread local storage
 
     let item = std::mem::MaybeUninit::new(Struct { p: 42_u32 });
     item.method();
diff --git a/src/test/ui/suggestions/inner_type2.stderr b/src/test/ui/suggestions/inner_type2.stderr
index 40e7a7ab41e..eddfd9d6340 100644
--- a/src/test/ui/suggestions/inner_type2.stderr
+++ b/src/test/ui/suggestions/inner_type2.stderr
@@ -4,7 +4,7 @@ error[E0599]: no method named `method` found for struct `LocalKey` in the curren
 LL |     STRUCT.method();
    |            ^^^^^^ method not found in `LocalKey<Struct<u32>>`
    |
-   = help: use `with` or `try_with` to access the contents of threadlocals
+   = help: use `with` or `try_with` to access thread local storage
 note: the method `method` exists on the type `Struct<u32>`
   --> $DIR/inner_type2.rs:6:5
    |