diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index 29fcbffa0b9..1b7b851382e 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -497,11 +497,22 @@ fn encode_source_map(&mut self) -> Lazy<[rustc_span::SourceFile]> { let working_dir = &self.tcx.sess.working_dir; match working_dir { RealFileName::LocalPath(absolute) => { - // If working_dir has not been remapped, then we emit a - // LocalPath variant as it's likely to be a valid path - RealFileName::LocalPath( - Path::new(absolute).join(path_to_file), - ) + // Although neither working_dir or the file name were subject + // to path remapping, the concatenation between the two may + // be. Hence we need to do a remapping here. + let joined = Path::new(absolute).join(path_to_file); + let (joined, remapped) = + source_map.path_mapping().map_prefix(joined); + if remapped { + RealFileName::Remapped { + local_path: None, + virtual_name: joined, + } + } else { + RealFileName::LocalPath( + Path::new(absolute).join(path_to_file), + ) + } } RealFileName::Remapped { local_path: _, virtual_name } => { // If working_dir has been remapped, then we emit