Reject wrapping ranges of pattern types
This commit is contained in:
parent
f38819ce17
commit
916f9552e9
3 changed files with 41 additions and 106 deletions
|
@ -220,6 +220,34 @@ fn layout_of_uncached<'tcx>(
|
|||
.try_to_bits(tcx, cx.typing_env)
|
||||
.ok_or_else(|| error(cx, LayoutError::Unknown(ty)))?;
|
||||
|
||||
// FIXME(pattern_types): create implied bounds from pattern types in signatures
|
||||
// that require that the range end is >= the range start so that we can't hit
|
||||
// this error anymore without first having hit a trait solver error.
|
||||
// Very fuzzy on the details here, but pattern types are an internal impl detail,
|
||||
// so we can just go with this for now
|
||||
if scalar.is_signed() {
|
||||
let range = scalar.valid_range_mut();
|
||||
let start = layout.size.sign_extend(range.start);
|
||||
let end = layout.size.sign_extend(range.end);
|
||||
if end < start {
|
||||
let guar = tcx.dcx().err(format!(
|
||||
"pattern type ranges cannot wrap: {start}..={end}"
|
||||
));
|
||||
|
||||
return Err(error(cx, LayoutError::ReferencesError(guar)));
|
||||
}
|
||||
} else {
|
||||
let range = scalar.valid_range_mut();
|
||||
if range.end < range.start {
|
||||
let guar = tcx.dcx().err(format!(
|
||||
"pattern type ranges cannot wrap: {}..={}",
|
||||
range.start, range.end
|
||||
));
|
||||
|
||||
return Err(error(cx, LayoutError::ReferencesError(guar)));
|
||||
}
|
||||
};
|
||||
|
||||
let niche = Niche {
|
||||
offset: Size::ZERO,
|
||||
value: scalar.primitive(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue