Skip to content

Invalid inexistent link persists in non-documented item #113311

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
ChAoSUnItY opened this issue Jul 4, 2023 · 7 comments
Closed

Invalid inexistent link persists in non-documented item #113311

ChAoSUnItY opened this issue Jul 4, 2023 · 7 comments
Labels
C-bug Category: This is a bug. T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.

Comments

@ChAoSUnItY
Copy link
Contributor

ChAoSUnItY commented Jul 4, 2023

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 visit_item(cx: &DocContext<'_>, item: &Item) {
                 });
             };
 
+        let Some(item_id) = item.def_id()
+        else {
+            return;
+        };
+        let module_id = match cx.tcx.def_kind(item_id) {
+            DefKind::Mod if item.inner_docs(cx.tcx) => item_id,
+            _ => find_nearest_parent_module(cx.tcx, item_id).unwrap(),
+        };
+
         let mut p = Parser::new_ext(&dox, main_body_opts()).into_offset_iter();
 
+        println!("{} /--/ {}", cx.tcx.def_path_debug_str(module_id), item.doc_value());
+
         while let Some((event, range)) = p.next() {
             match event {
                 Event::Text(s) => find_raw_urls(cx, &s, range, &report_diag),
  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 ChAoSUnItY added the C-bug Category: This is a bug. label Jul 4, 2023
@ChAoSUnItY
Copy link
Contributor Author

@rustbot label +T-rustdoc

@rustbot rustbot added the T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue. label Jul 4, 2023
@GuillaumeGomez
Copy link
Member

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
Copy link
Contributor Author

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

@GuillaumeGomez
Copy link
Member

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
Copy link
Contributor Author

That's correct.

@GuillaumeGomez
Copy link
Member

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
Copy link
Member

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. T-rustdoc Relevant to the rustdoc team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

3 participants