File tree 2 files changed +20
-2
lines changed
tests/ui/async-await/in-trait
2 files changed +20
-2
lines changed Original file line number Diff line number Diff line change @@ -94,10 +94,16 @@ impl<'tcx> LateLintPass<'tcx> for AsyncFnInTrait {
94
94
if let hir:: TraitItemKind :: Fn ( sig, body) = item. kind
95
95
&& let hir:: IsAsync :: Async ( async_span) = sig. header . asyncness
96
96
{
97
+ // RTN can be used to bound `async fn` in traits in a better way than "always"
97
98
if cx. tcx . features ( ) . return_type_notation {
98
99
return ;
99
100
}
100
101
102
+ // Only need to think about library implications of reachable traits
103
+ if !cx. tcx . effective_visibilities ( ( ) ) . is_reachable ( item. owner_id . def_id ) {
104
+ return ;
105
+ }
106
+
101
107
let hir:: FnRetTy :: Return ( hir:: Ty { kind : hir:: TyKind :: OpaqueDef ( def, ..) , .. } ) =
102
108
sig. decl . output
103
109
else {
Original file line number Diff line number Diff line change 3
3
#![ feature( async_fn_in_trait) ]
4
4
#![ deny( async_fn_in_trait) ]
5
5
6
- trait Foo {
6
+ pub trait Foo {
7
7
async fn not_send ( ) ;
8
- //~^ ERROR
8
+ //~^ ERROR use of `async fn` in public traits is discouraged
9
+ }
10
+
11
+ mod private {
12
+ pub trait FooUnreachable {
13
+ async fn not_send ( ) ;
14
+ // No warning
15
+ }
16
+ }
17
+
18
+ pub ( crate ) trait FooCrate {
19
+ async fn not_send ( ) ;
20
+ // No warning
9
21
}
10
22
11
23
fn main ( ) { }
You can’t perform that action at this time.
0 commit comments