Skip to content

Commit f019d28

Browse files
committed
Auto merge of rust-lang#83813 - cbeuw:remap-std, r=michaelwoerister
Fix `--remap-path-prefix` not correctly remapping `rust-src` component paths and unify handling of path mapping with virtualized paths This PR fixes rust-lang#73167 ("Binaries end up containing path to the rust-src component despite `--remap-path-prefix`") by preventing real local filesystem paths from reaching compilation output if the path is supposed to be remapped. `RealFileName::Named` introduced in rust-lang#72767 is now renamed as `LocalPath`, because this variant wraps a (most likely) valid local filesystem path. `RealFileName::Devirtualized` is renamed as `Remapped` to be used for remapped path from a real path via `--remap-path-prefix` argument, as well as real path inferred from a virtualized (during compiler bootstrapping) `/rustc/...` path. The `local_path` field is now an `Option<PathBuf>`, as it will be set to `None` before serialisation, so it never reaches any build output. Attempting to serialise a non-`None` `local_path` will cause an assertion faliure. When a path is remapped, a `RealFileName::Remapped` variant is created. The original path is preserved in `local_path` field and the remapped path is saved in `virtual_name` field. Previously, the `local_path` is directly modified which goes against its purpose of "suitable for reading from the file system on the local host". `rustc_span::SourceFile`'s fields `unmapped_path` (introduced by rust-lang#44940) and `name_was_remapped` (introduced by rust-lang#41508 when `--remap-path-prefix` feature originally added) are removed, as these two pieces of information can be inferred from the `name` field: if it's anything other than a `FileName::Real(_)`, or if it is a `FileName::Real(RealFileName::LocalPath(_))`, then clearly `name_was_remapped` would've been false and `unmapped_path` would've been `None`. If it is a `FileName::Real(RealFileName::Remapped{local_path, virtual_name})`, then `name_was_remapped` would've been true and `unmapped_path` would've been `Some(local_path)`. cc `@eddyb` who implemented `/rustc/...` path devirtualisation
2 parents ab73020 + 53ffe39 commit f019d28

File tree

1 file changed

+4
-5
lines changed

1 file changed

+4
-5
lines changed

clippy_lints/src/macro_use.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ pub struct MacroRefData {
4747

4848
impl MacroRefData {
4949
pub fn new(name: String, callee: Span, cx: &LateContext<'_>) -> Self {
50-
let mut path = cx.sess().source_map().span_to_filename(callee).to_string();
50+
let mut path = cx.sess().source_map().span_to_filename(callee).prefer_local().to_string();
5151

5252
// std lib paths are <::std::module::file type>
5353
// so remove brackets, space and type.
@@ -96,8 +96,7 @@ impl MacroUseImports {
9696
let name = snippet(cx, cx.sess().source_map().span_until_char(call_site, '!'), "_");
9797
if let Some(callee) = span.source_callee() {
9898
if !self.collected.contains(&call_site) {
99-
self.mac_refs
100-
.push(MacroRefData::new(name.to_string(), callee.def_site, cx));
99+
self.mac_refs.push(MacroRefData::new(name.to_string(), callee.def_site, cx));
101100
self.collected.insert(call_site);
102101
}
103102
}
@@ -175,7 +174,7 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports {
175174
.push((*item).to_string());
176175
check_dup.push((*item).to_string());
177176
}
178-
},
177+
}
179178
[root, rest @ ..] => {
180179
if rest.iter().all(|item| !check_dup.contains(&(*item).to_string())) {
181180
let filtered = rest
@@ -199,7 +198,7 @@ impl<'tcx> LateLintPass<'tcx> for MacroUseImports {
199198
.push(rest.join("::"));
200199
check_dup.extend(rest.iter().map(ToString::to_string));
201200
}
202-
},
201+
}
203202
}
204203
}
205204
}

0 commit comments

Comments
 (0)