Rollup merge of #142678 - BoxyUwU:gai_cleanup, r=nnethercote
Misc cleanups of `generic_arg_infer` related HIR logic r? ````@nnethercote````
This commit is contained in:
@@ -311,7 +311,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
|
||||
);
|
||||
|
||||
self.with_parent(const_arg.hir_id, |this| {
|
||||
intravisit::walk_ambig_const_arg(this, const_arg);
|
||||
intravisit::walk_const_arg(this, const_arg);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -412,10 +412,8 @@ impl<'hir> PathSegment<'hir> {
|
||||
/// that are [just paths](ConstArgKind::Path) (currently just bare const params)
|
||||
/// versus const args that are literals or have arbitrary computations (e.g., `{ 1 + 3 }`).
|
||||
///
|
||||
/// The `Unambig` generic parameter represents whether the position this const is from is
|
||||
/// unambiguously a const or ambiguous as to whether it is a type or a const. When in an
|
||||
/// ambiguous context the parameter is instantiated with an uninhabited type making the
|
||||
/// [`ConstArgKind::Infer`] variant unusable and [`GenericArg::Infer`] is used instead.
|
||||
/// For an explanation of the `Unambig` generic parameter see the dev-guide:
|
||||
/// <https://rustc-dev-guide.rust-lang.org/hir/ambig-unambig-ty-and-consts.html>
|
||||
#[derive(Clone, Copy, Debug, HashStable_Generic)]
|
||||
#[repr(C)]
|
||||
pub struct ConstArg<'hir, Unambig = ()> {
|
||||
@@ -427,7 +425,7 @@ pub struct ConstArg<'hir, Unambig = ()> {
|
||||
impl<'hir> ConstArg<'hir, AmbigArg> {
|
||||
/// Converts a `ConstArg` in an ambiguous position to one in an unambiguous position.
|
||||
///
|
||||
/// Functions accepting an unambiguous consts may expect the [`ConstArgKind::Infer`] variant
|
||||
/// Functions accepting unambiguous consts may expect the [`ConstArgKind::Infer`] variant
|
||||
/// to be used. Care should be taken to separately handle infer consts when calling this
|
||||
/// function as it cannot be handled by downstream code making use of the returned const.
|
||||
///
|
||||
@@ -3314,14 +3312,12 @@ impl<'hir> AssocItemConstraintKind<'hir> {
|
||||
#[derive(Debug, Clone, Copy, HashStable_Generic)]
|
||||
pub enum AmbigArg {}
|
||||
|
||||
#[derive(Debug, Clone, Copy, HashStable_Generic)]
|
||||
#[repr(C)]
|
||||
/// Represents a type in the `HIR`.
|
||||
///
|
||||
/// The `Unambig` generic parameter represents whether the position this type is from is
|
||||
/// unambiguously a type or ambiguous as to whether it is a type or a const. When in an
|
||||
/// ambiguous context the parameter is instantiated with an uninhabited type making the
|
||||
/// [`TyKind::Infer`] variant unusable and [`GenericArg::Infer`] is used instead.
|
||||
/// For an explanation of the `Unambig` generic parameter see the dev-guide:
|
||||
/// <https://rustc-dev-guide.rust-lang.org/hir/ambig-unambig-ty-and-consts.html>
|
||||
#[derive(Debug, Clone, Copy, HashStable_Generic)]
|
||||
#[repr(C)]
|
||||
pub struct Ty<'hir, Unambig = ()> {
|
||||
#[stable_hasher(ignore)]
|
||||
pub hir_id: HirId,
|
||||
@@ -3656,9 +3652,12 @@ pub enum InferDelegationKind {
|
||||
}
|
||||
|
||||
/// The various kinds of types recognized by the compiler.
|
||||
#[derive(Debug, Clone, Copy, HashStable_Generic)]
|
||||
///
|
||||
/// For an explanation of the `Unambig` generic parameter see the dev-guide:
|
||||
/// <https://rustc-dev-guide.rust-lang.org/hir/ambig-unambig-ty-and-consts.html>
|
||||
// SAFETY: `repr(u8)` is required so that `TyKind<()>` and `TyKind<!>` are layout compatible
|
||||
#[repr(u8, C)]
|
||||
#[derive(Debug, Clone, Copy, HashStable_Generic)]
|
||||
pub enum TyKind<'hir, Unambig = ()> {
|
||||
/// Actual type should be inherited from `DefId` signature
|
||||
InferDelegation(DefId, InferDelegationKind),
|
||||
|
||||
@@ -364,9 +364,6 @@ pub trait Visitor<'v>: Sized {
|
||||
/// All types are treated as ambiguous types for the purposes of hir visiting in
|
||||
/// order to ensure that visitors can handle infer vars without it being too error-prone.
|
||||
///
|
||||
/// See the doc comments on [`Ty`] for an explanation of what it means for a type to be
|
||||
/// ambiguous.
|
||||
///
|
||||
/// The [`Visitor::visit_infer`] method should be overridden in order to handle infer vars.
|
||||
fn visit_ty(&mut self, t: &'v Ty<'v, AmbigArg>) -> Self::Result {
|
||||
walk_ty(self, t)
|
||||
@@ -375,12 +372,9 @@ pub trait Visitor<'v>: Sized {
|
||||
/// All consts are treated as ambiguous consts for the purposes of hir visiting in
|
||||
/// order to ensure that visitors can handle infer vars without it being too error-prone.
|
||||
///
|
||||
/// See the doc comments on [`ConstArg`] for an explanation of what it means for a const to be
|
||||
/// ambiguous.
|
||||
///
|
||||
/// The [`Visitor::visit_infer`] method should be overridden in order to handle infer vars.
|
||||
fn visit_const_arg(&mut self, c: &'v ConstArg<'v, AmbigArg>) -> Self::Result {
|
||||
walk_ambig_const_arg(self, c)
|
||||
walk_const_arg(self, c)
|
||||
}
|
||||
|
||||
#[allow(unused_variables)]
|
||||
@@ -522,7 +516,7 @@ pub trait VisitorExt<'v>: Visitor<'v> {
|
||||
/// Named `visit_const_arg_unambig` instead of `visit_unambig_const_arg` to aid in
|
||||
/// discovery by IDes when `v.visit_const_arg` is written.
|
||||
fn visit_const_arg_unambig(&mut self, c: &'v ConstArg<'v>) -> Self::Result {
|
||||
walk_const_arg(self, c)
|
||||
walk_unambig_const_arg(self, c)
|
||||
}
|
||||
}
|
||||
impl<'v, V: Visitor<'v>> VisitorExt<'v> for V {}
|
||||
@@ -985,7 +979,6 @@ pub fn walk_unambig_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty<'v>) ->
|
||||
Some(ambig_ty) => visitor.visit_ty(ambig_ty),
|
||||
None => {
|
||||
let Ty { hir_id, span, kind: _ } = typ;
|
||||
try_visit!(visitor.visit_id(*hir_id));
|
||||
visitor.visit_infer(*hir_id, *span, InferKind::Ty(typ))
|
||||
}
|
||||
}
|
||||
@@ -1043,7 +1036,7 @@ pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty<'v, AmbigArg>) -
|
||||
V::Result::output()
|
||||
}
|
||||
|
||||
pub fn walk_const_arg<'v, V: Visitor<'v>>(
|
||||
pub fn walk_unambig_const_arg<'v, V: Visitor<'v>>(
|
||||
visitor: &mut V,
|
||||
const_arg: &'v ConstArg<'v>,
|
||||
) -> V::Result {
|
||||
@@ -1051,13 +1044,12 @@ pub fn walk_const_arg<'v, V: Visitor<'v>>(
|
||||
Some(ambig_ct) => visitor.visit_const_arg(ambig_ct),
|
||||
None => {
|
||||
let ConstArg { hir_id, kind: _ } = const_arg;
|
||||
try_visit!(visitor.visit_id(*hir_id));
|
||||
visitor.visit_infer(*hir_id, const_arg.span(), InferKind::Const(const_arg))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn walk_ambig_const_arg<'v, V: Visitor<'v>>(
|
||||
pub fn walk_const_arg<'v, V: Visitor<'v>>(
|
||||
visitor: &mut V,
|
||||
const_arg: &'v ConstArg<'v, AmbigArg>,
|
||||
) -> V::Result {
|
||||
|
||||
Reference in New Issue
Block a user