@@ -150,7 +150,7 @@ pub fn entry(args: TokenStream, input: TokenStream) -> TokenStream {
150
150
} )
151
151
. collect :: < Vec < _ > > ( ) ;
152
152
153
- if let Err ( error) = check_attr_whitelist ( & f. attrs ) {
153
+ if let Err ( error) = check_attr_whitelist ( & f. attrs , WhiteListCaller :: Entry ) {
154
154
return error;
155
155
}
156
156
@@ -294,11 +294,10 @@ pub fn exception(args: TokenStream, input: TokenStream) -> TokenStream {
294
294
. into ( ) ;
295
295
}
296
296
297
- if let Err ( error) = check_attr_whitelist ( & f. attrs ) {
297
+ if let Err ( error) = check_attr_whitelist ( & f. attrs , WhiteListCaller :: Exception ) {
298
298
return error;
299
299
}
300
300
301
-
302
301
let fspan = f. span ( ) ;
303
302
let ident = f. sig . ident . clone ( ) ;
304
303
@@ -675,7 +674,7 @@ pub fn interrupt(args: TokenStream, input: TokenStream) -> TokenStream {
675
674
} )
676
675
. collect :: < Vec < _ > > ( ) ;
677
676
678
- if let Err ( error) = check_attr_whitelist ( & f. attrs ) {
677
+ if let Err ( error) = check_attr_whitelist ( & f. attrs , WhiteListCaller :: Interrupt ) {
679
678
return error;
680
679
}
681
680
@@ -757,6 +756,10 @@ pub fn pre_init(args: TokenStream, input: TokenStream) -> TokenStream {
757
756
. into ( ) ;
758
757
}
759
758
759
+ if let Err ( error) = check_attr_whitelist ( & f. attrs , WhiteListCaller :: PreInit ) {
760
+ return error;
761
+ }
762
+
760
763
// XXX should we blacklist other attributes?
761
764
let attrs = f. attrs ;
762
765
let ident = f. sig . ident ;
@@ -823,8 +826,24 @@ fn extract_cfgs(attrs: Vec<Attribute>) -> (Vec<Attribute>, Vec<Attribute>) {
823
826
( cfgs, not_cfgs)
824
827
}
825
828
826
- fn check_attr_whitelist ( attrs : & [ Attribute ] ) -> Result < ( ) , TokenStream > {
827
- let whitelist = & [ "doc" , "link_section" , "cfg" , "allow" , "warn" , "deny" , "forbid" , "cold" ] ;
829
+ enum WhiteListCaller {
830
+ Entry ,
831
+ Exception ,
832
+ Interrupt ,
833
+ PreInit ,
834
+ }
835
+
836
+ fn check_attr_whitelist ( attrs : & [ Attribute ] , caller : WhiteListCaller ) -> Result < ( ) , TokenStream > {
837
+ let whitelist = & [
838
+ "doc" ,
839
+ "link_section" ,
840
+ "cfg" ,
841
+ "allow" ,
842
+ "warn" ,
843
+ "deny" ,
844
+ "forbid" ,
845
+ "cold" ,
846
+ ] ;
828
847
let cortex_m_rt_blacklist = & [ "entry" , "exception" , "interrupt" , "pre_init" ] ;
829
848
830
849
' o: for attr in attrs {
@@ -836,27 +855,34 @@ fn check_attr_whitelist(attrs: &[Attribute]) -> Result<(), TokenStream> {
836
855
837
856
for val in cortex_m_rt_blacklist {
838
857
if eq ( & attr, & val) {
839
- return Err (
840
- parse:: Error :: new (
841
- attr. span ( ) ,
842
- "multiple cortex-m-rt attributes are not supported on the same function" ,
843
- )
858
+ let err_str = match caller {
859
+ WhiteListCaller :: Entry => {
860
+ & "this attribute is not allowed on a cortex-m-rt entry point"
861
+ }
862
+ WhiteListCaller :: Exception => {
863
+ & "this attribute is not allowed on an exception handler"
864
+ }
865
+ WhiteListCaller :: Interrupt => {
866
+ & "this attribute is not allowed on an interrupt handler"
867
+ }
868
+ WhiteListCaller :: PreInit => {
869
+ & "this attribute is not allowed on an interrupt handler"
870
+ }
871
+ } ;
872
+
873
+ return Err ( parse:: Error :: new ( attr. span ( ) , err_str)
844
874
. to_compile_error ( )
845
- . into ( ) ,
846
- ) ;
875
+ . into ( ) ) ;
847
876
}
848
877
}
849
878
850
- return Err (
851
- parse:: Error :: new (
852
- attr. span ( ) ,
853
- "this attribute is not allowed on a function controlled by cortex-m-rt" ,
854
- )
855
- . to_compile_error ( )
856
- . into ( ) ,
857
- ) ;
858
-
859
- } ;
879
+ return Err ( parse:: Error :: new (
880
+ attr. span ( ) ,
881
+ "this attribute is not allowed on a function controlled by cortex-m-rt" ,
882
+ )
883
+ . to_compile_error ( )
884
+ . into ( ) ) ;
885
+ }
860
886
861
887
Ok ( ( ) )
862
888
}
0 commit comments