7
7
#[ macro_use]
8
8
extern crate quote;
9
9
10
- use proc_macro2:: { Delimiter , Ident , Literal , Span , TokenStream , TokenTree } ;
10
+ use proc_macro2:: { Ident , Literal , Span , TokenStream , TokenTree } ;
11
11
use quote:: ToTokens ;
12
12
use std:: env;
13
13
@@ -44,13 +44,9 @@ pub fn simd_test(
44
44
. collect ( ) ;
45
45
46
46
let enable_feature = string ( enable_feature) ;
47
- let item = TokenStream :: from ( item) ;
48
- let name = find_name ( item. clone ( ) ) ;
49
-
50
- let name: TokenStream = name
51
- . to_string ( )
52
- . parse ( )
53
- . unwrap_or_else ( |_| panic ! ( "failed to parse name: {}" , name. to_string( ) ) ) ;
47
+ let mut item = syn:: parse_macro_input!( item as syn:: ItemFn ) ;
48
+ let item_attrs = std:: mem:: take ( & mut item. attrs ) ;
49
+ let name = & item. sig . ident ;
54
50
55
51
let target = env:: var ( "TARGET" ) . expect (
56
52
"TARGET environment variable should be set for rustc (e.g. TARGET=x86_64-apple-darwin cargo test)"
@@ -109,6 +105,7 @@ pub fn simd_test(
109
105
#[ allow( non_snake_case) ]
110
106
#[ test]
111
107
#maybe_ignore
108
+ #( #item_attrs) *
112
109
fn #name( ) {
113
110
if #force_test | ( #cfg_target_features) {
114
111
let v = unsafe { #name( ) } ;
@@ -123,29 +120,3 @@ pub fn simd_test(
123
120
} ;
124
121
ret. into ( )
125
122
}
126
-
127
- fn find_name ( item : TokenStream ) -> Ident {
128
- let mut tokens = item. into_iter ( ) ;
129
- while let Some ( tok) = tokens. next ( ) {
130
- if let TokenTree :: Ident ( word) = tok {
131
- if word == "fn" {
132
- break ;
133
- }
134
- }
135
- }
136
-
137
- fn get_ident ( tt : TokenTree ) -> Option < Ident > {
138
- match tt {
139
- TokenTree :: Ident ( i) => Some ( i) ,
140
- TokenTree :: Group ( g) if g. delimiter ( ) == Delimiter :: None => {
141
- get_ident ( g. stream ( ) . into_iter ( ) . next ( ) ?)
142
- }
143
- _ => None ,
144
- }
145
- }
146
-
147
- tokens
148
- . next ( )
149
- . and_then ( get_ident)
150
- . expect ( "failed to find function name" )
151
- }
0 commit comments