@@ -16,8 +16,8 @@ mod llvm_enzyme {
1616 use rustc_ast:: tokenstream:: * ;
1717 use rustc_ast:: visit:: AssocCtxt :: * ;
1818 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 ,
2121 } ;
2222 use rustc_expand:: base:: { Annotatable , ExtCtxt } ;
2323 use rustc_span:: { Ident , Span , Symbol , kw, sym} ;
@@ -72,6 +72,16 @@ mod llvm_enzyme {
7272 }
7373 }
7474
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+
7585 pub ( crate ) fn from_ast (
7686 ecx : & mut ExtCtxt < ' _ > ,
7787 meta_item : & ThinVec < MetaItemInner > ,
@@ -201,49 +211,24 @@ mod llvm_enzyme {
201211 let dcx = ecx. sess . dcx ( ) ;
202212
203213 // 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+ } ,
215220 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 ( ) ) )
239224 }
240- } ;
241- ( sig, vis, ident)
242- }
243- _ => {
244- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
245- return vec ! [ item] ;
225+ _ => None ,
226+ }
246227 }
228+ _ => None ,
229+ } ) else {
230+ dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
231+ return vec ! [ item] ;
247232 } ;
248233
249234 let meta_item_vec: ThinVec < MetaItemInner > = match meta_item. kind {
0 commit comments