diff --git a/crates/flux-middle/src/rty/mod.rs b/crates/flux-middle/src/rty/mod.rs index 72d0db7d0d..4b4c908b47 100644 --- a/crates/flux-middle/src/rty/mod.rs +++ b/crates/flux-middle/src/rty/mod.rs @@ -20,7 +20,7 @@ pub use expr::{ AggregateKind, AliasReft, BinOp, BoundReft, Constant, ESpan, EarlyReftParam, Expr, ExprKind, FieldProj, HoleKind, KVar, KVid, Lambda, Loc, Name, Path, UnOp, Var, }; -use flux_common::bug; +use flux_common::{bug, tracked_span_bug}; use itertools::Itertools; pub use normalize::SpecFuncDefns; use rustc_data_structures::unord::UnordMap; @@ -1321,7 +1321,7 @@ impl TyS { if let TyKind::Indexed(BaseTy::Adt(adt_def, args), idx) = self.kind() { (adt_def, args, idx) } else { - bug!("expected adt") + tracked_span_bug!("expected adt `{self:?}`") } } @@ -1559,6 +1559,15 @@ impl BaseTy { | BaseTy::Never => Sort::unit(), } } + + #[track_caller] + pub fn expect_adt(&self) -> (&AdtDef, &[GenericArg]) { + if let BaseTy::Adt(adt_def, args) = self { + (adt_def, args) + } else { + tracked_span_bug!("expected adt `{self:?}`") + } + } } impl<'tcx> ToRustc<'tcx> for BaseTy { diff --git a/crates/flux-refineck/src/checker.rs b/crates/flux-refineck/src/checker.rs index 1b685e5997..3863f62f99 100644 --- a/crates/flux-refineck/src/checker.rs +++ b/crates/flux-refineck/src/checker.rs @@ -910,7 +910,8 @@ impl<'ck, 'genv, 'tcx, M: Mode> Checker<'ck, 'genv, 'tcx, M> { let ty = env .lookup_place(&mut infcx.at(stmt_span), place) .with_span(stmt_span)?; - let (adt_def, ..) = ty.expect_adt(); + // HACK(nilehmann, mut-ref-unfolding) place should be unfolded here. + let (adt_def, ..) = ty.as_bty_skipping_existentials().unwrap().expect_adt(); Ok(Ty::discr(adt_def.clone(), place.clone())) } Rvalue::Aggregate(AggregateKind::Adt(def_id, variant_idx, args, _), operands) => {