Change:
In: https://crater- https://crater-
mean to ping instead
The macro was originally named to avoid this situation (). I don't know if it is possible to solve this issue in the compiler so I will just revert the changes.
cc maybe you have ideas
This may just be acceptable breakage - I don't know that we need to revert things. I would wait on libs-api weighing in, impact is pretty minimal in crater.
the problem is that this adds it to the prelude. maybe there's a way to add it somewhere where it doesn't get to the prelude? for example by making it a macro 2.0.
Looks like a good short-term solution. Preferably, it would be nice to have prelude support with a different name or an acceptable breakage.
FWIW, I can take care of fixing too, if that makes things simpler. I don't know about the eponymous crate, however. The funny thing is that I am working around the current issue by renaming as , so if this were to become the decision here please let me know so that I pick some third name

Discussion:
pub use crate::macros::{assert_matches, debug_assert_matches}; } <ins> #[unstable(feature = "cfg_match", issue = "115585")] pub use crate::macros::cfg_match; </ins> #[macro_use] mod internal_macros;

}, } <ins> /// 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! { ///     cfg(unix) => { ///         fn foo() { /* unix specific functionality */ } ///     } ///     cfg(target_pointer_width = "32") => { ///         fn foo() { /* non-unix, 32-bit functionality */ } ///     } ///     _ => { ///         fn foo() { /* fallback implementation */ } ///     } /// } /// ``` #[unstable(feature = "cfg_match", issue = "115585")] #[rustc_diagnostic_item = "cfg_match"] pub macro cfg_match { // with a final wildcard ( $(cfg($initial_meta:meta) => { $($initial_tokens:item)* })+ _ => { $($extra_tokens:item)* } ) => { cfg_match! { @__items (); $((($initial_meta) ($($initial_tokens)*)),)+ (() ($($extra_tokens)*)), } }, // without a final wildcard ( $(cfg($extra_meta:meta) => { $($extra_tokens:item)* })* ) => { cfg_match! { @__items (); $((($extra_meta) ($($extra_tokens)*)),)* } }, // Internal and recursive macro to emit all the items // // Collects all the previous cfgs in a list at the beginning, so they can be // negated. After the semicolon is all the remaining items. (@__items ($($_:meta,)*);) => {}, ( @__items ($($no:meta,)*); (($($yes:meta)?) ($($tokens:item)*)), $($rest:tt,)* ) => { // Emit all items within one block, applying an appropriate #[cfg]. The // #[cfg] will require all `$yes` matchers specified and must also negate // all previous matchers. #[cfg(all( $($yes,)? not(any($($no),*)) ))] cfg_match! { @__identity $($tokens)* } // Recurse to emit all other items in `$rest`, and when we do so add all // our `$yes` matchers to the list of `$no` matchers as future emissions // will have to negate everything we just matched as well. cfg_match! { @__items ($($no,)* $($yes,)?); $($rest,)* } }, // Internal macro to make __apply work out right for different match types, // because of how macros match/expand stuff. (@__identity $($tokens:item)*) => { $($tokens)* } } </ins> /// Asserts that a boolean expression is `true` at runtime. /// /// This will invoke the [`panic!`] macro if the provided expression cannot be

} } <del> /// 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! { ///     cfg(unix) => { ///         fn foo() { /* unix specific functionality */ } ///     } ///     cfg(target_pointer_width = "32") => { ///         fn foo() { /* non-unix, 32-bit functionality */ } ///     } ///     _ => { ///         fn foo() { /* fallback implementation */ } ///     } /// } /// ``` #[macro_export] #[unstable(feature = "cfg_match", issue = "115585")] #[rustc_diagnostic_item = "cfg_match"] macro_rules! cfg_match { // with a final wildcard ( $(cfg($initial_meta:meta) => { $($initial_tokens:item)* })+ _ => { $($extra_tokens:item)* } ) => { cfg_match! { @__items (); $((($initial_meta) ($($initial_tokens)*)),)+ (() ($($extra_tokens)*)), } }; // without a final wildcard ( $(cfg($extra_meta:meta) => { $($extra_tokens:item)* })* ) => { cfg_match! { @__items (); $((($extra_meta) ($($extra_tokens)*)),)* } }; // Internal and recursive macro to emit all the items // // Collects all the previous cfgs in a list at the beginning, so they can be // negated. After the semicolon is all the remaining items. (@__items ($($_:meta,)*);) => {}; ( @__items ($($no:meta,)*); (($($yes:meta)?) ($($tokens:item)*)), $($rest:tt,)* ) => { // Emit all items within one block, applying an appropriate #[cfg]. The // #[cfg] will require all `$yes` matchers specified and must also negate // all previous matchers. #[cfg(all( $($yes,)? not(any($($no),*)) ))] cfg_match! { @__identity $($tokens)* } // Recurse to emit all other items in `$rest`, and when we do so add all // our `$yes` matchers to the list of `$no` matchers as future emissions // will have to negate everything we just matched as well. cfg_match! { @__items ($($no,)* $($yes,)?); $($rest,)* } }; // Internal macro to make __apply work out right for different match types, // because of how macros match/expand stuff. (@__identity $($tokens:item)*) => { $($tokens)* }; } </del> /// Returns whether the given expression matches any of the given patterns. /// /// Like in a `match` expression, the pattern can be optionally followed by `if`