$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|      1|//! fn some_func() {
   LL|      1|//!     println!("called some_func()");
   LL|      1|//! }
   LL|       |//!
   LL|       |//! #[derive(Debug)]
   LL|       |//! struct SomeError;
   LL|       |//!
   LL|       |//! extern crate doctest_crate;
   LL|       |//!
   LL|      1|//! fn doctest_main() -> Result<(), SomeError> {
   LL|      1|//!     some_func();
   LL|      1|//!     doctest_crate::fn_run_in_doctests(2);
   LL|      1|//!     Ok(())
   LL|      1|//! }
   LL|       |//!
   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.

