about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorAndre Bogus <bogusandre@gmail.com>2019-05-28 19:10:39 +0200
committerAndre Bogus <bogusandre@gmail.com>2019-05-28 19:10:39 +0200
commit6bb6c001be34d0932a014df981ee18f165c43374 (patch)
tree566572ce7fe6ba14e58e5121c6c4ad5e0e36ef1a /src
parent7da118581c9dc839c8bf3fbb622bab9ce32bbf38 (diff)
downloadrust-6bb6c001be34d0932a014df981ee18f165c43374.tar.gz
rust-6bb6c001be34d0932a014df981ee18f165c43374.zip
implicit `Option`-returning doctests
This distinguishes `Option` and `Result`-returning doctests with
implicit `main` method, where the former tests must end with
`Some(())`.
Diffstat (limited to 'src')
-rw-r--r--src/doc/rustdoc/src/documentation-tests.md13
-rw-r--r--src/librustdoc/test.rs7
-rw-r--r--src/test/rustdoc/process-termination.rs12
3 files changed, 31 insertions, 1 deletions
diff --git a/src/doc/rustdoc/src/documentation-tests.md b/src/doc/rustdoc/src/documentation-tests.md
index c9acd3c307b..a896ce819ae 100644
--- a/src/doc/rustdoc/src/documentation-tests.md
+++ b/src/doc/rustdoc/src/documentation-tests.md
@@ -253,6 +253,19 @@ conversion, so type inference fails because the type is not unique. Please note
 that you must write the `(())` in one sequence without intermediate whitespace
 so that rustdoc understands you want an implicit `Result`-returning function.
 
+As of version 1.37.0, this simplification also works with `Option`s, which can
+be handy to test e.g. iterators or checked arithmetic, for example:
+
+```ignore
+/// ```
+/// let _ = &[].iter().next()?;
+///# Some(())
+/// ```
+```
+
+Note that the result must be a `Some(())` and this has to be written in one go.
+In this case disambiguating the result isn't required.
+
 ## Documenting macros
 
 Here’s an example of documenting a macro:
diff --git a/src/librustdoc/test.rs b/src/librustdoc/test.rs
index d76d4380755..1b6460f5251 100644
--- a/src/librustdoc/test.rs
+++ b/src/librustdoc/test.rs
@@ -499,8 +499,13 @@ pub fn make_test(s: &str,
         prog.push_str(everything_else);
     } else {
         let returns_result = everything_else.trim_end().ends_with("(())");
+        let returns_option = everything_else.trim_end().ends_with("Some(())");
         let (main_pre, main_post) = if returns_result {
-            ("fn main() { fn _inner() -> Result<(), impl core::fmt::Debug> {",
+            (if returns_option {
+                "fn main() { fn _inner() -> Option<()> {"
+            } else {
+                "fn main() { fn _inner() -> Result<(), impl core::fmt::Debug> {"
+            },
              "}\n_inner().unwrap() }")
         } else {
             ("fn main() {\n", "\n}")
diff --git a/src/test/rustdoc/process-termination.rs b/src/test/rustdoc/process-termination.rs
index 32258792b6e..31ae0143d47 100644
--- a/src/test/rustdoc/process-termination.rs
+++ b/src/test/rustdoc/process-termination.rs
@@ -21,4 +21,16 @@
 /// Err("This is returned from `main`, leading to panic")?;
 /// Ok::<(), &'static str>(())
 /// ```
+///
+/// This also works with `Option<()>`s now:
+///
+/// ```rust
+/// Some(())
+/// ```
+///
+/// ```rust,should_panic
+/// let x: &[u32] = &[];
+/// let _ = x.iter().next()?;
+/// Some(())
+/// ```
 pub fn check_process_termination() {}