Skip to content

Commit b64c4f9

Browse files
committed
Add new const_format_args!() macro and use it in panics.
1 parent 76cf1b8 commit b64c4f9

File tree

9 files changed

+36
-11
lines changed

9 files changed

+36
-11
lines changed

compiler/rustc_builtin_macros/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) {
7272
file: source_util::expand_file,
7373
format_args_nl: format::expand_format_args_nl,
7474
format_args: format::expand_format_args,
75+
const_format_args: format::expand_format_args,
7576
global_asm: asm::expand_global_asm,
7677
include_bytes: source_util::expand_include_bytes,
7778
include_str: source_util::expand_include_str,

compiler/rustc_span/src/symbol.rs

+1
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ symbols! {
410410
const_fn_transmute,
411411
const_fn_union,
412412
const_fn_unsize,
413+
const_format_args,
413414
const_generic_defaults,
414415
const_generics,
415416
const_generics_defaults,

library/core/src/fmt/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ impl<'a> Arguments<'a> {
337337
#[doc(hidden)]
338338
#[inline]
339339
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
340+
#[rustc_const_unstable(feature = "const_fmt_arguments_new", issue = "none")]
340341
pub const fn new_v1(pieces: &'a [&'static str], args: &'a [ArgumentV1<'a>]) -> Arguments<'a> {
341342
Arguments { pieces, fmt: None, args }
342343
}
@@ -350,6 +351,7 @@ impl<'a> Arguments<'a> {
350351
#[doc(hidden)]
351352
#[inline]
352353
#[unstable(feature = "fmt_internals", reason = "internal to format_args!", issue = "none")]
354+
#[rustc_const_unstable(feature = "const_fmt_arguments_new", issue = "none")]
353355
pub const fn new_v1_formatted(
354356
pieces: &'a [&'static str],
355357
args: &'a [ArgumentV1<'a>],

library/core/src/macros/mod.rs

+10
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,16 @@ pub(crate) mod builtin {
837837
($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }};
838838
}
839839

840+
/// Same as `format_args`, but can be used in some const contexts.
841+
#[unstable(feature = "const_format_args", issue = "none")]
842+
#[allow_internal_unstable(fmt_internals, const_fmt_arguments_new)]
843+
#[rustc_builtin_macro]
844+
#[macro_export]
845+
macro_rules! const_format_args {
846+
($fmt:expr) => {{ /* compiler built-in */ }};
847+
($fmt:expr, $($args:tt)*) => {{ /* compiler built-in */ }};
848+
}
849+
840850
/// Same as `format_args`, but adds a newline in the end.
841851
#[unstable(
842852
feature = "format_args_nl",

library/core/src/panic.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::fmt;
77

88
#[doc(hidden)]
99
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
10-
#[allow_internal_unstable(core_panic)]
10+
#[allow_internal_unstable(core_panic, const_format_args)]
1111
#[rustc_diagnostic_item = "core_panic_2015_macro"]
1212
#[rustc_macro_transparency = "semitransparent"]
1313
pub macro panic_2015 {
@@ -21,21 +21,21 @@ pub macro panic_2015 {
2121
$crate::panicking::panic_str($msg)
2222
),
2323
($fmt:expr, $($arg:tt)+) => (
24-
$crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+))
24+
$crate::panicking::panic_fmt($crate::const_format_args!($fmt, $($arg)+))
2525
),
2626
}
2727

2828
#[doc(hidden)]
2929
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
30-
#[allow_internal_unstable(core_panic)]
30+
#[allow_internal_unstable(core_panic, const_format_args)]
3131
#[rustc_diagnostic_item = "core_panic_2021_macro"]
3232
#[rustc_macro_transparency = "semitransparent"]
3333
pub macro panic_2021 {
3434
() => (
3535
$crate::panicking::panic("explicit panic")
3636
),
3737
($($t:tt)+) => (
38-
$crate::panicking::panic_fmt($crate::format_args!($($t)+))
38+
$crate::panicking::panic_fmt($crate::const_format_args!($($t)+))
3939
),
4040
}
4141

