1
Fork 0

Rollup merge of #115310 - RalfJung:panic-and-format, r=scottmcm

Document panic behavior across editions, and improve xrefs

This revives (parts of) https://github.com/rust-lang/rust/pull/96518.
r? `@scottmcm`
Cc `@ijackson`
This commit is contained in:
Matthias Krüger 2023-08-28 19:53:56 +02:00 committed by GitHub
commit 2eff0deca3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 7 deletions

View file

@ -79,10 +79,12 @@ macro_rules! vec {
/// ///
/// The first argument `format!` receives is a format string. This must be a string /// The first argument `format!` receives is a format string. This must be a string
/// literal. The power of the formatting string is in the `{}`s contained. /// literal. The power of the formatting string is in the `{}`s contained.
///
/// Additional parameters passed to `format!` replace the `{}`s within the /// Additional parameters passed to `format!` replace the `{}`s within the
/// formatting string in the order given unless named or positional parameters /// formatting string in the order given unless named or positional parameters
/// are used; see [`std::fmt`] for more information. /// are used.
///
/// See [the formatting syntax documentation in `std::fmt`](../std/fmt/index.html)
/// for details.
/// ///
/// A common use for `format!` is concatenation and interpolation of strings. /// A common use for `format!` is concatenation and interpolation of strings.
/// The same convention is used with [`print!`] and [`write!`] macros, /// The same convention is used with [`print!`] and [`write!`] macros,
@ -91,7 +93,6 @@ macro_rules! vec {
/// To convert a single value to a string, use the [`to_string`] method. This /// To convert a single value to a string, use the [`to_string`] method. This
/// will use the [`Display`] formatting trait. /// will use the [`Display`] formatting trait.
/// ///
/// [`std::fmt`]: ../std/fmt/index.html
/// [`print!`]: ../std/macro.print.html /// [`print!`]: ../std/macro.print.html
/// [`write!`]: core::write /// [`write!`]: core::write
/// [`to_string`]: crate::string::ToString /// [`to_string`]: crate::string::ToString

View file

@ -849,7 +849,8 @@ pub(crate) mod builtin {
/// assert_eq!(display, debug); /// assert_eq!(display, debug);
/// ``` /// ```
/// ///
/// For more information, see the documentation in [`std::fmt`]. /// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
/// for details of the macro argument syntax, and further information.
/// ///
/// [`Display`]: crate::fmt::Display /// [`Display`]: crate::fmt::Display
/// [`Debug`]: crate::fmt::Debug /// [`Debug`]: crate::fmt::Debug

View file

@ -8,8 +8,8 @@ tests. `panic!` is closely tied with the `unwrap` method of both
[`Option`][ounwrap] and [`Result`][runwrap] enums. Both implementations call [`Option`][ounwrap] and [`Result`][runwrap] enums. Both implementations call
`panic!` when they are set to [`None`] or [`Err`] variants. `panic!` when they are set to [`None`] or [`Err`] variants.
When using `panic!()` you can specify a string payload, that is built using When using `panic!()` you can specify a string payload that is built using
the [`format!`] syntax. That payload is used when injecting the panic into [formatting syntax]. That payload is used when injecting the panic into
the calling Rust thread, causing the thread to panic entirely. the calling Rust thread, causing the thread to panic entirely.
The behavior of the default `std` hook, i.e. the code that runs directly The behavior of the default `std` hook, i.e. the code that runs directly
@ -18,6 +18,7 @@ after the panic is invoked, is to print the message payload to
call. You can override the panic hook using [`std::panic::set_hook()`]. call. You can override the panic hook using [`std::panic::set_hook()`].
Inside the hook a panic can be accessed as a `&dyn Any + Send`, Inside the hook a panic can be accessed as a `&dyn Any + Send`,
which contains either a `&str` or `String` for regular `panic!()` invocations. which contains either a `&str` or `String` for regular `panic!()` invocations.
(Whether a particular invocation contains the payload at type `&str` or `String` is unspecified and can change.)
To panic with a value of another other type, [`panic_any`] can be used. To panic with a value of another other type, [`panic_any`] can be used.
See also the macro [`compile_error!`], for raising errors during compilation. See also the macro [`compile_error!`], for raising errors during compilation.
@ -55,7 +56,7 @@ For more detailed information about error handling check out the [book] or the
[`panic_any`]: ../std/panic/fn.panic_any.html [`panic_any`]: ../std/panic/fn.panic_any.html
[`Box`]: ../std/boxed/struct.Box.html [`Box`]: ../std/boxed/struct.Box.html
[`Any`]: crate::any::Any [`Any`]: crate::any::Any
[`format!`]: ../std/macro.format.html [`format!` syntax]: ../std/fmt/index.html
[book]: ../book/ch09-00-error-handling.html [book]: ../book/ch09-00-error-handling.html
[`std::result`]: ../std/result/index.html [`std::result`]: ../std/result/index.html
@ -64,6 +65,29 @@ For more detailed information about error handling check out the [book] or the
If the main thread panics it will terminate all your threads and end your If the main thread panics it will terminate all your threads and end your
program with code `101`. program with code `101`.
# Editions
Behavior of the panic macros changed over editions.
## 2021 and later
In Rust 2021 and later, `panic!` always requires a format string and
the applicable format arguments, and is the same in `core` and `std`.
Use [`std::panic::panic_any(x)`](../std/panic/fn.panic_any.html) to
panic with an arbitrary payload.
## 2018 and 2015
In Rust Editions prior to 2021, `std::panic!(x)` with a single
argument directly uses that argument as a payload.
This is true even if the argument is a string literal.
For example, `panic!("problem: {reason}")` panics with a
payload of literally `"problem: {reason}"` (a `&'static str`).
`core::panic!(x)` with a single argument requires that `x` be `&str`,
but otherwise behaves like `std::panic!`. In particular, the string
need not be a literal, and is not interpreted as a format string.
# Examples # Examples
```should_panic ```should_panic

View file

@ -41,6 +41,9 @@ macro_rules! panic {
/// Use `print!` only for the primary output of your program. Use /// Use `print!` only for the primary output of your program. Use
/// [`eprint!`] instead to print error and progress messages. /// [`eprint!`] instead to print error and progress messages.
/// ///
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
/// for details of the macro argument syntax.
///
/// [flush]: crate::io::Write::flush /// [flush]: crate::io::Write::flush
/// [`println!`]: crate::println /// [`println!`]: crate::println
/// [`eprint!`]: crate::eprint /// [`eprint!`]: crate::eprint
@ -103,6 +106,9 @@ macro_rules! print {
/// Use `println!` only for the primary output of your program. Use /// Use `println!` only for the primary output of your program. Use
/// [`eprintln!`] instead to print error and progress messages. /// [`eprintln!`] instead to print error and progress messages.
/// ///
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
/// for details of the macro argument syntax.
///
/// [`std::fmt`]: crate::fmt /// [`std::fmt`]: crate::fmt
/// [`eprintln!`]: crate::eprintln /// [`eprintln!`]: crate::eprintln
/// [lock]: crate::io::Stdout /// [lock]: crate::io::Stdout
@ -150,6 +156,9 @@ macro_rules! println {
/// [`io::stderr`]: crate::io::stderr /// [`io::stderr`]: crate::io::stderr
/// [`io::stdout`]: crate::io::stdout /// [`io::stdout`]: crate::io::stdout
/// ///
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
/// for details of the macro argument syntax.
///
/// # Panics /// # Panics
/// ///
/// Panics if writing to `io::stderr` fails. /// Panics if writing to `io::stderr` fails.
@ -181,6 +190,9 @@ macro_rules! eprint {
/// Use `eprintln!` only for error and progress messages. Use `println!` /// Use `eprintln!` only for error and progress messages. Use `println!`
/// instead for the primary output of your program. /// instead for the primary output of your program.
/// ///
/// See [the formatting documentation in `std::fmt`](../std/fmt/index.html)
/// for details of the macro argument syntax.
///
/// [`io::stderr`]: crate::io::stderr /// [`io::stderr`]: crate::io::stderr
/// [`io::stdout`]: crate::io::stdout /// [`io::stdout`]: crate::io::stdout
/// [`println!`]: crate::println /// [`println!`]: crate::println