Files
rust/library/core/src
bors 1203e0866e Auto merge of #106824 - m-ou-se:format-args-flatten, r=oli-obk
Flatten/inline format_args!() and (string and int) literal arguments into format_args!()

Implements https://github.com/rust-lang/rust/issues/78356

Gated behind `-Zflatten-format-args=yes`.

Part of #99012

This change inlines string literals, integer literals and nested format_args!() into format_args!() during ast lowering, making all of the following pairs result in equivalent hir:

```rust
println!("Hello, {}!", "World");
println!("Hello, World!");
```

```rust
println!("[info] {}", format_args!("error"));
println!("[info] error");
```

```rust
println!("[{}] {}", status, format_args!("error: {}", msg));
println!("[{}] error: {}", status, msg);
```

```rust
println!("{} + {} = {}", 1, 2, 1 + 2);
println!("1 + 2 = {}", 1 + 2);
```

And so on.

This is useful for macros. E.g. a `log::info!()` macro could just pass the tokens from the user directly into a `format_args!()` that gets efficiently flattened/inlined into a `format_args!("info: {}")`.

It also means that `dbg!(x)` will have its file, line, and expression name inlined:

```rust
eprintln!("[{}:{}] {} = {:#?}", file!(), line!(), stringify!(x), x); // before
eprintln!("[example.rs:1] x = {:#?}", x); // after
```

Which can be nice in some cases, but also means a lot more unique static strings than before if dbg!() is used a lot.
2023-03-16 13:46:52 +00:00
..
2022-10-29 09:23:12 +02:00
2023-03-08 15:37:14 +01:00
2023-03-15 23:55:48 +05:30
2023-03-15 23:55:48 +05:30
2023-01-06 13:20:58 +01:00
2023-01-30 13:09:09 -05:00
2023-02-26 13:50:10 +01:00
2023-02-13 14:17:45 +08:00
2023-03-03 03:03:29 +01:00
2022-11-20 10:28:14 +01:00
2022-12-12 16:22:01 -07:00
2022-11-06 17:21:21 -05:00
2022-11-04 20:06:18 -07:00
2023-02-15 16:22:08 +00:00
2023-03-08 00:00:18 +00:00
2023-03-12 16:30:51 -07:00
2023-01-25 09:44:29 -05:00
2023-03-15 23:55:48 +05:30
2022-11-06 17:11:02 -05:00