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 calling `imported_source_files()` when we encounter a `SourceFile` with a foreign `CrateNum`. This ensures that all `SourceFile`s from that crate are imported into the current session.
This commit is contained in:
parent
489296d825
commit
d9220924dc
6 changed files with 68 additions and 0 deletions
|
@ -495,6 +495,20 @@ impl<'a, 'tcx> CacheDecoder<'a, 'tcx> {
|
|||
.entry(index)
|
||||
.or_insert_with(|| {
|
||||
let stable_id = file_index_to_stable_id[&index].translate(tcx);
|
||||
|
||||
// If this `SourceFile` is from a foreign crate, then make sure
|
||||
// that we've imported all of the source files from that crate.
|
||||
// This has usually already been done during macro invocation.
|
||||
// However, when encoding query results like `TypeckResults`,
|
||||
// we might encode an `AdtDef` for a foreign type (because it
|
||||
// was referenced in the body of the function). There is no guarantee
|
||||
// that we will load the source files from that crate during macro
|
||||
// expansion, so we use `import_source_files` to ensure that the foreign
|
||||
// source files are actually imported before we call `source_file_by_stable_id`.
|
||||
if stable_id.cnum != LOCAL_CRATE {
|
||||
self.tcx.cstore_untracked().import_source_files(self.tcx.sess, stable_id.cnum);
|
||||
}
|
||||
|
||||
source_map
|
||||
.source_file_by_stable_id(stable_id)
|
||||
.expect("failed to lookup `SourceFile` in new context")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue