incr.comp.: Make Span decoding more consistent so it doesn't mess up -Zincremental-verify-ich
This commit is contained in:
parent
1c0e611dff
commit
f5bd1ca678
1 changed files with 21 additions and 13 deletions
|
@ -273,25 +273,23 @@ impl<'a, 'tcx> SpecializedDecoder<Span> for DecodeContext<'a, 'tcx> {
|
||||||
let lo = BytePos::decode(self)?;
|
let lo = BytePos::decode(self)?;
|
||||||
let hi = BytePos::decode(self)?;
|
let hi = BytePos::decode(self)?;
|
||||||
|
|
||||||
|
if lo == BytePos(0) && hi == BytePos(0) {
|
||||||
|
// Don't try to rebase DUMMY_SP. Otherwise it will look like a valid
|
||||||
|
// Span again.
|
||||||
|
return Ok(DUMMY_SP)
|
||||||
|
}
|
||||||
|
|
||||||
|
if hi < lo {
|
||||||
|
// Consistently map invalid spans to DUMMY_SP.
|
||||||
|
return Ok(DUMMY_SP)
|
||||||
|
}
|
||||||
|
|
||||||
let sess = if let Some(sess) = self.sess {
|
let sess = if let Some(sess) = self.sess {
|
||||||
sess
|
sess
|
||||||
} else {
|
} else {
|
||||||
bug!("Cannot decode Span without Session.")
|
bug!("Cannot decode Span without Session.")
|
||||||
};
|
};
|
||||||
|
|
||||||
let (lo, hi) = if lo > hi {
|
|
||||||
// Currently macro expansion sometimes produces invalid Span values
|
|
||||||
// where lo > hi. In order not to crash the compiler when trying to
|
|
||||||
// translate these values, let's transform them into something we
|
|
||||||
// can handle (and which will produce useful debug locations at
|
|
||||||
// least some of the time).
|
|
||||||
// This workaround is only necessary as long as macro expansion is
|
|
||||||
// not fixed. FIXME(#23480)
|
|
||||||
(lo, lo)
|
|
||||||
} else {
|
|
||||||
(lo, hi)
|
|
||||||
};
|
|
||||||
|
|
||||||
let imported_filemaps = self.cdata().imported_filemaps(&sess.codemap());
|
let imported_filemaps = self.cdata().imported_filemaps(&sess.codemap());
|
||||||
let filemap = {
|
let filemap = {
|
||||||
// Optimize for the case that most spans within a translated item
|
// Optimize for the case that most spans within a translated item
|
||||||
|
@ -321,6 +319,16 @@ impl<'a, 'tcx> SpecializedDecoder<Span> for DecodeContext<'a, 'tcx> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Make sure our binary search above is correct.
|
||||||
|
debug_assert!(lo >= filemap.original_start_pos &&
|
||||||
|
lo <= filemap.original_end_pos);
|
||||||
|
|
||||||
|
if hi < filemap.original_start_pos || hi > filemap.original_end_pos {
|
||||||
|
// `hi` points to a different FileMap than `lo` which is invalid.
|
||||||
|
// Again, map invalid Spans to DUMMY_SP.
|
||||||
|
return Ok(DUMMY_SP)
|
||||||
|
}
|
||||||
|
|
||||||
let lo = (lo + filemap.translated_filemap.start_pos) - filemap.original_start_pos;
|
let lo = (lo + filemap.translated_filemap.start_pos) - filemap.original_start_pos;
|
||||||
let hi = (hi + filemap.translated_filemap.start_pos) - filemap.original_start_pos;
|
let hi = (hi + filemap.translated_filemap.start_pos) - filemap.original_start_pos;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue