Skip to content

Commit

Permalink
Adjust syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
c410-f3r authored and gitbot committed Feb 20, 2025
1 parent 7d7fce0 commit 6913a98
Show file tree
Hide file tree
Showing 4 changed files with 280 additions and 21 deletions.
52 changes: 52 additions & 0 deletions core/src/macros/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ pub macro assert_matches {
/// }
/// }
/// ```
#[cfg(bootstrap)]
#[unstable(feature = "cfg_match", issue = "115585")]
#[rustc_diagnostic_item = "cfg_match"]
pub macro cfg_match {
Expand Down Expand Up @@ -284,6 +285,57 @@ pub macro cfg_match {
}
}

/// A macro for defining `#[cfg]` match-like statements.
///
/// It is similar to the `if/elif` C preprocessor macro by allowing definition of a cascade of
/// `#[cfg]` cases, emitting the implementation which matches first.
///
/// This allows you to conveniently provide a long list `#[cfg]`'d blocks of code
/// without having to rewrite each clause multiple times.
///
/// Trailing `_` wildcard match arms are **optional** and they indicate a fallback branch when
/// all previous declarations do not evaluate to true.
///
/// # Example
///
/// ```
/// #![feature(cfg_match)]
///
/// cfg_match! {
/// unix => {
/// fn foo() { /* unix specific functionality */ }
/// }
/// target_pointer_width = "32" => {
/// fn foo() { /* non-unix, 32-bit functionality */ }
/// }
/// _ => {
/// fn foo() { /* fallback implementation */ }
/// }
/// }
/// ```
#[cfg(not(bootstrap))]
#[unstable(feature = "cfg_match", issue = "115585")]
#[rustc_diagnostic_item = "cfg_match"]
pub macro cfg_match {
({ $($tt:tt)* }) => {{
cfg_match! { $($tt)* }
}},
(_ => { $($output:tt)* }) => {
$($output)*
},
(
$cfg:meta => $output:tt
$($( $rest:tt )+)?
) => {
#[cfg($cfg)]
cfg_match! { _ => $output }
$(
#[cfg(not($cfg))]
cfg_match! { $($rest)+ }
)?
},
}

/// Asserts that a boolean expression is `true` at runtime.
///
/// This will invoke the [`panic!`] macro if the provided expression cannot be
Expand Down
3 changes: 3 additions & 0 deletions core/tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,10 @@ mod intrinsics;
mod io;
mod iter;
mod lazy;
#[cfg(not(bootstrap))]
mod macros;
#[cfg(bootstrap)]
mod macros_bootstrap;
mod manually_drop;
mod mem;
mod net;
Expand Down
53 changes: 32 additions & 21 deletions core/tests/macros.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ struct Struct;

impl Trait for Struct {
cfg_match! {
cfg(feature = "blah") => {
feature = "blah" => {
fn blah(&self) {
unimplemented!();
}
Expand Down Expand Up @@ -47,21 +47,21 @@ fn matches_leading_pipe() {
#[test]
fn cfg_match_basic() {
cfg_match! {
cfg(target_pointer_width = "64") => { fn f0_() -> bool { true }}
target_pointer_width = "64" => { fn f0_() -> bool { true }}
}

cfg_match! {
cfg(unix) => { fn f1_() -> bool { true }}
cfg(any(target_os = "macos", target_os = "linux")) => { fn f1_() -> bool { false }}
unix => { fn f1_() -> bool { true } }
any(target_os = "macos", target_os = "linux") => { fn f1_() -> bool { false }}
}

cfg_match! {
cfg(target_pointer_width = "32") => { fn f2_() -> bool { false }}
cfg(target_pointer_width = "64") => { fn f2_() -> bool { true }}
target_pointer_width = "32" => { fn f2_() -> bool { false } }
target_pointer_width = "64" => { fn f2_() -> bool { true } }
}

cfg_match! {
cfg(target_pointer_width = "16") => { fn f3_() -> i32 { 1 }}
target_pointer_width = "16" => { fn f3_() -> i32 { 1 } }
_ => { fn f3_() -> i32 { 2 }}
}

Expand All @@ -83,7 +83,7 @@ fn cfg_match_basic() {
#[test]
fn cfg_match_debug_assertions() {
cfg_match! {
cfg(debug_assertions) => {
debug_assertions => {
assert!(cfg!(debug_assertions));
assert_eq!(4, 2+2);
}
Expand All @@ -98,13 +98,13 @@ fn cfg_match_debug_assertions() {
#[test]
fn cfg_match_no_duplication_on_64() {
cfg_match! {
cfg(windows) => {
windows => {
fn foo() {}
}
cfg(unix) => {
unix => {
fn foo() {}
}
cfg(target_pointer_width = "64") => {
target_pointer_width = "64" => {
fn foo() {}
}
}
Expand All @@ -114,34 +114,34 @@ fn cfg_match_no_duplication_on_64() {
#[test]
fn cfg_match_options() {
cfg_match! {
cfg(test) => {
test => {
use core::option::Option as Option2;
fn works1() -> Option2<u32> { Some(1) }
}
_ => { fn works1() -> Option<u32> { None } }
}

cfg_match! {
cfg(feature = "foo") => { fn works2() -> bool { false } }
cfg(test) => { fn works2() -> bool { true } }
feature = "foo" => { fn works2() -> bool { false } }
test => { fn works2() -> bool { true } }
_ => { fn works2() -> bool { false } }
}

cfg_match! {
cfg(feature = "foo") => { fn works3() -> bool { false } }
feature = "foo" => { fn works3() -> bool { false } }
_ => { fn works3() -> bool { true } }
}

cfg_match! {
cfg(test) => {
test => {
use core::option::Option as Option3;
fn works4() -> Option3<u32> { Some(1) }
}
}

cfg_match! {
cfg(feature = "foo") => { fn works5() -> bool { false } }
cfg(test) => { fn works5() -> bool { true } }
feature = "foo" => { fn works5() -> bool { false } }
test => { fn works5() -> bool { true } }
}

assert!(works1().is_some());
Expand All @@ -154,7 +154,7 @@ fn cfg_match_options() {
#[test]
fn cfg_match_two_functions() {
cfg_match! {
cfg(target_pointer_width = "64") => {
target_pointer_width = "64" => {
fn foo1() {}
fn bar1() {}
}
Expand All @@ -178,7 +178,7 @@ fn cfg_match_two_functions() {

fn _accepts_expressions() -> i32 {
cfg_match! {
cfg(unix) => { 1 }
unix => { 1 }
_ => { 2 }
}
}
Expand All @@ -189,7 +189,18 @@ fn _allows_stmt_expr_attributes() {
let one = 1;
let two = 2;
cfg_match! {
cfg(unix) => { one * two; }
unix => { one * two; }
_ => { one + two; }
}
}

fn _expression() {
let _ = cfg_match!({
windows => {
" XP"
}
_ => {
""
}
});
}
Loading

0 comments on commit 6913a98

Please sign in to comment.