mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Add new const_format_args!() macro and use it in panics.
This commit is contained in:
parent
76cf1b8bd0
commit
b64c4f9560
@ -72,6 +72,7 @@ pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) {
|
|||||||
file: source_util::expand_file,
|
file: source_util::expand_file,
|
||||||
format_args_nl: format::expand_format_args_nl,
|
format_args_nl: format::expand_format_args_nl,
|
||||||
format_args: format::expand_format_args,
|
format_args: format::expand_format_args,
|
||||||
|
const_format_args: format::expand_format_args,
|
||||||
global_asm: asm::expand_global_asm,
|
global_asm: asm::expand_global_asm,
|
||||||
include_bytes: source_util::expand_include_bytes,
|
include_bytes: source_util::expand_include_bytes,
|
||||||
include_str: source_util::expand_include_str,
|
include_str: source_util::expand_include_str,
|
||||||
|
@ -410,6 +410,7 @@ symbols! {
|
|||||||
const_fn_transmute,
|
const_fn_transmute,
|
||||||
const_fn_union,
|
const_fn_union,
|
||||||
const_fn_unsize,
|
const_fn_unsize,
|
||||||
|
const_format_args,
|
||||||
const_generic_defaults,
|
const_generic_defaults,
|
||||||
const_generics,
|
const_generics,
|
||||||
const_generics_defaults,
|
const_generics_defaults,
|
||||||
|
@ -337,6 +337,7 @@ impl<'a> Arguments<'a> {
|
|||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
|
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
|
||||||
|
#[rustc_const_unstable(feature = "const_fmt_arguments_new", issue = "none")]
|
||||||
pub const fn new_v1(pieces: &'a [&'static str], args: &'a [ArgumentV1<'a>]) -> Arguments<'a> {
|
pub const fn new_v1(pieces: &'a [&'static str], args: &'a [ArgumentV1<'a>]) -> Arguments<'a> {
|
||||||
Arguments { pieces, fmt: None, args }
|
Arguments { pieces, fmt: None, args }
|
||||||
}
|
}
|
||||||
@ -350,6 +351,7 @@ impl<'a> Arguments<'a> {
|
|||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
|
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
|
||||||
|
#[rustc_const_unstable(feature = "const_fmt_arguments_new", issue = "none")]
|
||||||
pub const fn new_v1_formatted(
|
pub const fn new_v1_formatted(
|
||||||
pieces: &'a [&'static str],
|
pieces: &'a [&'static str],
|
||||||
args: &'a [ArgumentV1<'a>],
|
args: &'a [ArgumentV1<'a>],
|
||||||
|
@ -837,6 +837,16 @@ pub(crate) mod builtin {
|
|||||||
($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }};
|
($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Same as `format_args`, but can be used in some const contexts.
|
||||||
|
#[unstable(feature = "const_format_args", issue = "none")]
|
||||||
|
#[allow_internal_unstable(fmt_internals, const_fmt_arguments_new)]
|
||||||
|
#[rustc_builtin_macro]
|
||||||
|
#[macro_export]
|
||||||
|
macro_rules! const_format_args {
|
||||||
|
($fmt:expr) => {{ /* compiler built-in */ }};
|
||||||
|
($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }};
|
||||||
|
}
|
||||||
|
|
||||||
/// Same as `format_args`, but adds a newline in the end.
|
/// Same as `format_args`, but adds a newline in the end.
|
||||||
#[unstable(
|
#[unstable(
|
||||||
feature = "format_args_nl",
|
feature = "format_args_nl",
|
||||||
|
@ -7,7 +7,7 @@ use crate::fmt;
|
|||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
|
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
|
||||||
#[allow_internal_unstable(core_panic)]
|
#[allow_internal_unstable(core_panic, const_format_args)]
|
||||||
#[rustc_diagnostic_item = "core_panic_2015_macro"]
|
#[rustc_diagnostic_item = "core_panic_2015_macro"]
|
||||||
#[rustc_macro_transparency = "semitransparent"]
|
#[rustc_macro_transparency = "semitransparent"]
|
||||||
pub macro panic_2015 {
|
pub macro panic_2015 {
|
||||||
@ -21,13 +21,13 @@ pub macro panic_2015 {
|
|||||||
$crate::panicking::panic_str($msg)
|
$crate::panicking::panic_str($msg)
|
||||||
),
|
),
|
||||||
($fmt:expr, $($arg:tt)+) => (
|
($fmt:expr, $($arg:tt)+) => (
|
||||||
$crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+))
|
$crate::panicking::panic_fmt($crate::const_format_args!($fmt, $($arg)+))
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
|
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
|
||||||
#[allow_internal_unstable(core_panic)]
|
#[allow_internal_unstable(core_panic, const_format_args)]
|
||||||
#[rustc_diagnostic_item = "core_panic_2021_macro"]
|
#[rustc_diagnostic_item = "core_panic_2021_macro"]
|
||||||
#[rustc_macro_transparency = "semitransparent"]
|
#[rustc_macro_transparency = "semitransparent"]
|
||||||
pub macro panic_2021 {
|
pub macro panic_2021 {
|
||||||
@ -35,7 +35,7 @@ pub macro panic_2021 {
|
|||||||
$crate::panicking::panic("explicit panic")
|
$crate::panicking::panic("explicit panic")
|
||||||
),
|
),
|
||||||
($($t:tt)+) => (
|
($($t:tt)+) => (
|
||||||
$crate::panicking::panic_fmt($crate::format_args!($($t)+))
|
$crate::panicking::panic_fmt($crate::const_format_args!($($t)+))
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -247,6 +247,7 @@
|
|||||||
#![feature(const_fn_floating_point_arithmetic)]
|
#![feature(const_fn_floating_point_arithmetic)]
|
||||||
#![feature(const_fn_fn_ptr_basics)]
|
#![feature(const_fn_fn_ptr_basics)]
|
||||||
#![cfg_attr(bootstrap, feature(const_fn_transmute))]
|
#![cfg_attr(bootstrap, feature(const_fn_transmute))]
|
||||||
|
#![feature(const_format_args)]
|
||||||
#![feature(const_io_structs)]
|
#![feature(const_io_structs)]
|
||||||
#![feature(const_ip)]
|
#![feature(const_ip)]
|
||||||
#![feature(const_ipv4)]
|
#![feature(const_ipv4)]
|
||||||
@ -556,9 +557,9 @@ pub use core::{
|
|||||||
#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
|
#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
|
||||||
#[allow(deprecated)]
|
#[allow(deprecated)]
|
||||||
pub use core::{
|
pub use core::{
|
||||||
assert, assert_matches, cfg, column, compile_error, concat, concat_idents, env, file,
|
assert, assert_matches, cfg, column, compile_error, concat, concat_idents, const_format_args,
|
||||||
format_args, format_args_nl, include, include_bytes, include_str, line, llvm_asm, log_syntax,
|
env, file, format_args, format_args_nl, include, include_bytes, include_str, line, llvm_asm,
|
||||||
module_path, option_env, stringify, trace_macros,
|
log_syntax, module_path, option_env, stringify, trace_macros,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[stable(feature = "core_primitive", since = "1.43.0")]
|
#[stable(feature = "core_primitive", since = "1.43.0")]
|
||||||
|
@ -20,7 +20,7 @@ use crate::thread::Result;
|
|||||||
|
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
|
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
|
||||||
#[allow_internal_unstable(libstd_sys_internals)]
|
#[allow_internal_unstable(libstd_sys_internals, const_format_args)]
|
||||||
#[cfg_attr(not(test), rustc_diagnostic_item = "std_panic_2015_macro")]
|
#[cfg_attr(not(test), rustc_diagnostic_item = "std_panic_2015_macro")]
|
||||||
#[rustc_macro_transparency = "semitransparent"]
|
#[rustc_macro_transparency = "semitransparent"]
|
||||||
pub macro panic_2015 {
|
pub macro panic_2015 {
|
||||||
@ -31,7 +31,7 @@ pub macro panic_2015 {
|
|||||||
$crate::rt::begin_panic($msg)
|
$crate::rt::begin_panic($msg)
|
||||||
}),
|
}),
|
||||||
($fmt:expr, $($arg:tt)+) => ({
|
($fmt:expr, $($arg:tt)+) => ({
|
||||||
$crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+))
|
$crate::rt::begin_panic_fmt(&$crate::const_format_args!($fmt, $($arg)+))
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ struct Value;
|
|||||||
|
|
||||||
static settings_dir: String = format!("");
|
static settings_dir: String = format!("");
|
||||||
//~^ ERROR calls in statics are limited to constant functions
|
//~^ ERROR calls in statics are limited to constant functions
|
||||||
|
//~| ERROR is not yet stable as a const
|
||||||
|
|
||||||
fn from_string(_: String) -> Value {
|
fn from_string(_: String) -> Value {
|
||||||
Value
|
Value
|
||||||
|
@ -1,9 +1,18 @@
|
|||||||
error[E0507]: cannot move out of static item `settings_dir`
|
error[E0507]: cannot move out of static item `settings_dir`
|
||||||
--> $DIR/issue-64453.rs:13:37
|
--> $DIR/issue-64453.rs:14:37
|
||||||
|
|
|
|
||||||
LL | let settings_data = from_string(settings_dir);
|
LL | let settings_data = from_string(settings_dir);
|
||||||
| ^^^^^^^^^^^^ move occurs because `settings_dir` has type `String`, which does not implement the `Copy` trait
|
| ^^^^^^^^^^^^ move occurs because `settings_dir` has type `String`, which does not implement the `Copy` trait
|
||||||
|
|
||||||
|
error: `Arguments::<'a>::new_v1` is not yet stable as a const fn
|
||||||
|
--> $DIR/issue-64453.rs:4:31
|
||||||
|
|
|
||||||
|
LL | static settings_dir: String = format!("");
|
||||||
|
| ^^^^^^^^^^^
|
||||||
|
|
|
||||||
|
= help: add `#![feature(const_fmt_arguments_new)]` to the crate attributes to enable
|
||||||
|
= note: this error originates in the macro `$crate::__export::format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
|
||||||
--> $DIR/issue-64453.rs:4:31
|
--> $DIR/issue-64453.rs:4:31
|
||||||
|
|
|
|
||||||
@ -12,7 +21,7 @@ LL | static settings_dir: String = format!("");
|
|||||||
|
|
|
|
||||||
= note: this error originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info)
|
= note: this error originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
Some errors have detailed explanations: E0015, E0507.
|
Some errors have detailed explanations: E0015, E0507.
|
||||||
For more information about an error, try `rustc --explain E0015`.
|
For more information about an error, try `rustc --explain E0015`.
|
||||||
|
Loading…
Reference in New Issue
Block a user