Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 23 additions & 17 deletions compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,7 +299,7 @@ pub enum PermitVariants {

#[derive(Debug, Clone, Copy)]
enum TypeRelativePath<'tcx> {
AssocItem(DefId, GenericArgsRef<'tcx>),
AssocItem(ty::AliasTerm<'tcx>),
Variant { adt: Ty<'tcx>, variant_did: DefId },
Ctor { ctor_def_id: DefId, args: GenericArgsRef<'tcx> },
}
Expand Down Expand Up @@ -1476,15 +1476,10 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
span,
LowerTypeRelativePathMode::Type(permit_variants),
)? {
TypeRelativePath::AssocItem(def_id, args) => {
let alias_ty = ty::AliasTy::new_from_args(
tcx,
ty::AliasTyKind::new_from_def_id(tcx, def_id),
args,
);
let ty = Ty::new_alias(tcx, alias_ty);
TypeRelativePath::AssocItem(alias_term) => {
let ty = alias_term.expect_ty(tcx).to_ty(tcx);
let ty = self.check_param_uses_if_mcg(ty, span, false);
Ok((ty, tcx.def_kind(def_id), def_id))
Ok((ty, tcx.def_kind(alias_term.def_id()), alias_term.def_id()))
}
TypeRelativePath::Variant { adt, variant_did } => {
let adt = self.check_param_uses_if_mcg(adt, span, false);
Expand Down Expand Up @@ -1516,9 +1511,9 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
span,
LowerTypeRelativePathMode::Const,
)? {
TypeRelativePath::AssocItem(def_id, args) => {
self.require_type_const_attribute(def_id, span)?;
let ct = Const::new_unevaluated(tcx, ty::UnevaluatedConst::new(def_id, args));
TypeRelativePath::AssocItem(alias_term) => {
self.require_type_const_attribute(alias_term.def_id(), span)?;
let ct = Const::new_unevaluated(tcx, alias_term.expect_ct(tcx));
let ct = self.check_param_uses_if_mcg(ct, span, false);
Ok(ct)
}
Expand Down Expand Up @@ -1648,15 +1643,15 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
}

// FIXME(inherent_associated_types, #106719): Support self types other than ADTs.
if let Some((did, args)) = self.probe_inherent_assoc_item(
if let Some(alias_term) = self.probe_inherent_assoc_item(
segment,
adt_def.did(),
self_ty,
qpath_hir_id,
span,
mode.assoc_tag(),
)? {
return Ok(TypeRelativePath::AssocItem(did, args));
return Ok(TypeRelativePath::AssocItem(alias_term));
}
}

Expand Down Expand Up @@ -1690,7 +1685,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
);
}

Ok(TypeRelativePath::AssocItem(item_def_id, args))
Ok(TypeRelativePath::AssocItem(ty::AliasTerm::new_from_def_id(tcx, item_def_id, args)))
}

/// Resolve a [type-relative](hir::QPath::TypeRelative) (and type-level) path.
Expand Down Expand Up @@ -1770,7 +1765,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
block: HirId,
span: Span,
assoc_tag: ty::AssocTag,
) -> Result<Option<(DefId, GenericArgsRef<'tcx>)>, ErrorGuaranteed> {
) -> Result<Option<ty::AliasTerm<'tcx>>, ErrorGuaranteed> {
let tcx = self.tcx();

if !tcx.features().inherent_associated_types() {
Expand Down Expand Up @@ -1853,7 +1848,18 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
.chain(args.into_iter().skip(parent_args.len())),
);

Ok(Some((assoc_item, args)))
let kind = match assoc_tag {
ty::AssocTag::Type => ty::AliasTermKind::InherentTy { def_id: assoc_item },
ty::AssocTag::Const => {
// drop once `InherentConst` accepts IAC-shaped args (issue #156181)
// without this, `new_from_args` errors (#155341).
self.require_type_const_attribute(assoc_item, span)?;
ty::AliasTermKind::InherentConst { def_id: assoc_item }
}
ty::AssocTag::Fn => unreachable!(),
};

Ok(Some(ty::AliasTerm::new_from_args(tcx, kind, args)))
}

/// Given name and kind search for the assoc item in the provided scope and check if it's accessible[^1].
Expand Down
15 changes: 0 additions & 15 deletions compiler/rustc_middle/src/ty/context/impl_interner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -204,21 +204,6 @@ impl<'tcx> Interner for TyCtxt<'tcx> {
self.adt_def(adt_def_id)
}

fn alias_ty_kind_from_def_id(self, def_id: DefId) -> ty::AliasTyKind<'tcx> {
match self.def_kind(def_id) {
DefKind::AssocTy
if let DefKind::Impl { of_trait: false } = self.def_kind(self.parent(def_id)) =>
{
ty::Inherent { def_id }
}
DefKind::AssocTy => ty::Projection { def_id },

DefKind::OpaqueTy => ty::Opaque { def_id },
DefKind::TyAlias => ty::Free { def_id },
kind => bug!("unexpected DefKind in AliasTy: {kind:?}"),
}
}

fn alias_term_kind_from_def_id(self, def_id: DefId) -> ty::AliasTermKind<'tcx> {
match self.def_kind(def_id) {
DefKind::AssocTy => {
Expand Down
2 changes: 0 additions & 2 deletions compiler/rustc_type_ir/src/interner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,6 @@ pub trait Interner:
type AdtDef: AdtDef<Self>;
fn adt_def(self, adt_def_id: Self::AdtId) -> Self::AdtDef;

fn alias_ty_kind_from_def_id(self, def_id: Self::DefId) -> ty::AliasTyKind<Self>;

// FIXME: remove in favor of explicit construction
fn alias_term_kind_from_def_id(self, def_id: Self::DefId) -> ty::AliasTermKind<Self>;

Expand Down
4 changes: 0 additions & 4 deletions compiler/rustc_type_ir/src/ty_kind.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,10 +65,6 @@ pub enum AliasTyKind<I: Interner> {
}

impl<I: Interner> AliasTyKind<I> {
pub fn new_from_def_id(interner: I, def_id: I::DefId) -> Self {
interner.alias_ty_kind_from_def_id(def_id)
}

pub fn descr(self) -> &'static str {
match self {
AliasTyKind::Projection { .. } => "associated type",
Expand Down
12 changes: 7 additions & 5 deletions src/tools/clippy/clippy_utils/src/ty/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1048,11 +1048,13 @@ pub fn make_projection<'tcx>(
#[cfg(debug_assertions)]
assert_generic_args_match(tcx, assoc_item.def_id, args);

Some(AliasTy::new_from_args(
tcx,
ty::AliasTyKind::new_from_def_id(tcx, assoc_item.def_id),
args,
))
let kind = if let DefKind::Impl { of_trait: false } = tcx.def_kind(tcx.parent(assoc_item.def_id)) {
ty::AliasTyKind::Inherent { def_id: assoc_item.def_id }
} else {
ty::AliasTyKind::Projection { def_id: assoc_item.def_id }
};

Some(AliasTy::new_from_args(tcx, kind, args))
}
helper(
tcx,
Expand Down
Loading