Skip to content

Commit

Permalink
Auto merge of #124539 - Urgau:non-local-defs_modulo_modules, r=lcnr
Browse files Browse the repository at this point in the history
Consider inner modules to be local in the `non_local_definitions` lint

This PR implements the [proposed fix](#124396 (comment)) for #124396, that is to consider inner modules to be local in the `non_local_definitions` lint.

This PR is voluntarily kept as minimal as possible so it can be backported easily.

T-lang [nomination](#124396 (comment)) will need to be removed before this can be merged.

Fixes *(nearly, needs backport)* #124396
  • Loading branch information
bors committed May 1, 2024
2 parents 5e469eb + 21c688a commit 378a43a
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 5 deletions.
16 changes: 11 additions & 5 deletions compiler/rustc_lint/src/non_local_def.rs
Original file line number Diff line number Diff line change
Expand Up @@ -357,16 +357,22 @@ fn path_has_local_parent(
}

/// Given a def id and a parent impl def id, this checks if the parent
/// def id correspond to the def id of the parent impl definition.
/// def id (modulo modules) correspond to the def id of the parent impl definition.
#[inline]
fn did_has_local_parent(
did: DefId,
tcx: TyCtxt<'_>,
impl_parent: DefId,
impl_parent_parent: Option<DefId>,
) -> bool {
did.is_local() && {
let res_parent = tcx.parent(did);
res_parent == impl_parent || Some(res_parent) == impl_parent_parent
}
did.is_local()
&& if let Some(did_parent) = tcx.opt_parent(did) {
did_parent == impl_parent
|| Some(did_parent) == impl_parent_parent
|| !did_parent.is_crate_root()
&& tcx.def_kind(did_parent) == DefKind::Mod
&& did_has_local_parent(did_parent, tcx, impl_parent, impl_parent_parent)
} else {
false
}
}
38 changes: 38 additions & 0 deletions tests/ui/lint/non-local-defs/module_as_local.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//! This test checks that module are treated as if they were local
//!
//! https://github.com/rust-lang/rust/issues/124396

//@ check-pass

trait JoinTo {}

fn simple_one() {
mod posts {
#[allow(non_camel_case_types)]
pub struct table {}
}

impl JoinTo for posts::table {}
}

fn simple_two() {
mod posts {
pub mod posts {
#[allow(non_camel_case_types)]
pub struct table {}
}
}

impl JoinTo for posts::posts::table {}
}

struct Global;
fn trait_() {
mod posts {
pub trait AdjecentTo {}
}

impl posts::AdjecentTo for Global {}
}

fn main() {}

0 comments on commit 378a43a

Please sign in to comment.