about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-10-29 08:54:30 -0700
committerGitHub <noreply@github.com>2016-10-29 08:54:30 -0700
commit69d364bc4fa44b9224e10d0a182e14800e3ed1e9 (patch)
treea59bc3bd02bd1c74b2aa6ed29383232a59afe851
parent75a87c54d0d6a2fa0d5a576a2fa6e03ff23e5f03 (diff)
parent3f639a0f11eda43d9a31ef407eaac793dd038a43 (diff)
Auto merge of #37449 - pnkfelix:fix-issue-37274, r=eddyb
Do not intern filemap to entry w/ mismatched length.

Do not intern filemap to entry w/ mismatched length.

Fix #37274 (I think).

Beta-nominated; note that only the second commit needs to be cherry picked to beta branch. (The first just adds some debug instrumentation that I wish had been present.)
-rw-r--r--src/librustc_metadata/decoder.rs18
-rw-r--r--src/libsyntax_pos/lib.rs3
2 files changed, 21 insertions, 0 deletions
diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs
index 0d42ff8ce27..7f36fa59830 100644
--- a/src/librustc_metadata/decoder.rs
+++ b/src/librustc_metadata/decoder.rs
@@ -1138,6 +1138,14 @@ impl<'a, 'tcx> CrateMetadata {
 
                 match reusable_filemap {
                     Some(fm) => {
+
+                        debug!("CrateMetaData::imported_filemaps reuse \
+                                filemap {:?} original (start_pos {:?} end_pos {:?}) \
+                                translated (start_pos {:?} end_pos {:?})",
+                               filemap_to_import.name,
+                               filemap_to_import.start_pos, filemap_to_import.end_pos,
+                               fm.start_pos, fm.end_pos);
+
                         cstore::ImportedFileMap {
                             original_start_pos: filemap_to_import.start_pos,
                             original_end_pos: filemap_to_import.end_pos,
@@ -1176,6 +1184,12 @@ impl<'a, 'tcx> CrateMetadata {
                                                                                source_length,
                                                                                lines,
                                                                                multibyte_chars);
+                        debug!("CrateMetaData::imported_filemaps alloc \
+                                filemap {:?} original (start_pos {:?} end_pos {:?}) \
+                                translated (start_pos {:?} end_pos {:?})",
+                               local_version.name, start_pos, end_pos,
+                               local_version.start_pos, local_version.end_pos);
+
                         cstore::ImportedFileMap {
                             original_start_pos: start_pos,
                             original_end_pos: end_pos,
@@ -1193,6 +1207,10 @@ impl<'a, 'tcx> CrateMetadata {
 }
 
 fn are_equal_modulo_startpos(fm1: &syntax_pos::FileMap, fm2: &syntax_pos::FileMap) -> bool {
+    if fm1.byte_length() != fm2.byte_length() {
+        return false;
+    }
+
     if fm1.name != fm2.name {
         return false;
     }
diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs
index e3feaee5369..d83d3a6c5cf 100644
--- a/src/libsyntax_pos/lib.rs
+++ b/src/libsyntax_pos/lib.rs
@@ -481,6 +481,9 @@ impl FileMap {
         self.src.is_none()
     }
 
+    pub fn byte_length(&self) -> u32 {
+        self.end_pos.0 - self.start_pos.0
+    }
     pub fn count_lines(&self) -> usize {
         self.lines.borrow().len()
     }