@@ -12,6 +12,7 @@ extern crate syn;
12
12
use proc_macro2:: Span ;
13
13
use rand:: Rng ;
14
14
use rand:: SeedableRng ;
15
+ use std:: collections:: HashSet ;
15
16
use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
16
17
use std:: time:: { SystemTime , UNIX_EPOCH } ;
17
18
use syn:: {
@@ -119,7 +120,10 @@ pub fn entry(args: TokenStream, input: TokenStream) -> TokenStream {
119
120
let attrs = f. attrs ;
120
121
let unsafety = f. unsafety ;
121
122
let hash = random_ident ( ) ;
122
- let ( statics, stmts) = extract_static_muts ( f. block . stmts ) ;
123
+ let ( statics, stmts) = match extract_static_muts ( f. block . stmts ) {
124
+ Err ( e) => return e. to_compile_error ( ) . into ( ) ,
125
+ Ok ( x) => x,
126
+ } ;
123
127
124
128
let vars = statics
125
129
. into_iter ( )
@@ -434,7 +438,10 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream {
434
438
. into ( ) ;
435
439
}
436
440
437
- let ( statics, stmts) = extract_static_muts ( stmts) ;
441
+ let ( statics, stmts) = match extract_static_muts ( stmts) {
442
+ Err ( e) => return e. to_compile_error ( ) . into ( ) ,
443
+ Ok ( x) => x,
444
+ } ;
438
445
439
446
let vars = statics
440
447
. into_iter ( )
@@ -588,7 +595,10 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
588
595
. into ( ) ;
589
596
}
590
597
591
- let ( statics, stmts) = extract_static_muts ( stmts) ;
598
+ let ( statics, stmts) = match extract_static_muts ( stmts) {
599
+ Err ( e) => return e. to_compile_error ( ) . into ( ) ,
600
+ Ok ( x) => x,
601
+ } ;
592
602
593
603
let vars = statics
594
604
. into_iter ( )
@@ -732,15 +742,24 @@ fn random_ident() -> Ident {
732
742
}
733
743
734
744
/// Extracts `static mut` vars from the beginning of the given statements
735
- fn extract_static_muts ( stmts : Vec < Stmt > ) -> ( Vec < ItemStatic > , Vec < Stmt > ) {
745
+ fn extract_static_muts ( stmts : Vec < Stmt > ) -> Result < ( Vec < ItemStatic > , Vec < Stmt > ) , parse :: Error > {
736
746
let mut istmts = stmts. into_iter ( ) ;
737
747
748
+ let mut seen = HashSet :: new ( ) ;
738
749
let mut statics = vec ! [ ] ;
739
750
let mut stmts = vec ! [ ] ;
740
751
while let Some ( stmt) = istmts. next ( ) {
741
752
match stmt {
742
753
Stmt :: Item ( Item :: Static ( var) ) => {
743
754
if var. mutability . is_some ( ) {
755
+ if seen. contains ( & var. ident ) {
756
+ return Err ( parse:: Error :: new (
757
+ var. ident . span ( ) ,
758
+ format ! ( "the name `{}` is defined multiple times" , var. ident) ,
759
+ ) ) ;
760
+ }
761
+
762
+ seen. insert ( var. ident . clone ( ) ) ;
744
763
statics. push ( var) ;
745
764
} else {
746
765
stmts. push ( Stmt :: Item ( Item :: Static ( var) ) ) ;
@@ -755,5 +774,5 @@ fn extract_static_muts(stmts: Vec<Stmt>) -> (Vec<ItemStatic>, Vec<Stmt>) {
755
774
756
775
stmts. extend ( istmts) ;
757
776
758
- ( statics, stmts)
777
+ Ok ( ( statics, stmts) )
759
778
}
0 commit comments