about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_lint/src/async_fn_in_trait.rs6
-rw-r--r--tests/ui/async-await/in-trait/warn.rs16
2 files changed, 20 insertions, 2 deletions
diff --git a/compiler/rustc_lint/src/async_fn_in_trait.rs b/compiler/rustc_lint/src/async_fn_in_trait.rs
index 1329ba3d519..9214e04bb8b 100644
--- a/compiler/rustc_lint/src/async_fn_in_trait.rs
+++ b/compiler/rustc_lint/src/async_fn_in_trait.rs
@@ -93,10 +93,16 @@ impl<'tcx> LateLintPass<'tcx> for AsyncFnInTrait {
         if let hir::TraitItemKind::Fn(sig, body) = item.kind
             && let hir::IsAsync::Async(async_span) = sig.header.asyncness
         {
+            // RTN can be used to bound `async fn` in traits in a better way than "always"
             if cx.tcx.features().return_type_notation {
                 return;
             }
 
+            // Only need to think about library implications of reachable traits
+            if !cx.tcx.effective_visibilities(()).is_reachable(item.owner_id.def_id) {
+                return;
+            }
+
             let hir::FnRetTy::Return(hir::Ty { kind: hir::TyKind::OpaqueDef(def, ..), .. }) =
                 sig.decl.output
             else {
diff --git a/tests/ui/async-await/in-trait/warn.rs b/tests/ui/async-await/in-trait/warn.rs
index defbdcffccd..4f981c31f5c 100644
--- a/tests/ui/async-await/in-trait/warn.rs
+++ b/tests/ui/async-await/in-trait/warn.rs
@@ -3,9 +3,21 @@
 #![feature(async_fn_in_trait)]
 #![deny(async_fn_in_trait)]
 
-trait Foo {
+pub trait Foo {
     async fn not_send();
-    //~^ ERROR
+    //~^ ERROR  use of `async fn` in public traits is discouraged
+}
+
+mod private {
+    pub trait FooUnreachable {
+        async fn not_send();
+        // No warning
+    }
+}
+
+pub(crate) trait FooCrate {
+    async fn not_send();
+    // No warning
 }
 
 fn main() {}