@@ -16,8 +16,8 @@ mod llvm_enzyme {
16
16
use rustc_ast:: tokenstream:: * ;
17
17
use rustc_ast:: visit:: AssocCtxt :: * ;
18
18
use rustc_ast:: {
19
- self as ast, AssocItemKind , BindingMode , ExprKind , FnRetTy , FnSig , Generics , ItemKind ,
20
- MetaItemInner , PatKind , QSelf , TyKind ,
19
+ self as ast, AssocItemKind , BindingMode , FnRetTy , FnSig , Generics , ItemKind , MetaItemInner ,
20
+ PatKind , QSelf , TyKind , Visibility ,
21
21
} ;
22
22
use rustc_expand:: base:: { Annotatable , ExtCtxt } ;
23
23
use rustc_span:: { Ident , Span , Symbol , kw, sym} ;
@@ -72,6 +72,16 @@ mod llvm_enzyme {
72
72
}
73
73
}
74
74
75
+ // Get information about the function the macro is applied to
76
+ fn extract_item_info ( iitem : & P < ast:: Item > ) -> Option < ( Visibility , FnSig , Ident ) > {
77
+ match & iitem. kind {
78
+ ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
79
+ Some ( ( iitem. vis . clone ( ) , sig. clone ( ) , ident. clone ( ) ) )
80
+ }
81
+ _ => None ,
82
+ }
83
+ }
84
+
75
85
pub ( crate ) fn from_ast (
76
86
ecx : & mut ExtCtxt < ' _ > ,
77
87
meta_item : & ThinVec < MetaItemInner > ,
@@ -201,49 +211,24 @@ mod llvm_enzyme {
201
211
let dcx = ecx. sess . dcx ( ) ;
202
212
203
213
// first get information about the annotable item:
204
- let ( sig, vis, primal) = match & item {
205
- Annotatable :: Item ( iitem) => {
206
- let ( sig, ident) = match & iitem. kind {
207
- ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => ( sig, ident) ,
208
- _ => {
209
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
210
- return vec ! [ item] ;
211
- }
212
- } ;
213
- ( sig. clone ( ) , iitem. vis . clone ( ) , ident. clone ( ) )
214
- }
214
+ let Some ( ( vis, sig, primal) ) = ( match & item {
215
+ Annotatable :: Item ( iitem) => extract_item_info ( iitem) ,
216
+ Annotatable :: Stmt ( stmt) => match & stmt. kind {
217
+ ast:: StmtKind :: Item ( iitem) => extract_item_info ( iitem) ,
218
+ _ => None ,
219
+ } ,
215
220
Annotatable :: AssocItem ( assoc_item, Impl { of_trait : false } ) => {
216
- let ( sig, ident) = match & assoc_item. kind {
217
- ast:: AssocItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => ( sig, ident) ,
218
- _ => {
219
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
220
- return vec ! [ item] ;
221
- }
222
- } ;
223
- ( sig. clone ( ) , assoc_item. vis . clone ( ) , ident. clone ( ) )
224
- }
225
- Annotatable :: Stmt ( stmt) => {
226
- let ( sig, vis, ident) = match & stmt. kind {
227
- ast:: StmtKind :: Item ( iitem) => match & iitem. kind {
228
- ast:: ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
229
- ( sig. clone ( ) , iitem. vis . clone ( ) , ident. clone ( ) )
230
- }
231
- _ => {
232
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
233
- return vec ! [ item] ;
234
- }
235
- } ,
236
- _ => {
237
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
238
- return vec ! [ item] ;
221
+ match & assoc_item. kind {
222
+ ast:: AssocItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
223
+ Some ( ( assoc_item. vis . clone ( ) , sig. clone ( ) , ident. clone ( ) ) )
239
224
}
240
- } ;
241
- ( sig, vis, ident)
242
- }
243
- _ => {
244
- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
245
- return vec ! [ item] ;
225
+ _ => None ,
226
+ }
246
227
}
228
+ _ => None ,
229
+ } ) else {
230
+ dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
231
+ return vec ! [ item] ;
247
232
} ;
248
233
249
234
let meta_item_vec: ThinVec < MetaItemInner > = match meta_item. kind {
0 commit comments