/// in scope, but a separate set of locals.
pub promoted: IndexVec<Promoted, Mir<'tcx>>,
- /// Return type of the function.
- pub return_ty: Ty<'tcx>,
-
/// Yield type of the function, if it is a generator.
pub yield_ty: Option<Ty<'tcx>>,
visibility_scope_info: ClearOnDecode<IndexVec<VisibilityScope,
VisibilityScopeInfo>>,
promoted: IndexVec<Promoted, Mir<'tcx>>,
- return_ty: Ty<'tcx>,
yield_ty: Option<Ty<'tcx>>,
local_decls: IndexVec<Local, LocalDecl<'tcx>>,
arg_count: usize,
// We need `arg_count` locals, and one for the return pointer
assert!(local_decls.len() >= arg_count + 1,
"expected at least {} locals, got {}", arg_count + 1, local_decls.len());
- assert_eq!(local_decls[RETURN_POINTER].ty, return_ty);
Mir {
basic_blocks,
visibility_scopes,
visibility_scope_info,
promoted,
- return_ty,
yield_ty,
generator_drop: None,
generator_layout: None,
&block.terminator().source_info
}
}
+
+ /// Return the return type, it always return first element from `local_decls` array
+ pub fn return_ty(&self) -> Ty<'tcx> {
+ self.local_decls[RETURN_POINTER].ty
+ }
}
#[derive(Clone, Debug)]
visibility_scopes,
visibility_scope_info,
promoted,
- return_ty,
yield_ty,
generator_drop,
generator_layout,
visibility_scopes: self.visibility_scopes.clone(),
visibility_scope_info: self.visibility_scope_info.clone(),
promoted: self.promoted.fold_with(folder),
- return_ty: self.return_ty.fold_with(folder),
yield_ty: self.yield_ty.fold_with(folder),
generator_drop: self.generator_drop.fold_with(folder),
generator_layout: self.generator_layout.fold_with(folder),
self.generator_layout.visit_with(visitor) ||
self.yield_ty.visit_with(visitor) ||
self.promoted.visit_with(visitor) ||
- self.return_ty.visit_with(visitor) ||
self.local_decls.visit_with(visitor)
}
}
self.visit_visibility_scope_data(scope);
}
- self.visit_ty(&$($mutability)* mir.return_ty, TyContext::ReturnTy(SourceInfo {
+ self.visit_ty(&$($mutability)* mir.return_ty(), TyContext::ReturnTy(SourceInfo {
span: mir.span,
scope: ARGUMENT_VISIBILITY_SCOPE,
}));
}).collect()
});
- let mut mir = builder.finish(upvar_decls, return_ty, yield_ty);
+ let mut mir = builder.finish(upvar_decls, yield_ty);
mir.spread_arg = spread_arg;
mir
}
// Constants can't `return` so a return block should not be created.
assert_eq!(builder.cached_return_block, None);
- builder.finish(vec![], ty, None)
+ builder.finish(vec![], None)
}
fn construct_error<'a, 'gcx, 'tcx>(hir: Cx<'a, 'gcx, 'tcx>,
let mut builder = Builder::new(hir, span, 0, Safety::Safe, ty);
let source_info = builder.source_info(span);
builder.cfg.terminate(START_BLOCK, source_info, TerminatorKind::Unreachable);
- builder.finish(vec![], ty, None)
+ builder.finish(vec![], None)
}
impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
fn finish(self,
upvar_decls: Vec<UpvarDecl>,
- return_ty: Ty<'tcx>,
yield_ty: Option<Ty<'tcx>>)
-> Mir<'tcx> {
for (index, block) in self.cfg.basic_blocks.iter().enumerate() {
self.visibility_scopes,
ClearOnDecode::Set(self.visibility_scope_info),
IndexVec::new(),
- return_ty,
yield_ty,
self.local_decls,
self.arg_count,
),
ClearOnDecode::Clear,
IndexVec::new(),
- sig.output(),
None,
local_decls_for_sig(&sig, span),
sig.inputs().len(),
),
ClearOnDecode::Clear,
IndexVec::new(),
- self.sig.output(),
None,
self.local_decls,
self.sig.inputs().len(),
),
ClearOnDecode::Clear,
IndexVec::new(),
- sig.output(),
None,
local_decls,
sig.inputs().len(),
),
ClearOnDecode::Clear,
IndexVec::new(),
- sig.output(),
None,
local_decls,
sig.inputs().len(),
}
// Replace the return variable
- mir.return_ty = tcx.mk_nil();
mir.local_decls[RETURN_POINTER] = LocalDecl {
mutability: Mutability::Mut,
ty: tcx.mk_nil(),
let state_did = tcx.lang_items().gen_state().unwrap();
let state_adt_ref = tcx.adt_def(state_did);
let state_substs = tcx.mk_substs([Kind::from(yield_ty),
- Kind::from(mir.return_ty)].iter());
+ Kind::from(mir.return_ty())].iter());
let ret_ty = tcx.mk_adt(state_adt_ref, state_substs);
// We rename RETURN_POINTER which has type mir.return_ty to new_ret_local
transform.visit_mir(mir);
// Update our MIR struct to reflect the changed we've made
- mir.return_ty = ret_ty;
mir.yield_ty = None;
mir.arg_count = 1;
mir.spread_arg = None;
let span = self.promoted.span;
let new_operand = Operand::Constant(box Constant {
span,
- ty: self.promoted.return_ty,
+ ty: self.promoted.return_ty(),
literal: Literal::Promoted {
index: Promoted::new(self.source.promoted.len())
}
mir.visibility_scopes.clone(),
mir.visibility_scope_info.clone(),
IndexVec::new(),
- ty,
None,
initial_locals,
0,
// conservative type qualification instead.
if self.qualif.intersects(Qualif::CONST_ERROR) {
self.qualif = Qualif::empty();
- let return_ty = mir.return_ty;
+ let return_ty = mir.return_ty();
self.add_type(return_ty);
}
// performing the steal.
let mir = &tcx.mir_const(def_id).borrow();
- if mir.return_ty.references_error() {
+ if mir.return_ty().references_error() {
tcx.sess.delay_span_bug(mir.span, "mir_const_qualif: Mir had errors");
return (Qualif::NOT_CONST.bits(), Rc::new(IdxSetBuf::new_empty(0)));
}
src: MirSource,
mir: &mut Mir<'tcx>) {
// There's not really any point in promoting errorful MIR.
- if mir.return_ty.references_error() {
+ if mir.return_ty().references_error() {
tcx.sess.delay_span_bug(mir.span, "QualifyAndPromoteConstants: Mir had errors");
return;
}
return;
}
}
- let ty = mir.return_ty;
+ let ty = mir.return_ty();
tcx.infer_ctxt().enter(|infcx| {
let param_env = ty::ParamEnv::empty(Reveal::UserFacing);
let cause = traits::ObligationCause::new(mir.span, id, traits::SharedStatic);
}
fn visit_mir(&mut self, mir: &Mir<'tcx>) {
- self.sanitize_type(&"return type", mir.return_ty);
+ self.sanitize_type(&"return type", mir.return_ty());
for local_decl in &mir.local_decls {
self.sanitize_type(local_decl, local_decl.ty);
}
write!(w, "{:?}: {}", Lvalue::Local(arg), escape(&mir.local_decls[arg].ty))?;
}
- write!(w, ") -> {}", escape(mir.return_ty))?;
+ write!(w, ") -> {}", escape(mir.return_ty()))?;
write!(w, r#"<br align="left"/>"#)?;
for local in mir.vars_and_temps_iter() {
write!(w, "{:?}: {}", Lvalue::Local(arg), mir.local_decls[arg].ty)?;
}
- write!(w, ") -> {}", mir.return_ty)
+ write!(w, ") -> {}", mir.return_ty())
}
(hir::BodyOwnerKind::Const, _) |
(hir::BodyOwnerKind::Static(_), _) |
(_, Some(_)) => {
assert_eq!(mir.arg_count, 0);
- write!(w, ": {} =", mir.return_ty)
+ write!(w, ": {} =", mir.return_ty())
}
}
}