mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	 3e2de21344
			
		
	
	
		3e2de21344
		
	
	
	
	
		
			
			Now that we have more in this crate making use of traits, try to be more specific about what is actually unused.
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![feature(f16)]
 | |
| #![feature(f128)]
 | |
| // `STATUS_DLL_NOT_FOUND` on i686 MinGW, not worth looking into.
 | |
| #![cfg(not(all(target_arch = "x86", target_os = "windows", target_env = "gnu")))]
 | |
| 
 | |
| macro_rules! basic {
 | |
|     (
 | |
|         fn_name: $fn_name:ident,
 | |
|         FTy: $FTy:ty,
 | |
|         CFn: $CFn:ty,
 | |
|         CArgs: $CArgs:ty,
 | |
|         CRet: $CRet:ty,
 | |
|         RustFn: $RustFn:ty,
 | |
|         RustArgs: $RustArgs:ty,
 | |
|         RustRet: $RustRet:ty,
 | |
|         attrs: [$($attr:meta),*],
 | |
|         extra: [$($extra_tt:tt)*],
 | |
|         fn_extra: $fn_extra:expr,
 | |
|     ) => {
 | |
|         $(#[$attr])*
 | |
|         #[allow(dead_code)]
 | |
|         pub mod $fn_name {
 | |
|             type FTy= $FTy;
 | |
|             type CFnTy<'a> = $CFn;
 | |
|             type RustFnTy = $RustFn;
 | |
|             type RustArgsTy = $RustArgs;
 | |
|             type RustRetTy = $RustRet;
 | |
|             const A: &[&str] = &[$($extra_tt)*];
 | |
|             fn foo(a: f32) -> f32 {
 | |
|                 $fn_extra(a)
 | |
|             }
 | |
|         }
 | |
|     };
 | |
| }
 | |
| 
 | |
| mod test_basic {
 | |
|     libm_macros::for_each_function! {
 | |
|         callback: basic,
 | |
|         emit_types: all,
 | |
|         skip: [sin, cos],
 | |
|         attributes: [
 | |
|             // just some random attributes
 | |
|             #[allow(clippy::pedantic)]
 | |
|             #[allow(dead_code)]
 | |
|             [sinf, cosf]
 | |
|         ],
 | |
|         extra: ["foo", "bar"],
 | |
|         fn_extra: match MACRO_FN_NAME {
 | |
|             sin => |x| x + 2.0,
 | |
|             cos | cosf => |x: f32| x.MACRO_FN_NAME_NORMALIZED(),
 | |
|             _ => |_x| 100.0
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| macro_rules! basic_no_extra {
 | |
|     (
 | |
|         fn_name: $fn_name:ident,
 | |
|         attrs: [$($attr:meta),*],
 | |
|     ) => {
 | |
|         $(#[$attr])*
 | |
|         mod $fn_name {}
 | |
|     };
 | |
| }
 | |
| 
 | |
| mod test_basic_no_extra {
 | |
|     // Test with no extra, no skip, and no attributes
 | |
|     libm_macros::for_each_function! {
 | |
|         callback: basic_no_extra,
 | |
|     }
 | |
| }
 | |
| 
 | |
| mod test_only {
 | |
|     // Test that only works
 | |
|     libm_macros::for_each_function! {
 | |
|         callback: basic_no_extra,
 | |
|         only: [sin, sinf],
 | |
|     }
 | |
| }
 | |
| 
 | |
| macro_rules! specified_types {
 | |
|     (
 | |
|         fn_name: $fn_name:ident,
 | |
|         RustFn: $RustFn:ty,
 | |
|         RustArgs: $RustArgs:ty,
 | |
|         attrs: [$($attr:meta),*],
 | |
|     ) => {
 | |
|         $(#[$attr])*
 | |
|         #[allow(dead_code)]
 | |
|         mod $fn_name {
 | |
|             type RustFnTy = $RustFn;
 | |
|             type RustArgsTy = $RustArgs;
 | |
|         }
 | |
|     };
 | |
| }
 | |
| 
 | |
| mod test_emit_types {
 | |
|     // Test that we can specify a couple types to emit
 | |
|     libm_macros::for_each_function! {
 | |
|         callback: specified_types,
 | |
|         emit_types: [RustFn, RustArgs],
 | |
|     }
 | |
| }
 |