File tree Expand file tree Collapse file tree 5 files changed +59
-1
lines changed
compiler/rustc_hir_analysis
tests/ui/async-await/async-drop Expand file tree Collapse file tree 5 files changed +59
-1
lines changed Original file line number Diff line number Diff line change @@ -42,6 +42,10 @@ hir_analysis_associated_type_trait_uninferred_generic_params = cannot use the {$
42
42
43
43
hir_analysis_associated_type_trait_uninferred_generic_params_multipart_suggestion = use a fully qualified path with explicit lifetimes
44
44
45
+ hir_analysis_async_drop_without_sync_drop = `AsyncDrop` impl without `Drop` impl
46
+ .help = type implementing `AsyncDrop` trait must also implement `Drop` trait to be used in sync context and unwinds
47
+ .note = `AsyncDrop` impl here
48
+
45
49
hir_analysis_auto_deref_reached_recursion_limit = reached the recursion limit while auto-dereferencing `{ $ty } `
46
50
.label = deref recursion limit reached
47
51
.help = consider increasing the recursion limit by adding a `#![recursion_limit = "{ $suggested_limit } "]` attribute to your crate (`{ $crate_name } `)
Original file line number Diff line number Diff line change @@ -113,7 +113,17 @@ pub fn provide(providers: &mut Providers) {
113
113
}
114
114
115
115
fn adt_destructor ( tcx : TyCtxt < ' _ > , def_id : LocalDefId ) -> Option < ty:: Destructor > {
116
- tcx. calculate_dtor ( def_id, always_applicable:: check_drop_impl)
116
+ let dtor = tcx. calculate_dtor ( def_id, always_applicable:: check_drop_impl) ;
117
+ if dtor. is_none ( ) && tcx. features ( ) . async_drop ( ) {
118
+ if let Some ( async_dtor) = adt_async_destructor ( tcx, def_id) {
119
+ // When type has AsyncDrop impl, but doesn't have Drop impl, generate error
120
+ let span = tcx. def_span ( def_id. to_def_id ( ) ) ;
121
+ let impl_span = tcx. def_span ( async_dtor. impl_did ) ;
122
+ let err = errors:: AsyncDropWithoutSyncDrop { span, impl_span } ;
123
+ tcx. dcx ( ) . emit_err ( err) ;
124
+ }
125
+ }
126
+ dtor
117
127
}
118
128
119
129
fn adt_async_destructor ( tcx : TyCtxt < ' _ > , def_id : LocalDefId ) -> Option < ty:: AsyncDestructor > {
Original file line number Diff line number Diff line change @@ -1698,3 +1698,13 @@ pub(crate) struct SelfInTypeAlias {
1698
1698
#[ label]
1699
1699
pub span : Span ,
1700
1700
}
1701
+
1702
+ #[ derive( Diagnostic ) ]
1703
+ #[ diag( hir_analysis_async_drop_without_sync_drop) ]
1704
+ #[ help]
1705
+ pub ( crate ) struct AsyncDropWithoutSyncDrop {
1706
+ #[ primary_span]
1707
+ pub span : Span ,
1708
+ #[ note]
1709
+ pub impl_span : Span ,
1710
+ }
Original file line number Diff line number Diff line change
1
+ //@ edition: 2024
2
+ #![ feature( async_drop) ]
3
+ #![ allow( incomplete_features) ]
4
+ #![ crate_type = "lib" ]
5
+
6
+ use std:: future:: AsyncDrop ;
7
+ use std:: pin:: Pin ;
8
+
9
+ async fn foo ( ) {
10
+ let _st = St ;
11
+ }
12
+
13
+ struct St ; //~ ERROR: `AsyncDrop` impl without `Drop` impl
14
+
15
+ impl AsyncDrop for St {
16
+ async fn drop ( self : Pin < & mut Self > ) {
17
+ println ! ( "123" ) ;
18
+ }
19
+ }
Original file line number Diff line number Diff line change
1
+ error: `AsyncDrop` impl without `Drop` impl
2
+ --> $DIR/async-without-sync.rs:13:1
3
+ |
4
+ LL | struct St;
5
+ | ^^^^^^^^^
6
+ |
7
+ = help: type implementing `AsyncDrop` trait must also implement `Drop` trait to be used in sync context and unwinds
8
+ note: `AsyncDrop` impl here
9
+ --> $DIR/async-without-sync.rs:15:1
10
+ |
11
+ LL | impl AsyncDrop for St {
12
+ | ^^^^^^^^^^^^^^^^^^^^^
13
+
14
+ error: aborting due to 1 previous error
15
+
You can’t perform that action at this time.
0 commit comments