alloc
: make vec!
unavailable under no_global_oom_handling
The `vec!` macro has 3 rules, but two are not usable under `no_global_oom_handling` builds of the standard library (even with a zero size): ```rust let _ = vec![42]; // Error: requires `exchange_malloc` lang_item. let _ = vec![42; 0]; // Error: cannot find function `from_elem`. ``` Thus those two rules should not be available to begin with. The remaining one, with an empty matcher, is just a shorthand for `new()` and may not make as much sense to have alone, since the idea behind `vec!` is to enable `Vec`s to be defined with the same syntax as array expressions. Furthermore, the documentation can be confusing since it shows the other rules. Thus perhaps it is better and simpler to disable `vec!` entirely under `no_global_oom_handling` environments, and let users call `new()` instead: ```rust let _: Vec<i32> = vec![]; let _: Vec<i32> = Vec::new(); ``` Notwithstanding this, a `try_vec!` macro would be useful, such as the one introduced in https://github.com/rust-lang/rust/pull/95051. If the shorthand for `new()` is deemed worth keeping on its own, then it may be interesting to have a separate `vec!` macro with a single rule and different, simpler documentation. Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
parent
e7575f9670
commit
8cec88ba76
@ -34,7 +34,7 @@
|
|||||||
/// be mindful of side effects.
|
/// be mindful of side effects.
|
||||||
///
|
///
|
||||||
/// [`Vec`]: crate::vec::Vec
|
/// [`Vec`]: crate::vec::Vec
|
||||||
#[cfg(not(test))]
|
#[cfg(all(not(no_global_oom_handling), not(test)))]
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
#[rustc_diagnostic_item = "vec_macro"]
|
#[rustc_diagnostic_item = "vec_macro"]
|
||||||
@ -55,7 +55,7 @@ macro_rules! vec {
|
|||||||
// required for this macro definition, is not available. Instead use the
|
// required for this macro definition, is not available. Instead use the
|
||||||
// `slice::into_vec` function which is only available with cfg(test)
|
// `slice::into_vec` function which is only available with cfg(test)
|
||||||
// NB see the slice::hack module in slice.rs for more information
|
// NB see the slice::hack module in slice.rs for more information
|
||||||
#[cfg(test)]
|
#[cfg(all(not(no_global_oom_handling), test))]
|
||||||
macro_rules! vec {
|
macro_rules! vec {
|
||||||
() => (
|
() => (
|
||||||
$crate::vec::Vec::new()
|
$crate::vec::Vec::new()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user