diff options
| author | Guillaume Gomez <guillaume1.gomez@gmail.com> | 2021-02-17 20:38:00 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-17 20:38:00 +0100 |
| commit | 16481a285733f004ab9c5573c1e7fd5b602b3ddd (patch) | |
| tree | 9e71eb79ade91c6e7633b163b389450246a830fd | |
| parent | 13730e90bde2e55efa31b127e2175d5e90772044 (diff) | |
| parent | 15197cbc61450bd19328387ad9a04500e35d7086 (diff) | |
| download | rust-16481a285733f004ab9c5573c1e7fd5b602b3ddd.tar.gz rust-16481a285733f004ab9c5573c1e7fd5b602b3ddd.zip | |
Rollup merge of #82169 - not-an-aardvark:assert-lazy-format-expressions, r=sfackler
Document that `assert!` format arguments are evaluated lazily
It can be useful to do some computation in `assert!` format arguments, in order to get better error messages. For example:
```rust
assert!(
some_condition,
"The state is invalid. Details: {}",
expensive_call_to_get_debugging_info(),
);
```
It seems like `assert!` only evaluates the format arguments if the assertion fails, which is useful but doesn't appear to be documented anywhere. This PR documents the behavior and adds some tests.
| -rw-r--r-- | library/core/src/macros/mod.rs | 3 | ||||
| -rw-r--r-- | src/test/ui/macros/assert-format-lazy.rs | 12 |
2 files changed, 14 insertions, 1 deletions
diff --git a/library/core/src/macros/mod.rs b/library/core/src/macros/mod.rs index b3802c1abde..97315769957 100644 --- a/library/core/src/macros/mod.rs +++ b/library/core/src/macros/mod.rs @@ -1209,7 +1209,8 @@ pub(crate) mod builtin { /// /// This macro has a second form, where a custom panic message can /// be provided with or without arguments for formatting. See [`std::fmt`] - /// for syntax for this form. + /// for syntax for this form. Expressions used as format arguments will only + /// be evaluated if the assertion fails. /// /// [`std::fmt`]: ../std/fmt/index.html /// diff --git a/src/test/ui/macros/assert-format-lazy.rs b/src/test/ui/macros/assert-format-lazy.rs new file mode 100644 index 00000000000..c7f05d763b7 --- /dev/null +++ b/src/test/ui/macros/assert-format-lazy.rs @@ -0,0 +1,12 @@ +// run-pass +// compile-flags: -C debug_assertions=yes + +#[allow(unreachable_code)] +fn main() { + assert!(true, "Failed: {:?}", panic!("assert! evaluated format expressions")); + debug_assert!(true, "Failed: {:?}", panic!("debug_assert! evaluated format expressions")); + assert_eq!(1, 1, "Failed: {:?}", panic!("assert_eq! evaluated format expressions")); + debug_assert_eq!(1, 1, "Failed: {:?}", panic!("debug_assert_eq! evaluated format expressions")); + assert_ne!(1, 2, "Failed: {:?}", panic!("assert_ne! evaluated format expressions")); + debug_assert_ne!(1, 2, "Failed: {:?}", panic!("debug_assert_ne! evaluated format expressions")); +} |
