Rustdoc doctest nested include_str! change

🚧 The 2024 Edition has not yet been released and hence this section is still "under construction". More information may be found at https://github.com/rust-lang/rust/pull/132210.

Summary

When a doctest is included with include_str!, if that doctest itself also uses include! / include_str! / include_bytes!, the path is resolved relative to the Markdown file, rather than the Rust source file.

Details

Prior to the 2024 edition, adding documentation with #[doc=include_str!("path/file.md")] didn't carry span information into the doctests. As a result, if the Markdown file is in a different directory than the source, any include!ed paths need to be relative to the Rust file.

For example, consider a library crate with these files:

  • Cargo.toml
  • README.md
  • src/
    • lib.rs
  • examples/
    • data.bin

Let lib.rs contain this:

#![doc=include_str!("../README.md")]

And assume this README.md file:

``` let _ = include_bytes!("../examples/data.bin"); // ^^^ notice this ```

Prior to the 2024 edition, the path in README.md needed to be relative to the lib.rs file. In 2024 and later, it is now relative to README.md iself.

Migration

After migrating, you'll see the following error:

error: couldn't read `../examples/data.bin`: No such file or directory (os error 2) --> src/../README.md:2:24 | 2 | let _ = include_bytes!("../examples/data.bin"); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: this error originates in the macro `include_bytes` (in Nightly builds, run with -Z macro-backtrace for more info) help: there is a file with the same name in a different directory | 2 | let _ = include_bytes!("examples/data.bin"); | ~~~~~~~~~~~~~~~~~~~