mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 22:34:05 +00:00
Implement boolean lit support in cfg predicates
This commit is contained in:
parent
57b9b1f974
commit
c99f29b29f
@ -527,6 +527,16 @@ impl NestedMetaItem {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the `MetaItem` if `self` is a `NestedMetaItem::MetaItem` or if it's
|
||||
/// `NestedMetaItem::Lit(MetaItemLit { kind: LitKind::Bool(_), .. })`.
|
||||
pub fn meta_item_or_bool(&self) -> Option<&NestedMetaItem> {
|
||||
match self {
|
||||
NestedMetaItem::MetaItem(_item) => Some(self),
|
||||
NestedMetaItem::Lit(MetaItemLit { kind: LitKind::Bool(_), .. }) => Some(self),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the `MetaItem` if `self` is a `NestedMetaItem::MetaItem`.
|
||||
pub fn meta_item(&self) -> Option<&MetaItem> {
|
||||
match self {
|
||||
|
@ -603,6 +603,7 @@ pub fn eval_condition(
|
||||
|
||||
let cfg = match cfg {
|
||||
ast::NestedMetaItem::MetaItem(meta_item) => meta_item,
|
||||
ast::NestedMetaItem::Lit(MetaItemLit { kind: LitKind::Bool(b), .. }) => return *b,
|
||||
_ => {
|
||||
dcx.emit_err(session_diagnostics::UnsupportedLiteral {
|
||||
span: cfg.span(),
|
||||
@ -649,7 +650,7 @@ pub fn eval_condition(
|
||||
}
|
||||
ast::MetaItemKind::List(mis) => {
|
||||
for mi in mis.iter() {
|
||||
if !mi.is_meta_item() {
|
||||
if mi.meta_item_or_bool().is_none() {
|
||||
dcx.emit_err(session_diagnostics::UnsupportedLiteral {
|
||||
span: mi.span(),
|
||||
reason: UnsupportedLiteralReason::Generic,
|
||||
|
@ -466,9 +466,9 @@ pub fn parse_cfg<'a>(meta_item: &'a MetaItem, sess: &Session) -> Option<&'a Nest
|
||||
sess.dcx().emit_err(InvalidCfg::MultiplePredicates { span: l.span() });
|
||||
None
|
||||
}
|
||||
Some([single]) => match single.is_meta_item() {
|
||||
true => Some(single),
|
||||
false => {
|
||||
Some([single]) => match single.meta_item_or_bool() {
|
||||
Some(meta_item) => Some(meta_item),
|
||||
None => {
|
||||
sess.dcx().emit_err(InvalidCfg::PredicateLiteral { span: single.span() });
|
||||
None
|
||||
}
|
||||
|
@ -309,7 +309,7 @@ impl<'tcx> Collector<'tcx> {
|
||||
.emit_err(errors::LinkCfgSinglePredicate { span: item.span() });
|
||||
continue;
|
||||
};
|
||||
if !link_cfg.is_meta_item() {
|
||||
let Some(link_cfg) = link_cfg.meta_item_or_bool() else {
|
||||
sess.dcx()
|
||||
.emit_err(errors::LinkCfgSinglePredicate { span: item.span() });
|
||||
continue;
|
||||
|
@ -413,7 +413,9 @@ impl<'tcx> OnUnimplementedDirective {
|
||||
} else {
|
||||
let cond = item_iter
|
||||
.next()
|
||||
.ok_or_else(|| tcx.dcx().emit_err(EmptyOnClauseInOnUnimplemented { span }))?;
|
||||
.ok_or_else(|| tcx.dcx().emit_err(EmptyOnClauseInOnUnimplemented { span }))?
|
||||
.meta_item_or_bool()
|
||||
.ok_or_else(|| tcx.dcx().emit_err(InvalidOnClauseInOnUnimplemented { span }))?;
|
||||
attr::eval_condition(cond, &tcx.sess, Some(tcx.features()), &mut |cfg| {
|
||||
if let Some(value) = cfg.value
|
||||
&& let Err(guar) = parse_value(value, cfg.span)
|
||||
|
29
tests/ui/cfg/true-false.rs
Normal file
29
tests/ui/cfg/true-false.rs
Normal file
@ -0,0 +1,29 @@
|
||||
//@ run-pass
|
||||
|
||||
#![feature(link_cfg)]
|
||||
|
||||
#[cfg(true)]
|
||||
fn foo() -> bool {
|
||||
cfg!(true)
|
||||
}
|
||||
|
||||
#[cfg(false)]
|
||||
fn foo() -> bool {
|
||||
cfg!(false)
|
||||
}
|
||||
|
||||
#[cfg_attr(true, cfg(false))]
|
||||
fn foo() {}
|
||||
|
||||
#[link(name = "foo", cfg(false))]
|
||||
extern "C" {}
|
||||
|
||||
fn main() {
|
||||
assert!(foo());
|
||||
assert!(cfg!(true));
|
||||
assert!(!cfg!(false));
|
||||
assert!(cfg!(not(false)));
|
||||
assert!(cfg!(all(true)));
|
||||
assert!(cfg!(any(true)));
|
||||
assert!(!cfg!(not(true)));
|
||||
}
|
Loading…
Reference in New Issue
Block a user