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(..)
|
||||
)
|
||||
}
|
||||
// None of the possible types have lifetimes, so we can just compare
|
||||
// directly
|
||||
if a != b {
|
||||
// The function pointer types can have lifetimes
|
||||
if !self.mir_assign_valid_types(a, b) {
|
||||
self.fail(
|
||||
location,
|
||||
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,
|
||||
// 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));
|
||||
}
|
||||
|
||||
|
|
|
@ -2518,7 +2518,8 @@ pub enum Rvalue<'tcx> {
|
|||
/// * `Offset` has the same semantics as [`offset`](pointer::offset), except that the second
|
||||
/// parameter may be a `usize` as well.
|
||||
/// * 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
|
||||
/// same type and return a value of the same type as their LHS. Like in Rust, the RHS is
|
||||
/// 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