|  | $DIR/auxiliary/doctest_crate.rs: | 
|  | LL|       |/// A function run only from within doctests | 
|  | LL|      3|pub fn fn_run_in_doctests(conditional: usize) { | 
|  | LL|      3|    match conditional { | 
|  | LL|      1|        1 => assert_eq!(1, 1), // this is run, | 
|  | LL|      1|        2 => assert_eq!(1, 1), // this, | 
|  | LL|      1|        3 => assert_eq!(1, 1), // and this too | 
|  | LL|      0|        _ => assert_eq!(1, 2), // however this is not | 
|  | LL|       |    } | 
|  | LL|      3|} | 
|  |  | 
|  | $DIR/doctest.rs: | 
|  | LL|       |//@ aux-build:doctest_crate.rs | 
|  | LL|       | | 
|  | LL|       |//! This test ensures that code from doctests is properly re-mapped. | 
|  | LL|       |//! See <https://github.com/rust-lang/rust/issues/79417> for more info. | 
|  | LL|       |//! | 
|  | LL|       |//! Just some random code: | 
|  | LL|      1|//! ``` | 
|  | LL|      1|//! if true { | 
|  | LL|       |//!     // this is executed! | 
|  | LL|      1|//!     assert_eq!(1, 1); | 
|  | LL|       |//! } else { | 
|  | LL|       |//!     // this is not! | 
|  | LL|      0|//!     assert_eq!(1, 2); | 
|  | LL|       |//! } | 
|  | LL|      1|//! ``` | 
|  | LL|       |//! | 
|  | LL|       |//! doctest testing external code: | 
|  | LL|       |//! ``` | 
|  | LL|      1|//! extern crate doctest_crate; | 
|  | LL|      1|//! doctest_crate::fn_run_in_doctests(1); | 
|  | LL|      1|//! ``` | 
|  | LL|       |//! | 
|  | LL|       |//! doctest returning a result: | 
|  | LL|      1|//! ``` | 
|  | LL|       |//! #[derive(Debug, PartialEq)] | 
|  | LL|       |//! struct SomeError { | 
|  | LL|       |//!     msg: String, | 
|  | LL|       |//! } | 
|  | LL|      1|//! let mut res = Err(SomeError { msg: String::from("a message") }); | 
|  | LL|      1|//! if res.is_ok() { | 
|  | LL|      0|//!     res?; | 
|  | LL|       |//! } else { | 
|  | LL|      1|//!     if *res.as_ref().unwrap_err() == *res.as_ref().unwrap_err() { | 
|  | LL|      1|//!         println!("{:?}", res); | 
|  | LL|      1|//!     } | 
|  | ^0 | 
|  | LL|      1|//!     if *res.as_ref().unwrap_err() == *res.as_ref().unwrap_err() { | 
|  | LL|      1|//!         res = Ok(1); | 
|  | LL|      1|//!     } | 
|  | ^0 | 
|  | LL|      1|//!     res = Ok(0); | 
|  | LL|       |//! } | 
|  | LL|       |//! // need to be explicit because rustdoc cant infer the return type | 
|  | LL|      1|//! Ok::<(), SomeError>(()) | 
|  | LL|      1|//! ``` | 
|  | LL|       |//! | 
|  | LL|       |//! doctest with custom main: | 
|  | LL|       |//! ``` | 
|  | LL|       |//! fn some_func() { | 
|  | LL|       |//!     println!("called some_func()"); | 
|  | LL|       |//! } | 
|  | LL|      1|//! | 
|  | LL|      1|//! #[derive(Debug)] | 
|  | LL|      1|//! struct SomeError; | 
|  | LL|       |//! | 
|  | LL|       |//! extern crate doctest_crate; | 
|  | LL|       |//! | 
|  | LL|       |//! fn doctest_main() -> Result<(), SomeError> { | 
|  | LL|      1|//!     some_func(); | 
|  | LL|      1|//!     doctest_crate::fn_run_in_doctests(2); | 
|  | LL|      1|//!     Ok(()) | 
|  | LL|      1|//! } | 
|  | LL|      1|//! | 
|  | LL|       |//! // this `main` is not shown as covered, as it clashes with all the other | 
|  | LL|       |//! // `main` functions that were automatically generated for doctests | 
|  | LL|       |//! fn main() -> Result<(), SomeError> { | 
|  | LL|       |//!     doctest_main() | 
|  | LL|       |//! } | 
|  | LL|       |//! ``` | 
|  | LL|       | | 
|  | LL|       |/// doctest attached to fn testing external code: | 
|  | LL|       |/// ``` | 
|  | LL|      1|/// extern crate doctest_crate; | 
|  | LL|      1|/// doctest_crate::fn_run_in_doctests(3); | 
|  | LL|      1|/// ``` | 
|  | LL|       |/// | 
|  | LL|      1|fn main() { | 
|  | LL|      1|    if true { | 
|  | LL|      1|        assert_eq!(1, 1); | 
|  | LL|       |    } else { | 
|  | LL|      0|        assert_eq!(1, 2); | 
|  | LL|       |    } | 
|  | LL|      1|} | 
|  | LL|       | | 
|  | LL|       |// FIXME(Swatinem): Fix known issue that coverage code region columns need to be offset by the | 
|  | LL|       |// doc comment line prefix (`///` or `//!`) and any additional indent (before or after the doc | 
|  | LL|       |// comment characters). This test produces `llvm-cov show` results demonstrating the problem. | 
|  | LL|       |// | 
|  | LL|       |// One of the above tests now includes: `derive(Debug, PartialEq)`, producing an `llvm-cov show` | 
|  | LL|       |// result with a distinct count for `Debug`, denoted by `^1`, but the caret points to the wrong | 
|  | LL|       |// column. Similarly, the `if` blocks without `else` blocks show `^0`, which should point at, or | 
|  | LL|       |// one character past, the `if` block's closing brace. In both cases, these are most likely off | 
|  | LL|       |// by the number of characters stripped from the beginning of each doc comment line: indent | 
|  | LL|       |// whitespace, if any, doc comment prefix (`//!` in this case) and (I assume) one space character | 
|  | LL|       |// (?). Note, when viewing `llvm-cov show` results in `--color` mode, the column offset errors are | 
|  | LL|       |// more pronounced, and show up in more places, with background color used to show some distinct | 
|  | LL|       |// code regions with different coverage counts. | 
|  | LL|       |// | 
|  | LL|       |// NOTE: Since the doc comment line prefix may vary, one possible solution is to replace each | 
|  | LL|       |// character stripped from the beginning of doc comment lines with a space. This will give coverage | 
|  | LL|       |// results the correct column offsets, and I think it should compile correctly, but I don't know | 
|  | LL|       |// what affect it might have on diagnostic messages from the compiler, and whether anyone would care | 
|  | LL|       |// if the indentation changed. I don't know if there is a more viable solution. | 
|  |  |