diff options
| author | bors <bors@rust-lang.org> | 2022-04-29 22:27:10 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-04-29 22:27:10 +0000 |
| commit | 05c07386b45fbc540ec8cdc1bc41ae9c062b453b (patch) | |
| tree | 9026685f1048d847cd7af1f5b97cea3e33d3f5c1 /compiler | |
| parent | a707f401074bc769bab4efb2bfdde7f6c5a4068d (diff) | |
| parent | 548fca6927a644b4cde66893f5db6f4aff3f8f33 (diff) | |
| download | rust-05c07386b45fbc540ec8cdc1bc41ae9c062b453b.tar.gz rust-05c07386b45fbc540ec8cdc1bc41ae9c062b453b.zip | |
Auto merge of #96566 - Dylan-DPC:rollup-fo7rd98, r=Dylan-DPC
Rollup of 6 pull requests Successful merges: - #96390 (Switch JS code to ES6 - part 2) - #96527 (RustWrapper: explicitly don't handle DXILPointerTyID) - #96536 (rustdoc: fix missing method list for primitive deref target) - #96559 (Use the correct lifetime binder for elided lifetimes in path.) - #96560 (Remove unnecessary environment variable in cf-protection documentation) - #96562 (Fix duplicate directory separator in --remap-path-prefix.) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp | 5 | ||||
| -rw-r--r-- | compiler/rustc_resolve/src/late.rs | 25 | ||||
| -rw-r--r-- | compiler/rustc_span/src/source_map.rs | 14 | ||||
| -rw-r--r-- | compiler/rustc_span/src/source_map/tests.rs | 80 |
4 files changed, 111 insertions, 13 deletions
diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp index 850b80e4280..6d79e662a42 100644 --- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp @@ -1217,6 +1217,11 @@ extern "C" LLVMTypeKind LLVMRustGetTypeKind(LLVMTypeRef Ty) { return LLVMBFloatTypeKind; case Type::X86_AMXTyID: return LLVMX86_AMXTypeKind; +#if LLVM_VERSION_GE(15, 0) + case Type::DXILPointerTyID: + report_fatal_error("Rust does not support DirectX typed pointers."); + break; +#endif } report_fatal_error("Unhandled TypeID."); } diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 9ea66c0b59d..21b888c25c2 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -1319,7 +1319,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { | PathSource::Struct | PathSource::TupleStruct(..) => false, }; - let mut error = false; + let mut res = LifetimeRes::Error; for rib in self.lifetime_ribs.iter().rev() { match rib.kind { // In create-parameter mode we error here because we don't want to support @@ -1329,7 +1329,6 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { // impl Foo for std::cell::Ref<u32> // note lack of '_ // async fn foo(_: std::cell::Ref<u32>) { ... } LifetimeRibKind::AnonymousCreateParameter(_) => { - error = true; break; } // `PassThrough` is the normal case. @@ -1338,19 +1337,21 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { // `PathSegment`, for which there is no associated `'_` or `&T` with no explicit // lifetime. Instead, we simply create an implicit lifetime, which will be checked // later, at which point a suitable error will be emitted. - LifetimeRibKind::AnonymousPassThrough(..) - | LifetimeRibKind::AnonymousReportError - | LifetimeRibKind::Item => break, + LifetimeRibKind::AnonymousPassThrough(binder) => { + res = LifetimeRes::Anonymous { binder, elided: true }; + break; + } + LifetimeRibKind::AnonymousReportError | LifetimeRibKind::Item => { + // FIXME(cjgillot) This resolution is wrong, but this does not matter + // since these cases are erroneous anyway. Lifetime resolution should + // emit a "missing lifetime specifier" diagnostic. + res = LifetimeRes::Anonymous { binder: DUMMY_NODE_ID, elided: true }; + break; + } _ => {} } } - let res = if error { - LifetimeRes::Error - } else { - LifetimeRes::Anonymous { binder: segment_id, elided: true } - }; - let node_ids = self.r.next_node_ids(expected_lifetimes); self.record_lifetime_res( segment_id, @@ -1374,7 +1375,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { // originating from macros, since the segment's span might be from a macro arg. segment.ident.span.find_ancestor_inside(path_span).unwrap_or(path_span) }; - if error { + if let LifetimeRes::Error = res { let sess = self.r.session; let mut err = rustc_errors::struct_span_err!( sess, diff --git a/compiler/rustc_span/src/source_map.rs b/compiler/rustc_span/src/source_map.rs index 95177102dcf..460b5c18fc1 100644 --- a/compiler/rustc_span/src/source_map.rs +++ b/compiler/rustc_span/src/source_map.rs @@ -1102,7 +1102,19 @@ impl FilePathMapping { // take precedence. for &(ref from, ref to) in self.mapping.iter().rev() { if let Ok(rest) = path.strip_prefix(from) { - return (to.join(rest), true); + let remapped = if rest.as_os_str().is_empty() { + // This is subtle, joining an empty path onto e.g. `foo/bar` will + // result in `foo/bar/`, that is, there'll be an additional directory + // separator at the end. This can lead to duplicated directory separators + // in remapped paths down the line. + // So, if we have an exact match, we just return that without a call + // to `Path::join()`. + to.clone() + } else { + to.join(rest) + }; + + return (remapped, true); } } diff --git a/compiler/rustc_span/src/source_map/tests.rs b/compiler/rustc_span/src/source_map/tests.rs index f13979941ab..481e015c66c 100644 --- a/compiler/rustc_span/src/source_map/tests.rs +++ b/compiler/rustc_span/src/source_map/tests.rs @@ -312,3 +312,83 @@ impl SourceMapExtension for SourceMap { } } } + +fn map_path_prefix(mapping: &FilePathMapping, path: &str) -> String { + // It's important that we convert to a string here because that's what + // later stages do too (e.g. in the backend), and comparing `Path` values + // won't catch some differences at the string level, e.g. "abc" and "abc/" + // compare as equal. + mapping.map_prefix(path.into()).0.to_string_lossy().to_string() +} + +#[cfg(unix)] +#[test] +fn path_prefix_remapping() { + // Relative to relative + { + let mapping = &FilePathMapping::new(vec![("abc/def".into(), "foo".into())]); + + assert_eq!(map_path_prefix(mapping, "abc/def/src/main.rs"), "foo/src/main.rs"); + assert_eq!(map_path_prefix(mapping, "abc/def"), "foo"); + } + + // Relative to absolute + { + let mapping = &FilePathMapping::new(vec![("abc/def".into(), "/foo".into())]); + + assert_eq!(map_path_prefix(mapping, "abc/def/src/main.rs"), "/foo/src/main.rs"); + assert_eq!(map_path_prefix(mapping, "abc/def"), "/foo"); + } + + // Absolute to relative + { + let mapping = &FilePathMapping::new(vec![("/abc/def".into(), "foo".into())]); + + assert_eq!(map_path_prefix(mapping, "/abc/def/src/main.rs"), "foo/src/main.rs"); + assert_eq!(map_path_prefix(mapping, "/abc/def"), "foo"); + } + + // Absolute to absolute + { + let mapping = &FilePathMapping::new(vec![("/abc/def".into(), "/foo".into())]); + + assert_eq!(map_path_prefix(mapping, "/abc/def/src/main.rs"), "/foo/src/main.rs"); + assert_eq!(map_path_prefix(mapping, "/abc/def"), "/foo"); + } +} + +#[cfg(windows)] +#[test] +fn path_prefix_remapping_from_relative2() { + // Relative to relative + { + let mapping = &FilePathMapping::new(vec![("abc\\def".into(), "foo".into())]); + + assert_eq!(map_path_prefix(mapping, "abc\\def\\src\\main.rs"), "foo\\src\\main.rs"); + assert_eq!(map_path_prefix(mapping, "abc\\def"), "foo"); + } + + // Relative to absolute + { + let mapping = &FilePathMapping::new(vec![("abc\\def".into(), "X:\\foo".into())]); + + assert_eq!(map_path_prefix(mapping, "abc\\def\\src\\main.rs"), "X:\\foo\\src\\main.rs"); + assert_eq!(map_path_prefix(mapping, "abc\\def"), "X:\\foo"); + } + + // Absolute to relative + { + let mapping = &FilePathMapping::new(vec![("X:\\abc\\def".into(), "foo".into())]); + + assert_eq!(map_path_prefix(mapping, "X:\\abc\\def\\src\\main.rs"), "foo\\src\\main.rs"); + assert_eq!(map_path_prefix(mapping, "X:\\abc\\def"), "foo"); + } + + // Absolute to absolute + { + let mapping = &FilePathMapping::new(vec![("X:\\abc\\def".into(), "X:\\foo".into())]); + + assert_eq!(map_path_prefix(mapping, "X:\\abc\\def\\src\\main.rs"), "X:\\foo\\src\\main.rs"); + assert_eq!(map_path_prefix(mapping, "X:\\abc\\def"), "X:\\foo"); + } +} |
