@@ -105,6 +105,9 @@ pub struct AttributeTemplate {
105
105
pub word : bool ,
106
106
/// If `Some`, the attribute is allowed to take a list of items like `#[allow(..)]`.
107
107
pub list : Option < & ' static str > ,
108
+ /// If non-empty, the attribute is allowed to take a list containing exactly
109
+ /// one of the listed words, like `#[coverage(off)]`.
110
+ pub one_of : & ' static [ Symbol ] ,
108
111
/// If `Some`, the attribute is allowed to be a name/value pair where the
109
112
/// value is a string, like `#[must_use = "reason"]`.
110
113
pub name_value_str : Option < & ' static str > ,
@@ -165,19 +168,20 @@ pub enum AttributeDuplicates {
165
168
/// E.g., `template!(Word, List: "description")` means that the attribute
166
169
/// supports forms `#[attr]` and `#[attr(description)]`.
167
170
macro_rules! template {
168
- ( Word ) => { template!( @ true , None , None ) } ;
169
- ( List : $descr: expr) => { template!( @ false , Some ( $descr) , None ) } ;
170
- ( NameValueStr : $descr: expr) => { template!( @ false , None , Some ( $descr) ) } ;
171
- ( Word , List : $descr: expr) => { template!( @ true , Some ( $descr) , None ) } ;
172
- ( Word , NameValueStr : $descr: expr) => { template!( @ true , None , Some ( $descr) ) } ;
171
+ ( Word ) => { template!( @ true , None , & [ ] , None ) } ;
172
+ ( List : $descr: expr) => { template!( @ false , Some ( $descr) , & [ ] , None ) } ;
173
+ ( OneOf : $one_of: expr) => { template!( @ false , None , $one_of, None ) } ;
174
+ ( NameValueStr : $descr: expr) => { template!( @ false , None , & [ ] , Some ( $descr) ) } ;
175
+ ( Word , List : $descr: expr) => { template!( @ true , Some ( $descr) , & [ ] , None ) } ;
176
+ ( Word , NameValueStr : $descr: expr) => { template!( @ true , None , & [ ] , Some ( $descr) ) } ;
173
177
( List : $descr1: expr, NameValueStr : $descr2: expr) => {
174
- template!( @ false , Some ( $descr1) , Some ( $descr2) )
178
+ template!( @ false , Some ( $descr1) , & [ ] , Some ( $descr2) )
175
179
} ;
176
180
( Word , List : $descr1: expr, NameValueStr : $descr2: expr) => {
177
- template!( @ true , Some ( $descr1) , Some ( $descr2) )
181
+ template!( @ true , Some ( $descr1) , & [ ] , Some ( $descr2) )
178
182
} ;
179
- ( @ $word: expr, $list: expr, $name_value_str: expr) => { AttributeTemplate {
180
- word: $word, list: $list, name_value_str: $name_value_str
183
+ ( @ $word: expr, $list: expr, $one_of : expr , $ name_value_str: expr) => { AttributeTemplate {
184
+ word: $word, list: $list, one_of : $one_of , name_value_str: $name_value_str
181
185
} } ;
182
186
}
183
187
@@ -478,7 +482,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
478
482
EncodeCrossCrate :: No , experimental!( no_sanitize)
479
483
) ,
480
484
gated ! (
481
- coverage, Normal , template!( Word , List : "on|off" ) ,
485
+ coverage, Normal , template!( OneOf : & [ sym :: off , sym :: on ] ) ,
482
486
ErrorPreceding , EncodeCrossCrate :: No ,
483
487
coverage_attribute, experimental!( coverage)
484
488
) ,
0 commit comments