Auto merge of #115215 - ouz-a:mir_issue, r=lcnr
Remove assert that checks type equality https://github.com/rust-lang/rust/pull/112307 although this prevented `unsound` issues it also seems to introduce regressions https://github.com/rust-lang/rust/issues/114858 is example of this regression. I locally tested this https://github.com/rust-lang/rust/issues/114858#issuecomment-1686502262 issue and failing assert is [this](https://www.diffchecker.com/cjb7jSQm/). This is also related to https://github.com/rust-lang/rust/pull/115025
This commit is contained in:
commit
e5fedceabf
3 changed files with 53 additions and 4 deletions
|
@ -7,7 +7,6 @@ use rustc_index::IndexVec;
|
||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
use rustc_middle::ty::print::with_no_trimmed_paths;
|
use rustc_middle::ty::print::with_no_trimmed_paths;
|
||||||
use std::ops::{Index, IndexMut};
|
use std::ops::{Index, IndexMut};
|
||||||
|
|
||||||
pub(super) struct Locals<'tcx, V> {
|
pub(super) struct Locals<'tcx, V> {
|
||||||
values: IndexVec<mir::Local, LocalRef<'tcx, V>>,
|
values: IndexVec<mir::Local, LocalRef<'tcx, V>>,
|
||||||
}
|
}
|
||||||
|
@ -36,17 +35,18 @@ impl<'tcx, V> Locals<'tcx, V> {
|
||||||
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
||||||
pub(super) fn initialize_locals(&mut self, values: Vec<LocalRef<'tcx, Bx::Value>>) {
|
pub(super) fn initialize_locals(&mut self, values: Vec<LocalRef<'tcx, Bx::Value>>) {
|
||||||
assert!(self.locals.values.is_empty());
|
assert!(self.locals.values.is_empty());
|
||||||
|
// FIXME(#115215): After #115025 get's merged this might not be necessary
|
||||||
for (local, value) in values.into_iter().enumerate() {
|
for (local, value) in values.into_iter().enumerate() {
|
||||||
match value {
|
match value {
|
||||||
LocalRef::Place(_) | LocalRef::UnsizedPlace(_) | LocalRef::PendingOperand => (),
|
LocalRef::Place(_) | LocalRef::UnsizedPlace(_) | LocalRef::PendingOperand => (),
|
||||||
LocalRef::Operand(op) => {
|
LocalRef::Operand(op) => {
|
||||||
let local = mir::Local::from_usize(local);
|
let local = mir::Local::from_usize(local);
|
||||||
let expected_ty = self.monomorphize(self.mir.local_decls[local].ty);
|
let expected_ty = self.monomorphize(self.mir.local_decls[local].ty);
|
||||||
assert_eq!(expected_ty, op.layout.ty, "unexpected initial operand type");
|
if expected_ty != op.layout.ty {
|
||||||
|
warn!("Unexpected initial operand type. See the issues/114858");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.locals.values.push(value);
|
self.locals.values.push(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
48
tests/ui/codegen/subtyping-enforces-type-equality.rs
Normal file
48
tests/ui/codegen/subtyping-enforces-type-equality.rs
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
// ignore-pass
|
||||||
|
// build-pass
|
||||||
|
// edition:2021
|
||||||
|
use std::future::Future;
|
||||||
|
use std::pin::Pin;
|
||||||
|
|
||||||
|
type BoxFuture<T> = Pin<Box<dyn Future<Output = T>>>;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _ = wrapper_call(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn wrapper_call(handler: impl Handler) {
|
||||||
|
handler.call().await;
|
||||||
|
}
|
||||||
|
async fn handler() {
|
||||||
|
f(&()).await;
|
||||||
|
}
|
||||||
|
async fn f<'a>(db: impl Acquire<'a>) {
|
||||||
|
db.acquire().await;
|
||||||
|
}
|
||||||
|
|
||||||
|
trait Handler {
|
||||||
|
type Future: Future;
|
||||||
|
fn call(self) -> Self::Future;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<Fut, F> Handler for F
|
||||||
|
where
|
||||||
|
F: Fn() -> Fut,
|
||||||
|
Fut: Future,
|
||||||
|
{
|
||||||
|
type Future = Fut;
|
||||||
|
fn call(self) -> Self::Future {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trait Acquire<'a> {
|
||||||
|
type Connection;
|
||||||
|
fn acquire(self) -> BoxFuture<Self::Connection>;
|
||||||
|
}
|
||||||
|
impl<'a> Acquire<'a> for &'a () {
|
||||||
|
type Connection = Self;
|
||||||
|
fn acquire(self) -> BoxFuture<Self> {
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
}
|
1
tests/ui/codegen/subtyping-enforces-type-equality.stderr
Normal file
1
tests/ui/codegen/subtyping-enforces-type-equality.stderr
Normal file
|
@ -0,0 +1 @@
|
||||||
|
WARN rustc_codegen_ssa::mir::locals Unexpected initial operand type. See the issues/114858
|
Loading…
Add table
Reference in a new issue