@@ -18,7 +18,7 @@ use rustc_session::parse::feature_err;
1818use rustc_session:: { RustcVersion , Session } ;
1919use rustc_span:: Span ;
2020use rustc_span:: hygiene:: Transparency ;
21- use rustc_span:: symbol:: { Symbol , sym} ;
21+ use rustc_span:: symbol:: { Symbol , kw , sym} ;
2222
2323use crate :: fluent_generated;
2424use crate :: session_diagnostics:: { self , IncorrectReprFormatGenericCause } ;
@@ -36,6 +36,7 @@ pub fn is_builtin_attr(attr: &Attribute) -> bool {
3636pub ( crate ) enum UnsupportedLiteralReason {
3737 Generic ,
3838 CfgString ,
39+ CfgBoolean ,
3940 DeprecatedString ,
4041 DeprecatedKvPair ,
4142}
@@ -533,7 +534,7 @@ pub struct Condition {
533534
534535/// Tests if a cfg-pattern matches the cfg set
535536pub fn cfg_matches (
536- cfg : & ast:: MetaItem ,
537+ cfg : & ast:: NestedMetaItem ,
537538 sess : & Session ,
538539 lint_node_id : NodeId ,
539540 features : Option < & Features > ,
@@ -604,12 +605,43 @@ pub fn parse_version(s: Symbol) -> Option<RustcVersion> {
604605/// Evaluate a cfg-like condition (with `any` and `all`), using `eval` to
605606/// evaluate individual items.
606607pub fn eval_condition (
607- cfg : & ast:: MetaItem ,
608+ cfg : & ast:: NestedMetaItem ,
608609 sess : & Session ,
609610 features : Option < & Features > ,
610611 eval : & mut impl FnMut ( Condition ) -> bool ,
611612) -> bool {
612613 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+
613645 match & cfg. kind {
614646 ast:: MetaItemKind :: List ( mis) if cfg. name_or_empty ( ) == sym:: version => {
615647 try_gate_cfg ( sym:: version, cfg. span , sess, features) ;
@@ -645,7 +677,7 @@ pub fn eval_condition(
645677 }
646678 ast:: MetaItemKind :: List ( mis) => {
647679 for mi in mis. iter ( ) {
648- if ! mi. is_meta_item ( ) {
680+ if mi. meta_item_or_bool ( ) . is_none ( ) {
649681 dcx. emit_err ( session_diagnostics:: UnsupportedLiteral {
650682 span : mi. span ( ) ,
651683 reason : UnsupportedLiteralReason :: Generic ,
@@ -663,23 +695,19 @@ pub fn eval_condition(
663695 . iter ( )
664696 // We don't use any() here, because we want to evaluate all cfg condition
665697 // 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) ) ,
669699 sym:: all => mis
670700 . iter ( )
671701 // We don't use all() here, because we want to evaluate all cfg condition
672702 // 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) ) ,
676704 sym:: not => {
677705 let [ mi] = mis. as_slice ( ) else {
678706 dcx. emit_err ( session_diagnostics:: ExpectedOneCfgPattern { span : cfg. span } ) ;
679707 return false ;
680708 } ;
681709
682- !eval_condition ( mi. meta_item ( ) . unwrap ( ) , sess, features, eval)
710+ !eval_condition ( mi, sess, features, eval)
683711 }
684712 sym:: target => {
685713 if let Some ( features) = features
@@ -700,7 +728,12 @@ pub fn eval_condition(
700728 seg. ident . name = Symbol :: intern ( & format ! ( "target_{}" , seg. ident. name) ) ;
701729 }
702730
703- res & eval_condition ( & mi, sess, features, eval)
731+ res & eval_condition (
732+ & ast:: NestedMetaItem :: MetaItem ( mi) ,
733+ sess,
734+ features,
735+ eval,
736+ )
704737 } )
705738 }
706739 _ => {
0 commit comments