Auto merge of #130246 - dianne:issue-97589-fix, r=petrochenkov
rustc_expand: remember module `#[path]`s during expansion During invocation collection, if a module item parsed from a `#[path]` attribute needed a second pass after parsing, its path wouldn't get added to the file path stack, so cycle detection broke. This checks the `#[path]` in such cases, so that it gets added appropriately. I think it should work identically to the case for external modules that don't need a second pass, but I'm not 100% sure. Fixes #97589
This commit is contained in:
commit
6ce376774c
5 changed files with 31 additions and 3 deletions
|
@ -41,7 +41,9 @@ use crate::errors::{
|
||||||
};
|
};
|
||||||
use crate::fluent_generated;
|
use crate::fluent_generated;
|
||||||
use crate::mbe::diagnostics::annotate_err_with_kind;
|
use crate::mbe::diagnostics::annotate_err_with_kind;
|
||||||
use crate::module::{mod_dir_path, parse_external_mod, DirOwnership, ParsedExternalMod};
|
use crate::module::{
|
||||||
|
mod_dir_path, mod_file_path_from_attr, parse_external_mod, DirOwnership, ParsedExternalMod,
|
||||||
|
};
|
||||||
use crate::placeholders::{placeholder, PlaceholderExpander};
|
use crate::placeholders::{placeholder, PlaceholderExpander};
|
||||||
|
|
||||||
macro_rules! ast_fragments {
|
macro_rules! ast_fragments {
|
||||||
|
@ -1202,8 +1204,14 @@ impl InvocationCollectorNode for P<ast::Item> {
|
||||||
ecx.current_expansion.dir_ownership,
|
ecx.current_expansion.dir_ownership,
|
||||||
*inline,
|
*inline,
|
||||||
);
|
);
|
||||||
|
// If the module was parsed from an external file, recover its path.
|
||||||
|
// This lets `parse_external_mod` catch cycles if it's self-referential.
|
||||||
|
let file_path = match inline {
|
||||||
|
Inline::Yes => None,
|
||||||
|
Inline::No => mod_file_path_from_attr(ecx.sess, &attrs, &dir_path),
|
||||||
|
};
|
||||||
node.attrs = attrs;
|
node.attrs = attrs;
|
||||||
(None, dir_path, dir_ownership)
|
(file_path, dir_path, dir_ownership)
|
||||||
}
|
}
|
||||||
ModKind::Unloaded => {
|
ModKind::Unloaded => {
|
||||||
// We have an outline `mod foo;` so we need to parse the file.
|
// We have an outline `mod foo;` so we need to parse the file.
|
||||||
|
|
|
@ -171,7 +171,7 @@ fn mod_file_path<'a>(
|
||||||
|
|
||||||
/// Derive a submodule path from the first found `#[path = "path_string"]`.
|
/// Derive a submodule path from the first found `#[path = "path_string"]`.
|
||||||
/// The provided `dir_path` is joined with the `path_string`.
|
/// The provided `dir_path` is joined with the `path_string`.
|
||||||
fn mod_file_path_from_attr(
|
pub(crate) fn mod_file_path_from_attr(
|
||||||
sess: &Session,
|
sess: &Session,
|
||||||
attrs: &[Attribute],
|
attrs: &[Attribute],
|
||||||
dir_path: &Path,
|
dir_path: &Path,
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
//@ error-pattern: circular modules
|
||||||
|
// Regression test for #97589: a doc-comment on a circular module bypassed cycle detection
|
||||||
|
|
||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
pub mod recursive;
|
|
@ -0,0 +1,8 @@
|
||||||
|
error: circular modules: $DIR/recursive.rs -> $DIR/recursive.rs
|
||||||
|
--> $DIR/recursive.rs:6:1
|
||||||
|
|
|
||||||
|
LL | mod recursive;
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
//@ ignore-test: this is an auxiliary file for circular-module-with-doc-comment-issue-97589.rs
|
||||||
|
|
||||||
|
//! this comment caused the circular dependency checker to break
|
||||||
|
|
||||||
|
#[path = "recursive.rs"]
|
||||||
|
mod recursive;
|
Loading…
Add table
Reference in a new issue