-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #92175 - Aaron1011:fix-missing-source-file, r=cjgillot
Import `SourceFile`s from crate before decoding foreign `Span` Fixes #92163 Fixes #92014 When writing to the incremental cache, we encode all `Span`s we encounter, regardless of whether or not their `SourceFile` comes from the local crate, or from a foreign crate. When we decode a `Span`, we use the `StableSourceFileId` we encoded to locate the matching `SourceFile` in the current session. If this id corresponds to a `SourceFile` from another crate, then we need to have already imported that `SourceFile` into our current session. This usually happens automatically during resolution / macro expansion, when we try to resolve definitions from other crates. In certain cases, however, we may try to load a `Span` from a transitive dependency without having ever imported the `SourceFile`s from that crate, leading to an ICE. This PR fixes the issue by enconding the `SourceFile`'s `CrateNum` when we encode a `Span`. During decoding, we call `imported_source_files()` when we encounter a foreign `CrateNum`, which ensure that all `SourceFile`s from that crate are imported into the current session.
- Loading branch information
Showing
6 changed files
with
68 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3 changes: 3 additions & 0 deletions
3
src/test/incremental/issue-92163-missing-sourcefile/auxiliary/first_crate.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
pub enum Foo { | ||
Variant | ||
} |
10 changes: 10 additions & 0 deletions
10
src/test/incremental/issue-92163-missing-sourcefile/auxiliary/second_crate.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// compile-flags:--extern first_crate | ||
|
||
// Note: adding `first_crate` to the extern prelude | ||
// (instead of using `extern_crate`) appears to be necessary to | ||
// trigger the original incremental compilation bug. | ||
// I'm not entirely sure why this is the case | ||
|
||
pub fn make_it() -> first_crate::Foo { | ||
panic!() | ||
} |
31 changes: 31 additions & 0 deletions
31
src/test/incremental/issue-92163-missing-sourcefile/issue_92163_main.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// aux-build:first_crate.rs | ||
// aux-build:second_crate.rs | ||
// revisions:rpass1 rpass2 | ||
|
||
// Regression test for issue #92163 | ||
// Under certain circumstances, we may end up trying to | ||
// decode a foreign `Span` from the incremental cache, without previously | ||
// having imported the `SourceFile`s from the owning crate. This can happen | ||
// if the `Span` comes from a transitive dependency (so we never try to resolve | ||
// items from the crate during expansion/resolution). | ||
// | ||
// Previously, this would result in an ICE, since we would not have loaded | ||
// the corresponding `SourceFile` for the `StableSourceFileId` we decoded. | ||
// This test verifies that the decoding of a foreign `Span` will always | ||
// try to import the `SourceFile`s from the foreign crate, instead of | ||
// relying on that having already happened during expansion. | ||
|
||
extern crate second_crate; | ||
|
||
pub struct Outer; | ||
|
||
impl Outer { | ||
pub fn use_it() { | ||
// This returns `first_crate::Foo`, causing | ||
// us to encode the `AdtDef `first_crate::Foo` (along with its `Span`s) | ||
// into the query cache for the `TypeckResults` for this function. | ||
second_crate::make_it(); | ||
} | ||
} | ||
|
||
fn main() {} |