about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2021-02-17 20:38:00 +0100
committerGitHub <noreply@github.com>2021-02-17 20:38:00 +0100
commit16481a285733f004ab9c5573c1e7fd5b602b3ddd (patch)
tree9e71eb79ade91c6e7633b163b389450246a830fd
parent13730e90bde2e55efa31b127e2175d5e90772044 (diff)
parent15197cbc61450bd19328387ad9a04500e35d7086 (diff)
downloadrust-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.rs3
-rw-r--r--src/test/ui/macros/assert-format-lazy.rs12
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"));
+}