Rollup merge of #96004 - JakobDegen:fix-validator-ice, r=petrochenkov
Consider lifetimes when comparing types for equality in MIR validator Closes #95978 .
This commit is contained in:
commit
fd7a1f153d
3 changed files with 15 additions and 5 deletions
|
@ -315,9 +315,8 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
||||||
| ty::FnPtr(..)
|
| ty::FnPtr(..)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
// None of the possible types have lifetimes, so we can just compare
|
// The function pointer types can have lifetimes
|
||||||
// directly
|
if !self.mir_assign_valid_types(a, b) {
|
||||||
if a != b {
|
|
||||||
self.fail(
|
self.fail(
|
||||||
location,
|
location,
|
||||||
format!("Cannot compare unequal types {:?} and {:?}", a, b),
|
format!("Cannot compare unequal types {:?} and {:?}", a, b),
|
||||||
|
@ -464,7 +463,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
||||||
};
|
};
|
||||||
// since CopyNonOverlapping is parametrized by 1 type,
|
// since CopyNonOverlapping is parametrized by 1 type,
|
||||||
// we only need to check that they are equal and not keep an extra parameter.
|
// we only need to check that they are equal and not keep an extra parameter.
|
||||||
if op_src_ty != op_dst_ty {
|
if !self.mir_assign_valid_types(op_src_ty, op_dst_ty) {
|
||||||
self.fail(location, format!("bad arg ({:?} != {:?})", op_src_ty, op_dst_ty));
|
self.fail(location, format!("bad arg ({:?} != {:?})", op_src_ty, op_dst_ty));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2518,7 +2518,8 @@ pub enum Rvalue<'tcx> {
|
||||||
/// * `Offset` has the same semantics as [`offset`](pointer::offset), except that the second
|
/// * `Offset` has the same semantics as [`offset`](pointer::offset), except that the second
|
||||||
/// parameter may be a `usize` as well.
|
/// parameter may be a `usize` as well.
|
||||||
/// * The comparison operations accept `bool`s, `char`s, signed or unsigned integers, floats,
|
/// * The comparison operations accept `bool`s, `char`s, signed or unsigned integers, floats,
|
||||||
/// raw pointers, or function pointers of matching types and return a `bool`.
|
/// raw pointers, or function pointers and return a `bool`. The types of the operands must be
|
||||||
|
/// matching, up to the usual caveat of the lifetimes in function pointers.
|
||||||
/// * Left and right shift operations accept signed or unsigned integers not necessarily of the
|
/// * Left and right shift operations accept signed or unsigned integers not necessarily of the
|
||||||
/// same type and return a value of the same type as their LHS. Like in Rust, the RHS is
|
/// same type and return a value of the same type as their LHS. Like in Rust, the RHS is
|
||||||
/// truncated as needed.
|
/// truncated as needed.
|
||||||
|
|
10
src/test/ui/mir/issue-95978-validator-lifetime-comparison.rs
Normal file
10
src/test/ui/mir/issue-95978-validator-lifetime-comparison.rs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
// check-pass
|
||||||
|
// compile-flags: -Zvalidate-mir
|
||||||
|
|
||||||
|
fn foo(_a: &str) {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x = foo as fn(&'static str);
|
||||||
|
|
||||||
|
let _ = x == foo;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue