Skip to content

Commit

Permalink
Auto merge of #115215 - ouz-a:mir_issue, r=lcnr
Browse files Browse the repository at this point in the history
Remove assert that checks type equality

#112307 although this prevented `unsound` issues it also seems to introduce regressions #114858 is example of this regression. I locally tested this #114858 (comment) issue and failing assert is [this](https://www.diffchecker.com/cjb7jSQm/).

This is also related to #115025
  • Loading branch information
bors committed Sep 12, 2023
2 parents 5f6ee65 + 3ec0165 commit e5fedce
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 4 deletions.
8 changes: 4 additions & 4 deletions compiler/rustc_codegen_ssa/src/mir/locals.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ use rustc_index::IndexVec;
use rustc_middle::mir;
use rustc_middle::ty::print::with_no_trimmed_paths;
use std::ops::{Index, IndexMut};

pub(super) struct Locals<'tcx, V> {
values: IndexVec<mir::Local, LocalRef<'tcx, V>>,
}
Expand Down Expand Up @@ -36,17 +35,18 @@ impl<'tcx, V> Locals<'tcx, V> {
impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
pub(super) fn initialize_locals(&mut self, values: Vec<LocalRef<'tcx, Bx::Value>>) {
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() {
match value {
LocalRef::Place(_) | LocalRef::UnsizedPlace(_) | LocalRef::PendingOperand => (),
LocalRef::Operand(op) => {
let local = mir::Local::from_usize(local);
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);
}
}
Expand Down
48 changes: 48 additions & 0 deletions tests/ui/codegen/subtyping-enforces-type-equality.rs
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions tests/ui/codegen/subtyping-enforces-type-equality.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
WARN rustc_codegen_ssa::mir::locals Unexpected initial operand type. See the issues/114858

0 comments on commit e5fedce

Please sign in to comment.