提交 03f563a0 编写于 作者: B bors

Auto merge of #24109 - sanxiyn:diverging-closure, r=pnkfelix

Fix #23896.
......@@ -477,7 +477,7 @@ pub fn closure_trait_ref_and_return_type<'tcx>(
def_id: fn_trait_def_id,
substs: tcx.mk_substs(trait_substs),
});
ty::Binder((trait_ref, sig.0.output.unwrap()))
ty::Binder((trait_ref, sig.0.output.unwrap_or(ty::mk_nil(tcx))))
}
impl<'tcx,O:Repr<'tcx>> Repr<'tcx> for super::Obligation<'tcx, O> {
......
......@@ -1092,6 +1092,13 @@ pub fn unwrap(self) -> Ty<'tcx> {
ty::FnDiverging => unreachable!()
}
}
pub fn unwrap_or(self, def: Ty<'tcx>) -> Ty<'tcx> {
match self {
ty::FnConverging(t) => t,
ty::FnDiverging => def
}
}
}
pub type PolyFnOutput<'tcx> = Binder<FnOutput<'tcx>>;
......
......@@ -387,10 +387,11 @@ fn resolve<'a>(&mut self, fcx: &FnCtxt<'a,'tcx>) {
demand::eqtype(fcx, self.call_expr.span, self_arg_ty, method_arg_ty);
}
let nilty = ty::mk_nil(fcx.tcx());
demand::eqtype(fcx,
self.call_expr.span,
method_sig.output.unwrap(),
self.fn_sig.output.unwrap());
method_sig.output.unwrap_or(nilty),
self.fn_sig.output.unwrap_or(nilty));
write_overloaded_call_method_map(fcx, self.call_expr, method_callee);
}
......
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// error-pattern:oops
fn main() {
let func = || -> ! {
panic!("oops");
};
func();
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册