about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTeddy Katz <teddy.katz@gmail.com>2021-02-15 21:06:00 -0500
committerTeddy Katz <teddy.katz@gmail.com>2021-02-16 00:55:46 -0500
commitcb653b100c43118beed5bbd84cd8b832362a355f (patch)
treef757f0999c3f9622ef81bf8a07a228d48fc810f5
parentd1206f950ffb76c76e1b74a19ae33c2b7d949454 (diff)
downloadrust-cb653b100c43118beed5bbd84cd8b832362a355f.tar.gz
rust-cb653b100c43118beed5bbd84cd8b832362a355f.zip
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.rs11
2 files changed, 13 insertions, 1 deletions
diff --git a/library/core/src/macros/mod.rs b/library/core/src/macros/mod.rs
index 7aaf5a5fd46..3b085b0459a 100644
--- a/library/core/src/macros/mod.rs
+++ b/library/core/src/macros/mod.rs
@@ -1208,7 +1208,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..e0e2bd5a970
--- /dev/null
+++ b/src/test/ui/macros/assert-format-lazy.rs
@@ -0,0 +1,11 @@
+// run-pass
+
+#[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"));
+}