rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
96.61k stars 12.48k forks source link

Invalid inexistent link persists in non-documented item #113311

Closed ChAoSUnItY closed 1 year ago

ChAoSUnItY commented 1 year ago

Steps to reproduce

  1. Apply this quick patch diff to see the issue:

    
    diff --git a/src/librustdoc/passes/lint/bare_urls.rs b/src/librustdoc/passes/lint/bare_urls.rs
    index e9cee92d22b..4c2583f8eac 100644
    --- a/src/librustdoc/passes/lint/bare_urls.rs
    +++ b/src/librustdoc/passes/lint/bare_urls.rs
    @@ -2,6 +2,7 @@
    //! Suggests wrapping the link with angle brackets: `Go to <https://example.com/>.` to linkify it.
    
    use crate::clean::*;
    +use crate::clean::utils::find_nearest_parent_module;
    use crate::core::DocContext;
    use crate::html::markdown::main_body_opts;
    use crate::passes::source_span_for_markdown_range;
    @@ -9,6 +10,7 @@
    use pulldown_cmark::{Event, Parser, Tag};
    use regex::Regex;
    use rustc_errors::Applicability;
    +use rustc_hir::def::DefKind;
    use std::mem;
    use std::sync::LazyLock;

@@ -35,8 +37,19 @@ pub(super) fn visititem(cx: &DocContext<'>, item: &Item) { }); };

  1. Run x test tests\rustdoc-ui\issues\issue-109282-import-inline-merge.rs
  2. See stdout for more details.

You will see that module m has a link [`EnumValue`] while m does not have any document.

Relates to

Meta

rustc --version --verbose:

rustc 1.72.0-nightly (101fa903b 2023-06-04)
binary: rustc
commit-hash: 101fa903bb9209d270086da279247625a2869211
commit-date: 2023-06-04
host: x86_64-pc-windows-msvc
release: 1.72.0-nightly
LLVM version: 16.0.4
Backtrace

``` Testing stage1 compiletest suite=rustdoc-ui mode=ui (x86_64-pc-windows-msvc) running 1 tests F failures: ---- [ui] tests\rustdoc-ui\issues\issue-109282-import-inline-merge.rs stdout ---- normalized stdout: issue_109282_import_inline_merge[3240]::m2 /--/ [`ValueEnum`] issue_109282_import_inline_merge[3240]::m /--/ [`ValueEnum`] The actual stdout differed from the expected stdout. Actual stdout saved to D:\projects\rs\rust\build\x86_64-pc-windows-msvc\test\rustdoc-ui\issues\issue-109282-import-inline-merge\issue-109282-import-inline-merge.stdout To update references, rerun the tests and pass the `--bless` flag To only update this specific test, also pass `--test-args issues\issue-109282-import-inline-merge.rs` error: 1 errors occurred comparing output. status: exit code: 0 command: PATH="D:\projects\rs\rust\build\x86_64-pc-windows-msvc\stage1\bin;C:\Program Files (x86)\Windows Kits\10\bin\x64;C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64;D:\projects\rs\rust\build\x86_64-pc-windows-msvc\stage0-bootstrap-tools\x86_64-pc-windows-msvc\release\deps;D:\projects\rs\rust\build\x86_64-pc-windows-msvc\stage0\bin;C:\Users\chaos\.oh-my-posh;C:\Program Files\WindowsApps\Microsoft.PowerShell_7.3.5.0_x64__8wekyb3d8bbwe;C:\Program Files\Common Files\Oracle\Java\javapath;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Python311\Scripts\;C:\Python311\;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\ProgramData\chocolatey\bin;C:\Program Files\Java\jdk-17\bin;C:\Program Files\dotnet\;C:\Program Files\Neovim\/bin;C:\Program Files\nodejs\;C:\Program Files\Go\bin;D:\projects\v\v\.bin;C:\Users\chaos\projects\v\v\.bin;C:\Users\chaos\.cargo\bin;C:\Users\chaos\scoop\apps\gsudo\current;C:\Users\chaos\projects\v\.bin;C:\Users\chaos\scoop\shims;C:\Users\chaos\AppData\Local\Microsoft\WindowsApps;C:\Program Files\mingw-w64\bin;C:\Program Files\CMake\bin;C:\Program Files (x86)\Dr. Memory\bin;C:\Program Files\JetBrains\IntelliJ IDEA 2021.3.2\bin;C:\Users\chaos\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\chaos\.dotnet\tools;C:\ProgramData\chocolatey\lib\mingw\tools\install\mingw64\bin;C:\Users\chaos\AppData\Roaming\npm;C:\Users\chaos\AppData\Local\Coursier\data\bin;C:\Users\chaos\AppData\Local\JetBrains\Toolbox\scripts;C:\Users\chaos\go\bin;C:\Users\chaos\.deno\bin;C:\Users\chaos\.dotnet\tools;C:\Program Files\Java\jdk-17.0.2\bin\server;C:\altera\13.1\modelsim_ase\win32aloem;C:\Users\chaos\AppData\Local\Microsoft\WindowsApps;D:\qemu" "D:\\projects\\rs\\rust\\build\\x86_64-pc-windows-msvc\\stage1\\bin\\rustdoc.exe" "D:\\projects\\rs\\rust\\tests\\rustdoc-ui\\issues\\issue-109282-import-inline-merge.rs" "-Zthreads=1" "-Zsimulate-remapped-rust-src-base=/rustc/FAKE_PREFIX" "-Ztranslate-remapped-path-to-local-path=no" "--sysroot" "D:\\projects\\rs\\rust\\build\\x86_64-pc-windows-msvc\\stage1" "--target=x86_64-pc-windows-msvc" "--error-format" "json" "--json" "future-incompat" "-Ccodegen-units=1" "-Zui-testing" "-Zdeduplicate-diagnostics=no" "-Cstrip=debuginfo" "-o" "D:\\projects\\rs\\rust\\build\\x86_64-pc-windows-msvc\\test\\rustdoc-ui\\issues\\issue-109282-import-inline-merge" "-Cdebuginfo=0" "-Lnative=D:\\projects\\rs\\rust\\build\\x86_64-pc-windows-msvc\\native\\rust-test-helpers" "-L" "D:\\projects\\rs\\rust\\build\\x86_64-pc-windows-msvc\\test\\rustdoc-ui\\issues\\issue-109282-import-inline-merge\\auxiliary" --- stdout ------------------------------- issue_109282_import_inline_merge[3240]::m2 /--/ [`ValueEnum`] issue_109282_import_inline_merge[3240]::m /--/ [`ValueEnum`] ------------------------------------------ stderr: none failures: [ui] tests\rustdoc-ui\issues\issue-109282-import-inline-merge.rs test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 227 filtered out; finished in 511.48ms Some tests failed in compiletest suite=rustdoc-ui mode=ui host=x86_64-pc-windows-msvc target=x86_64-pc-windows-msvc Build completed unsuccessfully in 0:02:29 ```

ChAoSUnItY commented 1 year ago

@rustbot label +T-rustdoc

GuillaumeGomez commented 1 year ago

I'm a bit confused about the problem here: so the current code doesn't have this problem but if you update it, it does have this problem?

ChAoSUnItY commented 1 year ago

Yes. Current code doesn't lead to any ICE, and reproduction code is meant to demonstrate the issue.

GuillaumeGomez commented 1 year ago

Ok I think I got it. So currently, a module without documentation still has an intra-doc link on it, which is supposed to be impossible. Did I get it right?

ChAoSUnItY commented 1 year ago

That's correct.

GuillaumeGomez commented 1 year ago

Ok perfect, thanks! So the code is:

mod m {
    pub enum ValueEnum {}
}
mod m2 {
    /// [`ValueEnum`]
    pub use crate::m::ValueEnum;
}
pub use m2::ValueEnum;

I suppose the inlining of docs is doing something wrong here.

Also cc @petrochenkov

GuillaumeGomez commented 1 year ago

Just took a look. So in clean/mod.rs, if we have a re-export of a non-public item, we inline it. So in this case, pub use m2::ValueEnum becomes ValueEnum. So that makes 1 item. For the other, it's m2::ValueEnum which we keep around in case it is re-exported by some other re-exports.

So it's not the m module which has the documentation but the inlined m::ValueEnum. So it's completely expected. I'll comment on your PR to tell you how to detect such a case.