about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_metadata/src/rmeta/encoder.rs32
1 files changed, 22 insertions, 10 deletions
diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs
index 9253f421cfe..a3e0dd8e3b9 100644
--- a/compiler/rustc_metadata/src/rmeta/encoder.rs
+++ b/compiler/rustc_metadata/src/rmeta/encoder.rs
@@ -469,7 +469,6 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
         let source_map = self.tcx.sess.source_map();
         let all_source_files = source_map.files();
 
-        let working_dir = self.tcx.sess.working_dir.stable_name();
         // By replacing the `Option` with `None`, we ensure that we can't
         // accidentally serialize any more `Span`s after the source map encoding
         // is done.
@@ -488,23 +487,36 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
             })
             .map(|(_, source_file)| {
                 let mut adapted = match source_file.name {
-                    FileName::Real(ref name) => {
-                        // Expand all local paths to absolute paths because
-                        // any relative paths are potentially relative to a
-                        // wrong directory.
+                    FileName::Real(ref realname) => {
                         let mut adapted = (**source_file).clone();
-                        adapted.name = match name {
+                        adapted.name = FileName::Real(match realname {
                             RealFileName::LocalPath(local_path) => {
-                                Path::new(&working_dir).join(local_path).into()
+                                // Prepend path of working directory onto local path.
+                                // because relative paths are potentially relative to a
+                                // wrong directory.
+                                let working_dir = &self.tcx.sess.working_dir;
+                                if let RealFileName::LocalPath(absolute) = working_dir {
+                                    // 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(local_path))
+                                } else {
+                                    // If working_dir has been remapped, then we emit
+                                    // Remapped variant as the expanded path won't be valid
+                                    RealFileName::Remapped {
+                                        local_path: None,
+                                        virtual_name: Path::new(working_dir.stable_name())
+                                            .join(local_path),
+                                    }
+                                }
                             }
                             RealFileName::Remapped { local_path: _, virtual_name } => {
-                                FileName::Real(RealFileName::Remapped {
+                                RealFileName::Remapped {
                                     // We do not want any local path to be exported into metadata
                                     local_path: None,
                                     virtual_name: virtual_name.clone(),
-                                })
+                                }
                             }
-                        };
+                        });
                         adapted.name_hash = {
                             let mut hasher: StableHasher = StableHasher::new();
                             adapted.name.hash(&mut hasher);