Auto merge of #135186 - camelid:const-path-multi, r=BoxyUwU
mgca: Lower all const paths as `ConstArgKind::Path` When `#![feature(min_generic_const_args)]` is enabled, we now lower all const paths in generic arg position to `hir::ConstArgKind::Path`. We then lower assoc const paths to `ty::ConstKind::Unevaluated` since we can no longer use the anon const expression lowering machinery. In the process of implementing this, I factored out `hir_ty_lowering` code that is now shared between lowering assoc types and assoc consts. This PR also introduces a `#[type_const]` attribute for trait assoc consts that are allowed as const args. However, we still need to implement code to check that assoc const definitions satisfy `#[type_const]` if present (basically is it a const path or a monomorphic anon const). r? `@BoxyUwU`
This commit is contained in:
commit
08db600e8e
35 changed files with 602 additions and 148 deletions
|
@ -3,7 +3,7 @@ use rustc_hir as hir;
|
|||
use rustc_hir::def::{DefKind, Namespace};
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_macros::{Decodable, Encodable, HashStable};
|
||||
use rustc_span::{Ident, Symbol};
|
||||
use rustc_span::{Ident, Symbol, sym};
|
||||
|
||||
use super::{TyCtxt, Visibility};
|
||||
use crate::ty;
|
||||
|
@ -108,6 +108,24 @@ impl AssocItem {
|
|||
pub fn is_impl_trait_in_trait(&self) -> bool {
|
||||
self.opt_rpitit_info.is_some()
|
||||
}
|
||||
|
||||
/// Returns true if:
|
||||
/// - This trait associated item has the `#[type_const]` attribute,
|
||||
/// - If it is in a trait impl, the item from the original trait has this attribute, or
|
||||
/// - It is an inherent assoc const.
|
||||
pub fn is_type_const_capable(&self, tcx: TyCtxt<'_>) -> bool {
|
||||
if self.kind != ty::AssocKind::Const {
|
||||
return false;
|
||||
}
|
||||
|
||||
let def_id = match (self.container, self.trait_item_def_id) {
|
||||
(AssocItemContainer::Trait, _) => self.def_id,
|
||||
(AssocItemContainer::Impl, Some(trait_item_did)) => trait_item_did,
|
||||
// Inherent impl but this attr is only applied to trait assoc items.
|
||||
(AssocItemContainer::Impl, None) => return true,
|
||||
};
|
||||
tcx.has_attr(def_id, sym::type_const)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Debug, HashStable, Eq, Hash, Encodable, Decodable)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue