Skip to content

Commit c99f29b

Browse files
committed
Implement boolean lit support in cfg predicates
1 parent 57b9b1f commit c99f29b

6 files changed

Lines changed: 48 additions & 6 deletions

File tree

‎compiler/rustc_ast/src/attr/mod.rs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,16 @@ impl NestedMetaItem {
527527
}
528528
}
529529

530+
/// Returns the `MetaItem` if `self` is a `NestedMetaItem::MetaItem` or if it's
531+
/// `NestedMetaItem::Lit(MetaItemLit { kind: LitKind::Bool(_), .. })`.
532+
pubfnmeta_item_or_bool(&self) -> Option<&NestedMetaItem>{
533+
matchself{
534+
NestedMetaItem::MetaItem(_item) => Some(self),
535+
NestedMetaItem::Lit(MetaItemLit{kind:LitKind::Bool(_), .. }) => Some(self),
536+
_ => None,
537+
}
538+
}
539+
530540
/// Returns the `MetaItem` if `self` is a `NestedMetaItem::MetaItem`.
531541
pubfnmeta_item(&self) -> Option<&MetaItem>{
532542
matchself{

‎compiler/rustc_attr/src/builtin.rs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,7 @@ pub fn eval_condition(
603603

604604
let cfg = match cfg {
605605
ast::NestedMetaItem::MetaItem(meta_item) => meta_item,
606+
ast::NestedMetaItem::Lit(MetaItemLit{kind:LitKind::Bool(b), .. }) => return*b,
606607
_ => {
607608
dcx.emit_err(session_diagnostics::UnsupportedLiteral{
608609
span: cfg.span(),
@@ -649,7 +650,7 @@ pub fn eval_condition(
649650
}
650651
ast::MetaItemKind::List(mis) => {
651652
for mi in mis.iter(){
652-
if!mi.is_meta_item(){
653+
if mi.meta_item_or_bool().is_none(){
653654
dcx.emit_err(session_diagnostics::UnsupportedLiteral{
654655
span: mi.span(),
655656
reason:UnsupportedLiteralReason::Generic,

‎compiler/rustc_expand/src/config.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -466,9 +466,9 @@ pub fn parse_cfg<'a>(meta_item: &'a MetaItem, sess: &Session) -> Option<&'a Nest
466466
sess.dcx().emit_err(InvalidCfg::MultiplePredicates{span: l.span()});
467467
None
468468
}
469-
Some([single]) => match single.is_meta_item(){
470-
true => Some(single),
471-
false => {
469+
Some([single]) => match single.meta_item_or_bool(){
470+
Some(meta_item) => Some(meta_item),
471+
None => {
472472
sess.dcx().emit_err(InvalidCfg::PredicateLiteral{span: single.span()});
473473
None
474474
}

‎compiler/rustc_metadata/src/native_libs.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ impl<'tcx> Collector<'tcx> {
309309
.emit_err(errors::LinkCfgSinglePredicate{span: item.span()});
310310
continue;
311311
};
312-
if !link_cfg.is_meta_item(){
312+
letSome(link_cfg) = link_cfg.meta_item_or_bool()else{
313313
sess.dcx()
314314
.emit_err(errors::LinkCfgSinglePredicate{span: item.span()});
315315
continue;

‎compiler/rustc_trait_selection/src/error_reporting/traits/on_unimplemented.rs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,9 @@ impl<'tcx> OnUnimplementedDirective {
413413
}else{
414414
let cond = item_iter
415415
.next()
416-
.ok_or_else(|| tcx.dcx().emit_err(EmptyOnClauseInOnUnimplemented{ span }))?;
416+
.ok_or_else(|| tcx.dcx().emit_err(EmptyOnClauseInOnUnimplemented{ span }))?
417+
.meta_item_or_bool()
418+
.ok_or_else(|| tcx.dcx().emit_err(InvalidOnClauseInOnUnimplemented{ span }))?;
417419
attr::eval_condition(cond,&tcx.sess,Some(tcx.features()),&mut |cfg| {
418420
ifletSome(value) = cfg.value
419421
&& letErr(guar) = parse_value(value, cfg.span)

‎tests/ui/cfg/true-false.rs‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//@ run-pass
2+
3+
#![feature(link_cfg)]
4+
5+
#[cfg(true)]
6+
fnfoo() -> bool{
7+
cfg!(true)
8+
}
9+
10+
#[cfg(false)]
11+
fnfoo() -> bool{
12+
cfg!(false)
13+
}
14+
15+
#[cfg_attr(true, cfg(false))]
16+
fnfoo(){}
17+
18+
#[link(name = "foo", cfg(false))]
19+
extern"C"{}
20+
21+
fnmain(){
22+
assert!(foo());
23+
assert!(cfg!(true));
24+
assert!(!cfg!(false));
25+
assert!(cfg!(not(false)));
26+
assert!(cfg!(all(true)));
27+
assert!(cfg!(any(true)));
28+
assert!(!cfg!(not(true)));
29+
}

0 commit comments

Comments
 (0)