@@ -18,7 +18,7 @@ use rustc_session::parse::feature_err;
18
18
use rustc_session:: { RustcVersion , Session } ;
19
19
use rustc_span:: Span ;
20
20
use rustc_span:: hygiene:: Transparency ;
21
- use rustc_span:: symbol:: { Symbol , sym} ;
21
+ use rustc_span:: symbol:: { Symbol , kw , sym} ;
22
22
23
23
use crate :: fluent_generated;
24
24
use crate :: session_diagnostics:: { self , IncorrectReprFormatGenericCause } ;
@@ -36,6 +36,7 @@ pub fn is_builtin_attr(attr: &Attribute) -> bool {
36
36
pub ( crate ) enum UnsupportedLiteralReason {
37
37
Generic ,
38
38
CfgString ,
39
+ CfgBoolean ,
39
40
DeprecatedString ,
40
41
DeprecatedKvPair ,
41
42
}
@@ -533,7 +534,7 @@ pub struct Condition {
533
534
534
535
/// Tests if a cfg-pattern matches the cfg set
535
536
pub fn cfg_matches (
536
- cfg : & ast:: MetaItem ,
537
+ cfg : & ast:: NestedMetaItem ,
537
538
sess : & Session ,
538
539
lint_node_id : NodeId ,
539
540
features : Option < & Features > ,
@@ -604,12 +605,43 @@ pub fn parse_version(s: Symbol) -> Option<RustcVersion> {
604
605
/// Evaluate a cfg-like condition (with `any` and `all`), using `eval` to
605
606
/// evaluate individual items.
606
607
pub fn eval_condition (
607
- cfg : & ast:: MetaItem ,
608
+ cfg : & ast:: NestedMetaItem ,
608
609
sess : & Session ,
609
610
features : Option < & Features > ,
610
611
eval : & mut impl FnMut ( Condition ) -> bool ,
611
612
) -> bool {
612
613
let dcx = sess. dcx ( ) ;
614
+
615
+ let cfg = match cfg {
616
+ ast:: NestedMetaItem :: MetaItem ( meta_item) => meta_item,
617
+ ast:: NestedMetaItem :: Lit ( MetaItemLit { kind : LitKind :: Bool ( b) , .. } ) => {
618
+ if let Some ( features) = features {
619
+ // we can't use `try_gate_cfg` as symbols don't differentiate between `r#true`
620
+ // and `true`, and we want to keep the former working without feature gate
621
+ gate_cfg (
622
+ & ( (
623
+ if * b { kw:: True } else { kw:: False } ,
624
+ sym:: cfg_boolean_literals,
625
+ |features : & Features | features. cfg_boolean_literals ,
626
+ ) ) ,
627
+ cfg. span ( ) ,
628
+ sess,
629
+ features,
630
+ ) ;
631
+ }
632
+ return * b;
633
+ }
634
+ _ => {
635
+ dcx. emit_err ( session_diagnostics:: UnsupportedLiteral {
636
+ span : cfg. span ( ) ,
637
+ reason : UnsupportedLiteralReason :: CfgBoolean ,
638
+ is_bytestr : false ,
639
+ start_point_span : sess. source_map ( ) . start_point ( cfg. span ( ) ) ,
640
+ } ) ;
641
+ return false ;
642
+ }
643
+ } ;
644
+
613
645
match & cfg. kind {
614
646
ast:: MetaItemKind :: List ( mis) if cfg. name_or_empty ( ) == sym:: version => {
615
647
try_gate_cfg ( sym:: version, cfg. span , sess, features) ;
@@ -645,7 +677,7 @@ pub fn eval_condition(
645
677
}
646
678
ast:: MetaItemKind :: List ( mis) => {
647
679
for mi in mis. iter ( ) {
648
- if ! mi. is_meta_item ( ) {
680
+ if mi. meta_item_or_bool ( ) . is_none ( ) {
649
681
dcx. emit_err ( session_diagnostics:: UnsupportedLiteral {
650
682
span : mi. span ( ) ,
651
683
reason : UnsupportedLiteralReason :: Generic ,
@@ -663,23 +695,19 @@ pub fn eval_condition(
663
695
. iter ( )
664
696
// We don't use any() here, because we want to evaluate all cfg condition
665
697
// as eval_condition can (and does) extra checks
666
- . fold ( false , |res, mi| {
667
- res | eval_condition ( mi. meta_item ( ) . unwrap ( ) , sess, features, eval)
668
- } ) ,
698
+ . fold ( false , |res, mi| res | eval_condition ( mi, sess, features, eval) ) ,
669
699
sym:: all => mis
670
700
. iter ( )
671
701
// We don't use all() here, because we want to evaluate all cfg condition
672
702
// as eval_condition can (and does) extra checks
673
- . fold ( true , |res, mi| {
674
- res & eval_condition ( mi. meta_item ( ) . unwrap ( ) , sess, features, eval)
675
- } ) ,
703
+ . fold ( true , |res, mi| res & eval_condition ( mi, sess, features, eval) ) ,
676
704
sym:: not => {
677
705
let [ mi] = mis. as_slice ( ) else {
678
706
dcx. emit_err ( session_diagnostics:: ExpectedOneCfgPattern { span : cfg. span } ) ;
679
707
return false ;
680
708
} ;
681
709
682
- !eval_condition ( mi. meta_item ( ) . unwrap ( ) , sess, features, eval)
710
+ !eval_condition ( mi, sess, features, eval)
683
711
}
684
712
sym:: target => {
685
713
if let Some ( features) = features
@@ -700,7 +728,12 @@ pub fn eval_condition(
700
728
seg. ident . name = Symbol :: intern ( & format ! ( "target_{}" , seg. ident. name) ) ;
701
729
}
702
730
703
- res & eval_condition ( & mi, sess, features, eval)
731
+ res & eval_condition (
732
+ & ast:: NestedMetaItem :: MetaItem ( mi) ,
733
+ sess,
734
+ features,
735
+ eval,
736
+ )
704
737
} )
705
738
}
706
739
_ => {
0 commit comments