mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
Methods of const traits are const
This commit is contained in:
parent
2776bdfe42
commit
a61cd86a4e
@ -4,14 +4,18 @@ use rustc_hir::def_id::{DefId, LocalDefId};
|
||||
use rustc_middle::query::Providers;
|
||||
use rustc_middle::ty::TyCtxt;
|
||||
|
||||
fn parent_impl_constness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Constness {
|
||||
fn parent_impl_or_trait_constness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Constness {
|
||||
let parent_id = tcx.local_parent(def_id);
|
||||
if matches!(tcx.def_kind(parent_id), DefKind::Impl { .. })
|
||||
&& let Some(header) = tcx.impl_trait_header(parent_id)
|
||||
{
|
||||
header.constness
|
||||
} else {
|
||||
hir::Constness::NotConst
|
||||
match tcx.def_kind(parent_id) {
|
||||
DefKind::Impl { of_trait: true } => tcx.impl_trait_header(parent_id).unwrap().constness,
|
||||
DefKind::Trait => {
|
||||
if tcx.is_const_trait(parent_id.into()) {
|
||||
hir::Constness::Const
|
||||
} else {
|
||||
hir::Constness::NotConst
|
||||
}
|
||||
}
|
||||
_ => hir::Constness::NotConst,
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,7 +38,7 @@ fn constness(tcx: TyCtxt<'_>, def_id: LocalDefId) -> hir::Constness {
|
||||
|
||||
// If the function itself is not annotated with `const`, it may still be a `const fn`
|
||||
// if it resides in a const trait impl.
|
||||
parent_impl_constness(tcx, def_id)
|
||||
parent_impl_or_trait_constness(tcx, def_id)
|
||||
} else {
|
||||
tcx.dcx().span_bug(
|
||||
tcx.def_span(def_id),
|
||||
|
@ -360,10 +360,7 @@ impl<'tcx> interpret::Machine<'tcx> for CompileTimeMachine<'tcx> {
|
||||
// sensitive check here. But we can at least rule out functions that are not const at
|
||||
// all. That said, we have to allow calling functions inside a trait marked with
|
||||
// #[const_trait]. These *are* const-checked!
|
||||
// FIXME(const_trait_impl): why does `is_const_fn` not classify them as const?
|
||||
if (!ecx.tcx.is_const_fn(def) && !ecx.tcx.is_const_default_method(def))
|
||||
|| ecx.tcx.has_attr(def, sym::rustc_do_not_const_check)
|
||||
{
|
||||
if !ecx.tcx.is_const_fn(def) || ecx.tcx.has_attr(def, sym::rustc_do_not_const_check) {
|
||||
// We certainly do *not* want to actually call the fn
|
||||
// though, so be sure we return here.
|
||||
throw_unsup_format!("calling non-const function `{}`", instance)
|
||||
|
Loading…
Reference in New Issue
Block a user