library/std/src/lib.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@
247247
#![feature(const_fn_floating_point_arithmetic)]
248248
#![feature(const_fn_fn_ptr_basics)]
249249
#![cfg_attr(bootstrap, feature(const_fn_transmute))]
250+
#![feature(const_format_args)]
250251
#![feature(const_io_structs)]
251252
#![feature(const_ip)]
252253
#![feature(const_ipv4)]
@@ -556,9 +557,9 @@ pub use core::{
556557
#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
557558
#[allow(deprecated)]
558559
pub use core::{
559-
assert, assert_matches, cfg, column, compile_error, concat, concat_idents, env, file,
560-
format_args, format_args_nl, include, include_bytes, include_str, line, llvm_asm, log_syntax,
561-
module_path, option_env, stringify, trace_macros,
560+
assert, assert_matches, cfg, column, compile_error, concat, concat_idents, const_format_args,
561+
env, file, format_args, format_args_nl, include, include_bytes, include_str, line, llvm_asm,
562+
log_syntax, module_path, option_env, stringify, trace_macros,
562563
};
563564

564565
#[stable(feature = "core_primitive", since = "1.43.0")]

library/std/src/panic.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::thread::Result;
2020

2121
#[doc(hidden)]
2222
#[unstable(feature = "edition_panic", issue = "none", reason = "use panic!() instead")]
23-
#[allow_internal_unstable(libstd_sys_internals)]
23+
#[allow_internal_unstable(libstd_sys_internals, const_format_args)]
2424
#[cfg_attr(not(test), rustc_diagnostic_item = "std_panic_2015_macro")]
2525
#[rustc_macro_transparency = "semitransparent"]
2626
pub macro panic_2015 {
@@ -31,7 +31,7 @@ pub macro panic_2015 {
3131
$crate::rt::begin_panic($msg)
3232
}),
3333
($fmt:expr, $($arg:tt)+) => ({
34-
$crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+))
34+
$crate::rt::begin_panic_fmt(&$crate::const_format_args!($fmt, $($arg)+))
3535
}),
3636
}
3737

src/test/ui/borrowck/issue-64453.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ struct Value;
33

44
static settings_dir: String = format!("");
55
//~^ ERROR calls in statics are limited to constant functions
6+
//~| ERROR is not yet stable as a const
67

78
fn from_string(_: String) -> Value {
89
Value
+11-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
error[E0507]: cannot move out of static item `settings_dir`
2-
--> $DIR/issue-64453.rs:13:37
2+
--> $DIR/issue-64453.rs:14:37
33
|
44
LL | let settings_data = from_string(settings_dir);
55
| ^^^^^^^^^^^^ move occurs because `settings_dir` has type `String`, which does not implement the `Copy` trait
66

7+
error: `Arguments::<'a>::new_v1` is not yet stable as a const fn
8+
--> $DIR/issue-64453.rs:4:31
9+
|
10+
LL | static settings_dir: String = format!("");
11+
| ^^^^^^^^^^^
12+
|
13+
= help: add `#![feature(const_fmt_arguments_new)]` to the crate attributes to enable
14+
= note: this error originates in the macro `$crate::__export::format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
15+
716
error[E0015]: calls in statics are limited to constant functions, tuple structs and tuple variants
817
--> $DIR/issue-64453.rs:4:31
918
|
@@ -12,7 +21,7 @@ LL | static settings_dir: String = format!("");
1221
|
1322
= note: this error originates in the macro `format` (in Nightly builds, run with -Z macro-backtrace for more info)
1423

15-
error: aborting due to 2 previous errors
24+
error: aborting due to 3 previous errors
1625

1726
Some errors have detailed explanations: E0015, E0507.
1827
For more information about an error, try `rustc --explain E0015`.

0 commit comments

Comments
 (0)