fix fn_sig ice
This commit is contained in:
parent
6e63f7be54
commit
f6725c0a98
3 changed files with 28 additions and 2 deletions
|
@ -242,7 +242,7 @@ impl<'mir, 'tcx> Checker<'mir, 'tcx> {
|
||||||
// impl trait is gone in MIR, so check the return type of a const fn by its signature
|
// impl trait is gone in MIR, so check the return type of a const fn by its signature
|
||||||
// instead of the type of the return place.
|
// instead of the type of the return place.
|
||||||
self.span = body.local_decls[RETURN_PLACE].source_info.span;
|
self.span = body.local_decls[RETURN_PLACE].source_info.span;
|
||||||
let return_ty = tcx.fn_sig(def_id).output();
|
let return_ty = self.ccx.fn_sig().output();
|
||||||
self.check_local_or_return_ty(return_ty.skip_binder(), RETURN_PLACE);
|
self.check_local_or_return_ty(return_ty.skip_binder(), RETURN_PLACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ use rustc_attr as attr;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def_id::{DefId, LocalDefId};
|
use rustc_hir::def_id::{DefId, LocalDefId};
|
||||||
use rustc_middle::mir;
|
use rustc_middle::mir;
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, TyCtxt, PolyFnSig};
|
||||||
use rustc_span::Symbol;
|
use rustc_span::Symbol;
|
||||||
|
|
||||||
pub use self::qualifs::Qualif;
|
pub use self::qualifs::Qualif;
|
||||||
|
@ -64,6 +64,17 @@ impl<'mir, 'tcx> ConstCx<'mir, 'tcx> {
|
||||||
fn is_async(&self) -> bool {
|
fn is_async(&self) -> bool {
|
||||||
self.tcx.asyncness(self.def_id()).is_async()
|
self.tcx.asyncness(self.def_id()).is_async()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn fn_sig(&self) -> PolyFnSig<'tcx> {
|
||||||
|
let did = self.def_id().to_def_id();
|
||||||
|
if self.tcx.is_closure(did) {
|
||||||
|
let ty = self.tcx.type_of(did);
|
||||||
|
let ty::Closure(_, substs) = ty.kind() else { bug!("type_of closure not ty::Closure") };
|
||||||
|
substs.as_closure().sig()
|
||||||
|
} else {
|
||||||
|
self.tcx.fn_sig(did)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn rustc_allow_const_fn_unstable(
|
pub fn rustc_allow_const_fn_unstable(
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
#![feature(const_closures, const_trait_impl)]
|
||||||
|
#![allow(incomplete_features)]
|
||||||
|
|
||||||
|
trait Foo {
|
||||||
|
fn foo(&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Foo for () {
|
||||||
|
fn foo(&self) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
(const || { (()).foo() })();
|
||||||
|
//~^ ERROR: cannot call non-const fn
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue