// Prepend path of working directory onto potentially
// relative paths, because they could become relative
// to a wrong directory.
- let working_dir = &self.tcx.sess.working_dir;
+ // We include `working_dir` as part of the crate hash,
+ // so it's okay for us to use it as part of the encoded
+ // metadata.
+ let working_dir = &self.tcx.sess.opts.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(joined)
+ }
}
RealFileName::Remapped { local_path: _, virtual_name } => {
// If working_dir has been remapped, then we emit