| // SPDX-License-Identifier: GPL-2.0 | 
 |  | 
 | use crate::helpers::function_name; | 
 | use proc_macro::TokenStream; | 
 |  | 
 | /// Please see [`crate::export`] for documentation. | 
 | pub(crate) fn export(_attr: TokenStream, ts: TokenStream) -> TokenStream { | 
 |     let Some(name) = function_name(ts.clone()) else { | 
 |         return "::core::compile_error!(\"The #[export] attribute must be used on a function.\");" | 
 |             .parse::<TokenStream>() | 
 |             .unwrap(); | 
 |     }; | 
 |  | 
 |     // This verifies that the function has the same signature as the declaration generated by | 
 |     // bindgen. It makes use of the fact that all branches of an if/else must have the same type. | 
 |     let signature_check = quote!( | 
 |         const _: () = { | 
 |             if true { | 
 |                 ::kernel::bindings::#name | 
 |             } else { | 
 |                 #name | 
 |             }; | 
 |         }; | 
 |     ); | 
 |  | 
 |     let no_mangle = quote!(#[no_mangle]); | 
 |  | 
 |     TokenStream::from_iter([signature_check, no_mangle, ts]) | 
 | } |