@@ -17,7 +17,7 @@ mod llvm_enzyme {
1717 use rustc_ast:: visit:: AssocCtxt :: * ;
1818 use rustc_ast:: {
1919 self as ast, AssocItemKind , BindingMode , FnRetTy , FnSig , Generics , ItemKind , MetaItemInner ,
20- PatKind , TyKind ,
20+ PatKind , TyKind , Visibility ,
2121 } ;
2222 use rustc_expand:: base:: { Annotatable , ExtCtxt } ;
2323 use rustc_span:: { Ident , Span , Symbol , kw, sym} ;
@@ -54,6 +54,16 @@ mod llvm_enzyme {
5454 first_ident ( x) . name . to_string ( )
5555 }
5656
57+ // Get information about the function the macro is applied to
58+ fn extract_item_info ( iitem : & P < ast:: Item > ) -> Option < ( Visibility , FnSig , Ident ) > {
59+ match & iitem. kind {
60+ ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
61+ Some ( ( iitem. vis . clone ( ) , sig. clone ( ) , ident. clone ( ) ) )
62+ }
63+ _ => None ,
64+ }
65+ }
66+
5767 pub ( crate ) fn from_ast (
5868 ecx : & mut ExtCtxt < ' _ > ,
5969 meta_item : & ThinVec < MetaItemInner > ,
@@ -147,49 +157,24 @@ mod llvm_enzyme {
147157 let dcx = ecx. sess . dcx ( ) ;
148158
149159 // first get information about the annotable item:
150- let ( sig, vis, primal) = match & item {
151- Annotatable :: Item ( iitem) => {
152- let ( sig, ident) = match & iitem. kind {
153- ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => ( sig, ident) ,
154- _ => {
155- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
156- return vec ! [ item] ;
157- }
158- } ;
159- ( sig. clone ( ) , iitem. vis . clone ( ) , ident. clone ( ) )
160- }
160+ let Some ( ( vis, sig, primal) ) = ( match & item {
161+ Annotatable :: Item ( iitem) => extract_item_info ( iitem) ,
162+ Annotatable :: Stmt ( stmt) => match & stmt. kind {
163+ ast:: StmtKind :: Item ( iitem) => extract_item_info ( iitem) ,
164+ _ => None ,
165+ } ,
161166 Annotatable :: AssocItem ( assoc_item, Impl { of_trait : false } ) => {
162- let ( sig, ident) = match & assoc_item. kind {
163- ast:: AssocItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => ( sig, ident) ,
164- _ => {
165- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
166- return vec ! [ item] ;
167+ match & assoc_item. kind {
168+ ast:: AssocItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
169+ Some ( ( assoc_item. vis . clone ( ) , sig. clone ( ) , ident. clone ( ) ) )
167170 }
168- } ;
169- ( sig. clone ( ) , assoc_item. vis . clone ( ) , ident. clone ( ) )
170- }
171- Annotatable :: Stmt ( stmt) => {
172- let ( sig, vis, ident) = match & stmt. kind {
173- ast:: StmtKind :: Item ( iitem) => match & iitem. kind {
174- ast:: ItemKind :: Fn ( box ast:: Fn { sig, ident, .. } ) => {
175- ( sig. clone ( ) , iitem. vis . clone ( ) , ident. clone ( ) )
176- }
177- _ => {
178- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
179- return vec ! [ item] ;
180- }
181- } ,
182- _ => {
183- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
184- return vec ! [ item] ;
185- }
186- } ;
187- ( sig, vis, ident)
188- }
189- _ => {
190- dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
191- return vec ! [ item] ;
171+ _ => None ,
172+ }
192173 }
174+ _ => None ,
175+ } ) else {
176+ dcx. emit_err ( errors:: AutoDiffInvalidApplication { span : item. span ( ) } ) ;
177+ return vec ! [ item] ;
193178 } ;
194179
195180 let meta_item_vec: ThinVec < MetaItemInner > = match meta_item. kind {
0 commit comments