From f5e481394242aced873146a2981ad6465036957a Mon Sep 17 00:00:00 2001 From: mejrs <59372212+mejrs@users.noreply.github.com> Date: Sun, 11 Oct 2026 21:36:42 +0200 Subject: [PATCH 1/2] add test --- .../on_unknown/auxiliary/foreign.rs | 12 ++++++++ .../expressions_and_paths_correct_mod_name.rs | 20 +++++++++++++ ...ressions_and_paths_correct_mod_name.stderr | 30 +++++++++++++++++++ ...ions_and_paths_correct_mod_name_foreign.rs | 11 +++++++ ..._and_paths_correct_mod_name_foreign.stderr | 30 +++++++++++++++++++ 5 files changed, 103 insertions(+) create mode 100644 tests/ui/diagnostic_namespace/on_unknown/auxiliary/foreign.rs create mode 100644 tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.rs create mode 100644 tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.stderr create mode 100644 tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.rs create mode 100644 tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.stderr diff --git a/tests/ui/diagnostic_namespace/on_unknown/auxiliary/foreign.rs b/tests/ui/diagnostic_namespace/on_unknown/auxiliary/foreign.rs new file mode 100644 index 0000000000000..c9269fcb84ca2 --- /dev/null +++ b/tests/ui/diagnostic_namespace/on_unknown/auxiliary/foreign.rs @@ -0,0 +1,12 @@ +#![feature(diagnostic_on_unknown)] + +mod a { + #[diagnostic::on_unknown( + message = "this={this}, unresolved={unresolved}", + )] + pub mod b {} +} + +pub mod c { + pub use super::a::b as d; +} diff --git a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.rs b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.rs new file mode 100644 index 0000000000000..92525706e2621 --- /dev/null +++ b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.rs @@ -0,0 +1,20 @@ +#![feature(diagnostic_on_unknown)] + +mod a { + #[diagnostic::on_unknown( + message = "this={this}, unresolved={unresolved}", + )] + pub mod b {} +} + +mod c { + pub use super::a::b as d; +} + +use c::d::x; //~ ERROR this=b, unresolved=x + +fn main() { + let _ = c::d::X(); //~ ERROR this=c::d, unresolved=X + + let _: c::d::X; //~ ERROR this=c::d, unresolved=X +} diff --git a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.stderr b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.stderr new file mode 100644 index 0000000000000..d2230ee1a8d4d --- /dev/null +++ b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.stderr @@ -0,0 +1,30 @@ +error[E0432]: this=b, unresolved=x + --> $DIR/expressions_and_paths_correct_mod_name.rs:14:5 + | +LL | use c::d::x; + | ^^^^^^- + | | + | no `x` in `a::b` + | + = note: unresolved import `c::d::x` + +error[E0425]: this=c::d, unresolved=X + --> $DIR/expressions_and_paths_correct_mod_name.rs:17:19 + | +LL | let _ = c::d::X(); + | ^ not found in `c::d` + | + = note: cannot find function, tuple struct or tuple variant `X` in module `c::d` + +error[E0425]: this=c::d, unresolved=X + --> $DIR/expressions_and_paths_correct_mod_name.rs:19:18 + | +LL | let _: c::d::X; + | ^ not found in `c::d` + | + = note: cannot find type `X` in module `c::d` + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0425, E0432. +For more information about an error, try `rustc --explain E0425`. diff --git a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.rs b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.rs new file mode 100644 index 0000000000000..abf711b1d41de --- /dev/null +++ b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.rs @@ -0,0 +1,11 @@ +//@ aux-crate:foreign=foreign.rs + +extern crate foreign; + +use foreign::c::d::x; //~ ERROR this=b, unresolved=x + +fn main() { + let _ = foreign::c::d::X(); //~ ERROR this=foreign::c::d, unresolved=X + + let _: foreign::c::d::X; //~ ERROR this=foreign::c::d, unresolved=X +} diff --git a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.stderr b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.stderr new file mode 100644 index 0000000000000..3b95a3e2d0ec1 --- /dev/null +++ b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.stderr @@ -0,0 +1,30 @@ +error[E0432]: this=b, unresolved=x + --> $DIR/expressions_and_paths_correct_mod_name_foreign.rs:5:5 + | +LL | use foreign::c::d::x; + | ^^^^^^^^^^^^^^^- + | | + | no `x` in `a::b` + | + = note: unresolved import `foreign::c::d::x` + +error[E0425]: this=foreign::c::d, unresolved=X + --> $DIR/expressions_and_paths_correct_mod_name_foreign.rs:8:28 + | +LL | let _ = foreign::c::d::X(); + | ^ not found in `foreign::c::d` + | + = note: cannot find function, tuple struct or tuple variant `X` in module `foreign::c::d` + +error[E0425]: this=foreign::c::d, unresolved=X + --> $DIR/expressions_and_paths_correct_mod_name_foreign.rs:10:27 + | +LL | let _: foreign::c::d::X; + | ^ not found in `foreign::c::d` + | + = note: cannot find type `X` in module `foreign::c::d` + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0425, E0432. +For more information about an error, try `rustc --explain E0425`. From f76d6135a1dd54c50774c737cb94b12f7db08f2a Mon Sep 17 00:00:00 2001 From: mejrs <59372212+mejrs@users.noreply.github.com> Date: Wed, 14 Oct 2026 09:31:41 +0200 Subject: [PATCH 2/2] Use proper mod name for on_unknown attribute --- .../rustc_resolve/src/diagnostics/impls.rs | 32 ++++++++++--------- .../rustc_resolve/src/late/diagnostics.rs | 5 +-- .../expressions_and_paths_correct_mod_name.rs | 4 +-- ...ressions_and_paths_correct_mod_name.stderr | 4 +-- ...ions_and_paths_correct_mod_name_foreign.rs | 4 +-- ..._and_paths_correct_mod_name_foreign.stderr | 4 +-- 6 files changed, 28 insertions(+), 25 deletions(-) diff --git a/compiler/rustc_resolve/src/diagnostics/impls.rs b/compiler/rustc_resolve/src/diagnostics/impls.rs index f1400c83e4295..18a02666cfc4a 100644 --- a/compiler/rustc_resolve/src/diagnostics/impls.rs +++ b/compiler/rustc_resolve/src/diagnostics/impls.rs @@ -206,21 +206,18 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { .iter() .map(|(import, import_error)| { if let Some(ModuleOrUniformRoot::Module(module_data)) = import.imported_module.get() - && let ModuleKind::Def(DefKind::Mod, def_id, _, name) = module_data.kind + && let ModuleKind::Def(DefKind::Mod, def_id, ..) = module_data.kind { - let Some(directive) = self.on_unknown_data(def_id) else { + let Some((this, directive)) = self.on_unknown_data(def_id) else { return CustomDiagnostic::default(); }; - let this = if let Some(name) = name { - name.to_string() - } else if let Some(crate_name) = &self.tcx.sess.opts.crate_name { - crate_name.to_string() - } else { - "".to_string() - }; let unresolved = import_error.segment.map(|s| s.name).unwrap_or(kw::Underscore); - let args = FormatArgs { this, unresolved: unresolved.to_string(), .. }; + let args = FormatArgs { + this: this.to_string(), + unresolved: unresolved.to_string(), + .. + }; directive.eval(None, &args) } else { @@ -3867,12 +3864,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> { } } - /// Gets the `#[diagnostic::on_unknown]` attribute data associated with this `DefId`. - pub(crate) fn on_unknown_data(&self, def_id: DefId) -> Option<&Directive> { - match def_id.as_local() { + /// Gets the name and `#[diagnostic::on_unknown]` attribute data associated with this `DefId`. + pub(crate) fn on_unknown_data(&self, def_id: DefId) -> Option<(Symbol, &Directive)> { + let directive = match def_id.as_local() { Some(local) => Some(self.on_unknown_data.get(&local)?.directive.as_ref()), - None => find_attr!(self.tcx, def_id, OnUnknown{ directive } => directive)?.as_deref(), - } + None => find_attr!(self.tcx, def_id, OnUnknown { directive } => directive)?.as_deref(), + }?; + + let name = + self.expect_module(def_id).name().unwrap_or_else(|| self.tcx.crate_name(def_id.krate)); + + Some((name, directive)) } } diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index 821c16ceee3e5..83e5fbef9bcb9 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -558,9 +558,10 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> { }; let mut notes = Vec::new(); if let Some(module_def_id) = module - && let Some(directive) = self.r.on_unknown_data(module_def_id) + && let Some((this, directive)) = self.r.on_unknown_data(module_def_id) { - let args = FormatArgs { unresolved: item_ident.to_string(), this: mod_str, .. }; + let args = + FormatArgs { unresolved: item_ident.to_string(), this: this.to_string(), .. }; let CustomDiagnostic { message, label, diff --git a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.rs b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.rs index 92525706e2621..d8bf14ccc54c3 100644 --- a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.rs +++ b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.rs @@ -14,7 +14,7 @@ mod c { use c::d::x; //~ ERROR this=b, unresolved=x fn main() { - let _ = c::d::X(); //~ ERROR this=c::d, unresolved=X + let _ = c::d::X(); //~ ERROR this=b, unresolved=X - let _: c::d::X; //~ ERROR this=c::d, unresolved=X + let _: c::d::X; //~ ERROR this=b, unresolved=X } diff --git a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.stderr b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.stderr index d2230ee1a8d4d..a269acdf42b17 100644 --- a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.stderr +++ b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name.stderr @@ -8,7 +8,7 @@ LL | use c::d::x; | = note: unresolved import `c::d::x` -error[E0425]: this=c::d, unresolved=X +error[E0425]: this=b, unresolved=X --> $DIR/expressions_and_paths_correct_mod_name.rs:17:19 | LL | let _ = c::d::X(); @@ -16,7 +16,7 @@ LL | let _ = c::d::X(); | = note: cannot find function, tuple struct or tuple variant `X` in module `c::d` -error[E0425]: this=c::d, unresolved=X +error[E0425]: this=b, unresolved=X --> $DIR/expressions_and_paths_correct_mod_name.rs:19:18 | LL | let _: c::d::X; diff --git a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.rs b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.rs index abf711b1d41de..6cb8872984b36 100644 --- a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.rs +++ b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.rs @@ -5,7 +5,7 @@ extern crate foreign; use foreign::c::d::x; //~ ERROR this=b, unresolved=x fn main() { - let _ = foreign::c::d::X(); //~ ERROR this=foreign::c::d, unresolved=X + let _ = foreign::c::d::X(); //~ ERROR this=b, unresolved=X - let _: foreign::c::d::X; //~ ERROR this=foreign::c::d, unresolved=X + let _: foreign::c::d::X; //~ ERROR this=b, unresolved=X } diff --git a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.stderr b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.stderr index 3b95a3e2d0ec1..ee1765828718f 100644 --- a/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.stderr +++ b/tests/ui/diagnostic_namespace/on_unknown/expressions_and_paths_correct_mod_name_foreign.stderr @@ -8,7 +8,7 @@ LL | use foreign::c::d::x; | = note: unresolved import `foreign::c::d::x` -error[E0425]: this=foreign::c::d, unresolved=X +error[E0425]: this=b, unresolved=X --> $DIR/expressions_and_paths_correct_mod_name_foreign.rs:8:28 | LL | let _ = foreign::c::d::X(); @@ -16,7 +16,7 @@ LL | let _ = foreign::c::d::X(); | = note: cannot find function, tuple struct or tuple variant `X` in module `foreign::c::d` -error[E0425]: this=foreign::c::d, unresolved=X +error[E0425]: this=b, unresolved=X --> $DIR/expressions_and_paths_correct_mod_name_foreign.rs:10:27 | LL | let _: foreign::c::d::X;