1
Fork 0

Auto merge of #124401 - oli-obk:some_hir_cleanups, r=cjgillot

Some hir cleanups

It seemed odd to not put `AnonConst` in the arena, compared with the other types that we did put into an arena. This way we can also give it a `Span` without growing a lot of other HIR data structures because of the extra field.

r? compiler
This commit is contained in:
bors 2024-05-04 00:32:27 +00:00
commit 09cd00fea4
16 changed files with 89 additions and 87 deletions

View file

@ -62,7 +62,7 @@ pub(super) fn index_hir<'hir>(
if let Node::Err(span) = node.node { if let Node::Err(span) = node.node {
let hir_id = HirId { owner: item.def_id(), local_id }; let hir_id = HirId { owner: item.def_id(), local_id };
let msg = format!("ID {hir_id} not encountered when visiting item HIR"); let msg = format!("ID {hir_id} not encountered when visiting item HIR");
tcx.dcx().span_delayed_bug(*span, msg); tcx.dcx().span_delayed_bug(span, msg);
} }
} }
@ -376,7 +376,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
} }
} }
fn visit_array_length(&mut self, len: &'hir ArrayLen) { fn visit_array_length(&mut self, len: &'hir ArrayLen<'hir>) {
match len { match len {
ArrayLen::Infer(inf) => self.insert(inf.span, inf.hir_id, Node::ArrayLenInfer(inf)), ArrayLen::Infer(inf) => self.insert(inf.span, inf.hir_id, Node::ArrayLenInfer(inf)),
ArrayLen::Body(..) => intravisit::walk_array_len(self, len), ArrayLen::Body(..) => intravisit::walk_array_len(self, len),

View file

@ -1589,11 +1589,12 @@ impl<'hir> LoweringContext<'_, 'hir> {
}), }),
)), )),
)), )),
default: Some(hir::AnonConst { default: Some(self.arena.alloc(hir::AnonConst {
def_id: anon_const, def_id: anon_const,
hir_id: const_id, hir_id: const_id,
body: const_body, body: const_body,
}), span,
})),
is_host_effect: true, is_host_effect: true,
}, },
colon_span: None, colon_span: None,

View file

@ -1178,14 +1178,17 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
tokens: None, tokens: None,
}; };
let ct = self.with_new_scopes(span, |this| hir::AnonConst { let ct = self.with_new_scopes(span, |this| {
def_id, self.arena.alloc(hir::AnonConst {
hir_id: this.lower_node_id(node_id), def_id,
body: this.lower_const_body(path_expr.span, Some(&path_expr)), hir_id: this.lower_node_id(node_id),
body: this
.lower_const_body(path_expr.span, Some(&path_expr)),
span,
})
}); });
return GenericArg::Const(ConstArg { return GenericArg::Const(ConstArg {
value: ct, value: ct,
span,
is_desugared_from_effects: false, is_desugared_from_effects: false,
}); });
} }
@ -1197,7 +1200,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
} }
ast::GenericArg::Const(ct) => GenericArg::Const(ConstArg { ast::GenericArg::Const(ct) => GenericArg::Const(ConstArg {
value: self.lower_anon_const(ct), value: self.lower_anon_const(ct),
span: self.lower_span(ct.value.span),
is_desugared_from_effects: false, is_desugared_from_effects: false,
}), }),
} }
@ -2315,7 +2317,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
} }
#[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable #[allow(rustc::untranslatable_diagnostic)] // FIXME: make this translatable
fn lower_array_length(&mut self, c: &AnonConst) -> hir::ArrayLen { fn lower_array_length(&mut self, c: &AnonConst) -> hir::ArrayLen<'hir> {
match c.value.kind { match c.value.kind {
ExprKind::Underscore => { ExprKind::Underscore => {
if self.tcx.features().generic_arg_infer { if self.tcx.features().generic_arg_infer {
@ -2338,12 +2340,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
} }
} }
fn lower_anon_const(&mut self, c: &AnonConst) -> hir::AnonConst { fn lower_anon_const(&mut self, c: &AnonConst) -> &'hir hir::AnonConst {
self.with_new_scopes(c.value.span, |this| hir::AnonConst { self.arena.alloc(self.with_new_scopes(c.value.span, |this| hir::AnonConst {
def_id: this.local_def_id(c.id), def_id: this.local_def_id(c.id),
hir_id: this.lower_node_id(c.id), hir_id: this.lower_node_id(c.id),
body: this.lower_const_body(c.value.span, Some(&c.value)), body: this.lower_const_body(c.value.span, Some(&c.value)),
}) span: this.lower_span(c.value.span),
}))
} }
fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource { fn lower_unsafe_source(&mut self, u: UnsafeSource) -> hir::UnsafeSource {
@ -2650,8 +2653,7 @@ impl<'hir> GenericArgsCtor<'hir> {
lcx.children.push((def_id, hir::MaybeOwner::NonOwner(hir_id))); lcx.children.push((def_id, hir::MaybeOwner::NonOwner(hir_id)));
self.args.push(hir::GenericArg::Const(hir::ConstArg { self.args.push(hir::GenericArg::Const(hir::ConstArg {
value: hir::AnonConst { def_id, hir_id, body }, value: lcx.arena.alloc(hir::AnonConst { def_id, hir_id, body, span }),
span,
is_desugared_from_effects: true, is_desugared_from_effects: true,
})) }))
} }

View file

@ -229,9 +229,8 @@ impl<'hir> PathSegment<'hir> {
} }
#[derive(Clone, Copy, Debug, HashStable_Generic)] #[derive(Clone, Copy, Debug, HashStable_Generic)]
pub struct ConstArg { pub struct ConstArg<'hir> {
pub value: AnonConst, pub value: &'hir AnonConst,
pub span: Span,
/// Indicates whether this comes from a `~const` desugaring. /// Indicates whether this comes from a `~const` desugaring.
pub is_desugared_from_effects: bool, pub is_desugared_from_effects: bool,
} }
@ -252,7 +251,7 @@ impl InferArg {
pub enum GenericArg<'hir> { pub enum GenericArg<'hir> {
Lifetime(&'hir Lifetime), Lifetime(&'hir Lifetime),
Type(&'hir Ty<'hir>), Type(&'hir Ty<'hir>),
Const(ConstArg), Const(ConstArg<'hir>),
Infer(InferArg), Infer(InferArg),
} }
@ -261,7 +260,7 @@ impl GenericArg<'_> {
match self { match self {
GenericArg::Lifetime(l) => l.ident.span, GenericArg::Lifetime(l) => l.ident.span,
GenericArg::Type(t) => t.span, GenericArg::Type(t) => t.span,
GenericArg::Const(c) => c.span, GenericArg::Const(c) => c.value.span,
GenericArg::Infer(i) => i.span, GenericArg::Infer(i) => i.span,
} }
} }
@ -490,7 +489,7 @@ pub enum GenericParamKind<'hir> {
Const { Const {
ty: &'hir Ty<'hir>, ty: &'hir Ty<'hir>,
/// Optional default value for the const generic param /// Optional default value for the const generic param
default: Option<AnonConst>, default: Option<&'hir AnonConst>,
is_host_effect: bool, is_host_effect: bool,
}, },
} }
@ -1562,12 +1561,12 @@ impl fmt::Display for ConstContext {
pub type Lit = Spanned<LitKind>; pub type Lit = Spanned<LitKind>;
#[derive(Copy, Clone, Debug, HashStable_Generic)] #[derive(Copy, Clone, Debug, HashStable_Generic)]
pub enum ArrayLen { pub enum ArrayLen<'hir> {
Infer(InferArg), Infer(InferArg),
Body(AnonConst), Body(&'hir AnonConst),
} }
impl ArrayLen { impl ArrayLen<'_> {
pub fn hir_id(&self) -> HirId { pub fn hir_id(&self) -> HirId {
match self { match self {
ArrayLen::Infer(InferArg { hir_id, .. }) | ArrayLen::Body(AnonConst { hir_id, .. }) => { ArrayLen::Infer(InferArg { hir_id, .. }) | ArrayLen::Body(AnonConst { hir_id, .. }) => {
@ -1590,6 +1589,7 @@ pub struct AnonConst {
pub hir_id: HirId, pub hir_id: HirId,
pub def_id: LocalDefId, pub def_id: LocalDefId,
pub body: BodyId, pub body: BodyId,
pub span: Span,
} }
/// An inline constant expression `const { something }`. /// An inline constant expression `const { something }`.
@ -2002,7 +2002,7 @@ pub enum ExprKind<'hir> {
/// ///
/// E.g., `[1; 5]`. The first expression is the element /// E.g., `[1; 5]`. The first expression is the element
/// to be repeated; the second is the number of times to repeat it. /// to be repeated; the second is the number of times to repeat it.
Repeat(&'hir Expr<'hir>, ArrayLen), Repeat(&'hir Expr<'hir>, ArrayLen<'hir>),
/// A suspension point for coroutines (i.e., `yield <expr>`). /// A suspension point for coroutines (i.e., `yield <expr>`).
Yield(&'hir Expr<'hir>, YieldSource), Yield(&'hir Expr<'hir>, YieldSource),
@ -2382,7 +2382,7 @@ pub struct TypeBinding<'hir> {
#[derive(Debug, Clone, Copy, HashStable_Generic)] #[derive(Debug, Clone, Copy, HashStable_Generic)]
pub enum Term<'hir> { pub enum Term<'hir> {
Ty(&'hir Ty<'hir>), Ty(&'hir Ty<'hir>),
Const(AnonConst), Const(&'hir AnonConst),
} }
impl<'hir> From<&'hir Ty<'hir>> for Term<'hir> { impl<'hir> From<&'hir Ty<'hir>> for Term<'hir> {
@ -2391,8 +2391,8 @@ impl<'hir> From<&'hir Ty<'hir>> for Term<'hir> {
} }
} }
impl<'hir> From<AnonConst> for Term<'hir> { impl<'hir> From<&'hir AnonConst> for Term<'hir> {
fn from(c: AnonConst) -> Self { fn from(c: &'hir AnonConst) -> Self {
Term::Const(c) Term::Const(c)
} }
} }
@ -2683,7 +2683,7 @@ pub enum TyKind<'hir> {
/// A variable length slice (i.e., `[T]`). /// A variable length slice (i.e., `[T]`).
Slice(&'hir Ty<'hir>), Slice(&'hir Ty<'hir>),
/// A fixed length array (i.e., `[T; n]`). /// A fixed length array (i.e., `[T; n]`).
Array(&'hir Ty<'hir>, ArrayLen), Array(&'hir Ty<'hir>, ArrayLen<'hir>),
/// A raw pointer (i.e., `*const T` or `*mut T`). /// A raw pointer (i.e., `*const T` or `*mut T`).
Ptr(MutTy<'hir>), Ptr(MutTy<'hir>),
/// A reference (i.e., `&'a T` or `&'a mut T`). /// A reference (i.e., `&'a T` or `&'a mut T`).
@ -2712,7 +2712,7 @@ pub enum TyKind<'hir> {
/// where `Bound` is a trait or a lifetime. /// where `Bound` is a trait or a lifetime.
TraitObject(&'hir [PolyTraitRef<'hir>], &'hir Lifetime, TraitObjectSyntax), TraitObject(&'hir [PolyTraitRef<'hir>], &'hir Lifetime, TraitObjectSyntax),
/// Unused for now. /// Unused for now.
Typeof(AnonConst), Typeof(&'hir AnonConst),
/// `TyKind::Infer` means the type should be inferred instead of it having been /// `TyKind::Infer` means the type should be inferred instead of it having been
/// specified. This can appear anywhere in a type. /// specified. This can appear anywhere in a type.
Infer, Infer,
@ -2745,10 +2745,10 @@ pub enum InlineAsmOperand<'hir> {
out_expr: Option<&'hir Expr<'hir>>, out_expr: Option<&'hir Expr<'hir>>,
}, },
Const { Const {
anon_const: AnonConst, anon_const: &'hir AnonConst,
}, },
SymFn { SymFn {
anon_const: AnonConst, anon_const: &'hir AnonConst,
}, },
SymStatic { SymStatic {
path: QPath<'hir>, path: QPath<'hir>,
@ -2950,7 +2950,7 @@ pub struct Variant<'hir> {
/// Fields and constructor id of the variant. /// Fields and constructor id of the variant.
pub data: VariantData<'hir>, pub data: VariantData<'hir>,
/// Explicit discriminant (e.g., `Foo = 1`). /// Explicit discriminant (e.g., `Foo = 1`).
pub disr_expr: Option<AnonConst>, pub disr_expr: Option<&'hir AnonConst>,
/// Span /// Span
pub span: Span, pub span: Span,
} }
@ -3479,15 +3479,13 @@ impl<'hir> OwnerNode<'hir> {
} }
} }
// Span by reference to pass to `Node::Err`. pub fn span(&self) -> Span {
#[allow(rustc::pass_by_value)]
pub fn span(&self) -> &'hir Span {
match self { match self {
OwnerNode::Item(Item { span, .. }) OwnerNode::Item(Item { span, .. })
| OwnerNode::ForeignItem(ForeignItem { span, .. }) | OwnerNode::ForeignItem(ForeignItem { span, .. })
| OwnerNode::ImplItem(ImplItem { span, .. }) | OwnerNode::ImplItem(ImplItem { span, .. })
| OwnerNode::TraitItem(TraitItem { span, .. }) => span, | OwnerNode::TraitItem(TraitItem { span, .. }) => *span,
OwnerNode::Crate(Mod { spans: ModSpans { inner_span, .. }, .. }) => inner_span, OwnerNode::Crate(Mod { spans: ModSpans { inner_span, .. }, .. }) => *inner_span,
OwnerNode::Synthetic => unreachable!(), OwnerNode::Synthetic => unreachable!(),
} }
} }
@ -3632,9 +3630,7 @@ pub enum Node<'hir> {
PreciseCapturingNonLifetimeArg(&'hir PreciseCapturingNonLifetimeArg), PreciseCapturingNonLifetimeArg(&'hir PreciseCapturingNonLifetimeArg),
// Created by query feeding // Created by query feeding
Synthetic, Synthetic,
// Span by reference to minimize `Node`'s size Err(Span),
#[allow(rustc::pass_by_value)]
Err(&'hir Span),
} }
impl<'hir> Node<'hir> { impl<'hir> Node<'hir> {
@ -3871,7 +3867,7 @@ mod size_asserts {
static_assert_size!(FnDecl<'_>, 40); static_assert_size!(FnDecl<'_>, 40);
static_assert_size!(ForeignItem<'_>, 72); static_assert_size!(ForeignItem<'_>, 72);
static_assert_size!(ForeignItemKind<'_>, 40); static_assert_size!(ForeignItemKind<'_>, 40);
static_assert_size!(GenericArg<'_>, 32); static_assert_size!(GenericArg<'_>, 24);
static_assert_size!(GenericBound<'_>, 48); static_assert_size!(GenericBound<'_>, 48);
static_assert_size!(Generics<'_>, 56); static_assert_size!(Generics<'_>, 56);
static_assert_size!(Impl<'_>, 80); static_assert_size!(Impl<'_>, 80);

View file

@ -338,7 +338,7 @@ pub trait Visitor<'v>: Sized {
fn visit_pat_field(&mut self, f: &'v PatField<'v>) -> Self::Result { fn visit_pat_field(&mut self, f: &'v PatField<'v>) -> Self::Result {
walk_pat_field(self, f) walk_pat_field(self, f)
} }
fn visit_array_length(&mut self, len: &'v ArrayLen) -> Self::Result { fn visit_array_length(&mut self, len: &'v ArrayLen<'v>) -> Self::Result {
walk_array_len(self, len) walk_array_len(self, len)
} }
fn visit_anon_const(&mut self, c: &'v AnonConst) -> Self::Result { fn visit_anon_const(&mut self, c: &'v AnonConst) -> Self::Result {
@ -703,7 +703,7 @@ pub fn walk_pat_field<'v, V: Visitor<'v>>(visitor: &mut V, field: &'v PatField<'
visitor.visit_pat(field.pat) visitor.visit_pat(field.pat)
} }
pub fn walk_array_len<'v, V: Visitor<'v>>(visitor: &mut V, len: &'v ArrayLen) -> V::Result { pub fn walk_array_len<'v, V: Visitor<'v>>(visitor: &mut V, len: &'v ArrayLen<'v>) -> V::Result {
match len { match len {
// FIXME: Use `visit_infer` here. // FIXME: Use `visit_infer` here.
ArrayLen::Infer(InferArg { hir_id, span: _ }) => visitor.visit_id(*hir_id), ArrayLen::Infer(InferArg { hir_id, span: _ }) => visitor.visit_id(*hir_id),

View file

@ -143,7 +143,7 @@ impl<'v> Visitor<'v> for HirPlaceholderCollector {
_ => {} _ => {}
} }
} }
fn visit_array_length(&mut self, length: &'v hir::ArrayLen) { fn visit_array_length(&mut self, length: &'v hir::ArrayLen<'v>) {
if let hir::ArrayLen::Infer(inf) = length { if let hir::ArrayLen::Infer(inf) = length {
self.0.push(inf.span); self.0.push(inf.span);
} }

View file

@ -24,7 +24,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
let hir_id = tcx.local_def_id_to_hir_id(def_id); let hir_id = tcx.local_def_id_to_hir_id(def_id);
let node = tcx.hir_node(hir_id); let node = tcx.hir_node(hir_id);
let Node::AnonConst(_) = node else { let Node::AnonConst(&AnonConst { span, .. }) = node else {
span_bug!( span_bug!(
tcx.def_span(def_id), tcx.def_span(def_id),
"expected anon const in `anon_const_type_of`, got {node:?}" "expected anon const in `anon_const_type_of`, got {node:?}"
@ -134,7 +134,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
// I dont think it's possible to reach this but I'm not 100% sure - BoxyUwU // I dont think it's possible to reach this but I'm not 100% sure - BoxyUwU
return Ty::new_error_with_message( return Ty::new_error_with_message(
tcx, tcx,
tcx.def_span(def_id), span,
"unexpected non-GAT usage of an anon const", "unexpected non-GAT usage of an anon const",
); );
} }
@ -152,7 +152,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
let Some(type_dependent_def) = tables.type_dependent_def_id(parent_node_id) else { let Some(type_dependent_def) = tables.type_dependent_def_id(parent_node_id) else {
return Ty::new_error_with_message( return Ty::new_error_with_message(
tcx, tcx,
tcx.def_span(def_id), span,
format!("unable to find type-dependent def for {parent_node_id:?}"), format!("unable to find type-dependent def for {parent_node_id:?}"),
); );
}; };
@ -194,7 +194,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
} else { } else {
return Ty::new_error_with_message( return Ty::new_error_with_message(
tcx, tcx,
tcx.def_span(def_id), span,
format!("unable to find const parent for {hir_id} in pat {pat:?}"), format!("unable to find const parent for {hir_id} in pat {pat:?}"),
); );
} }
@ -202,7 +202,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
_ => { _ => {
return Ty::new_error_with_message( return Ty::new_error_with_message(
tcx, tcx,
tcx.def_span(def_id), span,
format!("unexpected const parent path {parent_node:?}"), format!("unexpected const parent path {parent_node:?}"),
); );
} }
@ -226,11 +226,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
.map(|idx| (idx, seg)) .map(|idx| (idx, seg))
}) })
}) else { }) else {
return Ty::new_error_with_message( return Ty::new_error_with_message(tcx, span, "no arg matching AnonConst in path");
tcx,
tcx.def_span(def_id),
"no arg matching AnonConst in path",
);
}; };
let generics = match tcx.res_generics_def_id(segment.res) { let generics = match tcx.res_generics_def_id(segment.res) {
@ -238,7 +234,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
None => { None => {
return Ty::new_error_with_message( return Ty::new_error_with_message(
tcx, tcx,
tcx.def_span(def_id), span,
format!("unexpected anon const res {:?} in path: {:?}", segment.res, path), format!("unexpected anon const res {:?} in path: {:?}", segment.res, path),
); );
} }
@ -250,7 +246,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
_ => { _ => {
return Ty::new_error_with_message( return Ty::new_error_with_message(
tcx, tcx,
tcx.def_span(def_id), span,
format!("unexpected const parent in type_of(): {parent_node:?}"), format!("unexpected const parent in type_of(): {parent_node:?}"),
); );
} }
@ -278,7 +274,7 @@ fn anon_const_type_of<'tcx>(tcx: TyCtxt<'tcx>, def_id: LocalDefId) -> Ty<'tcx> {
} else { } else {
return Ty::new_error_with_message( return Ty::new_error_with_message(
tcx, tcx,
tcx.def_span(def_id), span,
format!("const generic parameter not found in {generics:?} at position {arg_idx:?}"), format!("const generic parameter not found in {generics:?} at position {arg_idx:?}"),
); );
} }

View file

@ -968,7 +968,7 @@ impl<'a> State<'a> {
self.print_else(elseopt) self.print_else(elseopt)
} }
fn print_array_length(&mut self, len: &hir::ArrayLen) { fn print_array_length(&mut self, len: &hir::ArrayLen<'_>) {
match len { match len {
hir::ArrayLen::Infer(..) => self.word("_"), hir::ArrayLen::Infer(..) => self.word("_"),
hir::ArrayLen::Body(ct) => self.print_anon_const(ct), hir::ArrayLen::Body(ct) => self.print_anon_const(ct),
@ -1052,7 +1052,7 @@ impl<'a> State<'a> {
self.end() self.end()
} }
fn print_expr_repeat(&mut self, element: &hir::Expr<'_>, count: &hir::ArrayLen) { fn print_expr_repeat(&mut self, element: &hir::Expr<'_>, count: &hir::ArrayLen<'_>) {
self.ibox(INDENT_UNIT); self.ibox(INDENT_UNIT);
self.word("["); self.word("[");
self.print_expr(element); self.print_expr(element);

View file

@ -1444,7 +1444,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
return; return;
}; };
if let hir::TyKind::Array(_, length) = ty.peel_refs().kind if let hir::TyKind::Array(_, length) = ty.peel_refs().kind
&& let hir::ArrayLen::Body(hir::AnonConst { hir_id, .. }) = length && let hir::ArrayLen::Body(&hir::AnonConst { hir_id, .. }) = length
{ {
let span = self.tcx.hir().span(hir_id); let span = self.tcx.hir().span(hir_id);
self.dcx().try_steal_modify_and_emit_err( self.dcx().try_steal_modify_and_emit_err(
@ -1483,7 +1483,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
fn check_expr_repeat( fn check_expr_repeat(
&self, &self,
element: &'tcx hir::Expr<'tcx>, element: &'tcx hir::Expr<'tcx>,
count: &'tcx hir::ArrayLen, count: &'tcx hir::ArrayLen<'tcx>,
expected: Expectation<'tcx>, expected: Expectation<'tcx>,
expr: &'tcx hir::Expr<'tcx>, expr: &'tcx hir::Expr<'tcx>,
) -> Ty<'tcx> { ) -> Ty<'tcx> {

View file

@ -438,7 +438,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
} }
pub fn lower_array_length(&self, length: &hir::ArrayLen) -> ty::Const<'tcx> { pub fn lower_array_length(&self, length: &hir::ArrayLen<'tcx>) -> ty::Const<'tcx> {
match length { match length {
hir::ArrayLen::Infer(inf) => self.ct_infer(self.tcx.types.usize, None, inf.span), hir::ArrayLen::Infer(inf) => self.ct_infer(self.tcx.types.usize, None, inf.span),
hir::ArrayLen::Body(anon_const) => { hir::ArrayLen::Body(anon_const) => {

View file

@ -74,9 +74,12 @@ fn gen_args(cx: &LateContext<'_>, segment: &PathSegment<'_>) -> String {
GenericArg::Type(ty) => { GenericArg::Type(ty) => {
cx.tcx.sess.source_map().span_to_snippet(ty.span).unwrap_or_else(|_| "_".into()) cx.tcx.sess.source_map().span_to_snippet(ty.span).unwrap_or_else(|_| "_".into())
} }
GenericArg::Const(c) => { GenericArg::Const(c) => cx
cx.tcx.sess.source_map().span_to_snippet(c.span).unwrap_or_else(|_| "_".into()) .tcx
} .sess
.source_map()
.span_to_snippet(c.value.span)
.unwrap_or_else(|_| "_".into()),
GenericArg::Infer(_) => String::from("_"), GenericArg::Infer(_) => String::from("_"),
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();

View file

@ -885,7 +885,7 @@ impl<'hir> Map<'hir> {
Node::ImplItem(impl_item) => impl_item.span, Node::ImplItem(impl_item) => impl_item.span,
Node::Variant(variant) => variant.span, Node::Variant(variant) => variant.span,
Node::Field(field) => field.span, Node::Field(field) => field.span,
Node::AnonConst(constant) => self.body(constant.body).value.span, Node::AnonConst(constant) => constant.span,
Node::ConstBlock(constant) => self.body(constant.body).value.span, Node::ConstBlock(constant) => self.body(constant.body).value.span,
Node::Expr(expr) => expr.span, Node::Expr(expr) => expr.span,
Node::ExprField(field) => field.span, Node::ExprField(field) => field.span,
@ -912,7 +912,7 @@ impl<'hir> Map<'hir> {
Node::ArrayLenInfer(inf) => inf.span, Node::ArrayLenInfer(inf) => inf.span,
Node::PreciseCapturingNonLifetimeArg(param) => param.ident.span, Node::PreciseCapturingNonLifetimeArg(param) => param.ident.span,
Node::Synthetic => unreachable!(), Node::Synthetic => unreachable!(),
Node::Err(span) => *span, Node::Err(span) => span,
} }
} }

View file

@ -566,7 +566,8 @@ fn construct_const<'a, 'tcx>(
span, span,
.. ..
}) => (*span, ty.span), }) => (*span, ty.span),
Node::AnonConst(_) | Node::ConstBlock(_) => { Node::AnonConst(ct) => (ct.span, ct.span),
Node::ConstBlock(_) => {
let span = tcx.def_span(def); let span = tcx.def_span(def);
(span, span) (span, span)
} }

View file

@ -281,7 +281,10 @@ fn clean_lifetime<'tcx>(lifetime: &hir::Lifetime, cx: &mut DocContext<'tcx>) ->
Lifetime(lifetime.ident.name) Lifetime(lifetime.ident.name)
} }
pub(crate) fn clean_const<'tcx>(constant: &hir::ConstArg, cx: &mut DocContext<'tcx>) -> Constant { pub(crate) fn clean_const<'tcx>(
constant: &hir::ConstArg<'_>,
cx: &mut DocContext<'tcx>,
) -> Constant {
let def_id = cx.tcx.hir().body_owner_def_id(constant.value.body).to_def_id(); let def_id = cx.tcx.hir().body_owner_def_id(constant.value.body).to_def_id();
Constant { Constant {
type_: Box::new(clean_middle_ty( type_: Box::new(clean_middle_ty(
@ -2450,7 +2453,7 @@ pub(crate) fn clean_variant_def_with_args<'tcx>(
fn clean_variant_data<'tcx>( fn clean_variant_data<'tcx>(
variant: &hir::VariantData<'tcx>, variant: &hir::VariantData<'tcx>,
disr_expr: &Option<hir::AnonConst>, disr_expr: &Option<&hir::AnonConst>,
cx: &mut DocContext<'tcx>, cx: &mut DocContext<'tcx>,
) -> Variant { ) -> Variant {
let discriminant = disr_expr let discriminant = disr_expr

View file

@ -224,7 +224,7 @@ impl HirEqInterExpr<'_, '_, '_> {
}) })
} }
pub fn eq_array_length(&mut self, left: ArrayLen, right: ArrayLen) -> bool { pub fn eq_array_length(&mut self, left: ArrayLen<'_>, right: ArrayLen<'_>) -> bool {
match (left, right) { match (left, right) {
(ArrayLen::Infer(..), ArrayLen::Infer(..)) => true, (ArrayLen::Infer(..), ArrayLen::Infer(..)) => true,
(ArrayLen::Body(l_ct), ArrayLen::Body(r_ct)) => self.eq_body(l_ct.body, r_ct.body), (ArrayLen::Body(l_ct), ArrayLen::Body(r_ct)) => self.eq_body(l_ct.body, r_ct.body),
@ -1116,7 +1116,7 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> {
} }
} }
pub fn hash_array_length(&mut self, length: ArrayLen) { pub fn hash_array_length(&mut self, length: ArrayLen<'_>) {
match length { match length {
ArrayLen::Infer(..) => {}, ArrayLen::Infer(..) => {},
ArrayLen::Body(anon_const) => self.hash_body(anon_const.body), ArrayLen::Body(anon_const) => self.hash_body(anon_const.body),

View file

@ -129,6 +129,9 @@ hir-stats Body 72 ( 0.8%) 3 24
hir-stats InlineAsm 72 ( 0.8%) 1 72 hir-stats InlineAsm 72 ( 0.8%) 1 72
hir-stats ImplItemRef 72 ( 0.8%) 2 36 hir-stats ImplItemRef 72 ( 0.8%) 2 36
hir-stats Arm 80 ( 0.9%) 2 40 hir-stats Arm 80 ( 0.9%) 2 40
hir-stats GenericArg 96 ( 1.1%) 4 24
hir-stats - Type 24 ( 0.3%) 1
hir-stats - Lifetime 72 ( 0.8%) 3
hir-stats FieldDef 96 ( 1.1%) 2 48 hir-stats FieldDef 96 ( 1.1%) 2 48
hir-stats Stmt 96 ( 1.1%) 3 32 hir-stats Stmt 96 ( 1.1%) 3 32
hir-stats - Let 32 ( 0.4%) 1 hir-stats - Let 32 ( 0.4%) 1
@ -136,43 +139,40 @@ hir-stats - Semi 32 ( 0.4%) 1
hir-stats - Expr 32 ( 0.4%) 1 hir-stats - Expr 32 ( 0.4%) 1
hir-stats FnDecl 120 ( 1.3%) 3 40 hir-stats FnDecl 120 ( 1.3%) 3 40
hir-stats Attribute 128 ( 1.4%) 4 32 hir-stats Attribute 128 ( 1.4%) 4 32
hir-stats GenericArg 128 ( 1.4%) 4 32 hir-stats Variant 144 ( 1.6%) 2 72
hir-stats - Type 32 ( 0.4%) 1
hir-stats - Lifetime 96 ( 1.1%) 3
hir-stats GenericArgs 144 ( 1.6%) 3 48 hir-stats GenericArgs 144 ( 1.6%) 3 48
hir-stats Variant 176 ( 1.9%) 2 88
hir-stats GenericBound 192 ( 2.1%) 4 48 hir-stats GenericBound 192 ( 2.1%) 4 48
hir-stats - Trait 192 ( 2.1%) 4 hir-stats - Trait 192 ( 2.1%) 4
hir-stats WherePredicate 192 ( 2.1%) 3 64 hir-stats WherePredicate 192 ( 2.1%) 3 64
hir-stats - BoundPredicate 192 ( 2.1%) 3 hir-stats - BoundPredicate 192 ( 2.1%) 3
hir-stats Block 288 ( 3.2%) 6 48 hir-stats Block 288 ( 3.2%) 6 48
hir-stats GenericParam 360 ( 4.0%) 5 72
hir-stats Pat 360 ( 4.0%) 5 72 hir-stats Pat 360 ( 4.0%) 5 72
hir-stats - Wild 72 ( 0.8%) 1 hir-stats - Wild 72 ( 0.8%) 1
hir-stats - Struct 72 ( 0.8%) 1 hir-stats - Struct 72 ( 0.8%) 1
hir-stats - Binding 216 ( 2.4%) 3 hir-stats - Binding 216 ( 2.4%) 3
hir-stats GenericParam 400 ( 4.4%) 5 80
hir-stats Generics 560 ( 6.2%) 10 56 hir-stats Generics 560 ( 6.2%) 10 56
hir-stats Ty 720 ( 7.9%) 15 48 hir-stats Ty 720 ( 8.0%) 15 48
hir-stats - Ptr 48 ( 0.5%) 1 hir-stats - Ptr 48 ( 0.5%) 1
hir-stats - Ref 48 ( 0.5%) 1 hir-stats - Ref 48 ( 0.5%) 1
hir-stats - Path 624 ( 6.9%) 13 hir-stats - Path 624 ( 6.9%) 13
hir-stats Expr 768 ( 8.4%) 12 64 hir-stats Expr 768 ( 8.5%) 12 64
hir-stats - Path 64 ( 0.7%) 1 hir-stats - Path 64 ( 0.7%) 1
hir-stats - Struct 64 ( 0.7%) 1 hir-stats - Struct 64 ( 0.7%) 1
hir-stats - Match 64 ( 0.7%) 1 hir-stats - Match 64 ( 0.7%) 1
hir-stats - InlineAsm 64 ( 0.7%) 1 hir-stats - InlineAsm 64 ( 0.7%) 1
hir-stats - Lit 128 ( 1.4%) 2 hir-stats - Lit 128 ( 1.4%) 2
hir-stats - Block 384 ( 4.2%) 6 hir-stats - Block 384 ( 4.3%) 6
hir-stats Item 968 (10.6%) 11 88 hir-stats Item 968 (10.8%) 11 88
hir-stats - Trait 88 ( 1.0%) 1 hir-stats - Trait 88 ( 1.0%) 1
hir-stats - Enum 88 ( 1.0%) 1 hir-stats - Enum 88 ( 1.0%) 1
hir-stats - ExternCrate 88 ( 1.0%) 1 hir-stats - ExternCrate 88 ( 1.0%) 1
hir-stats - ForeignMod 88 ( 1.0%) 1 hir-stats - ForeignMod 88 ( 1.0%) 1
hir-stats - Impl 88 ( 1.0%) 1 hir-stats - Impl 88 ( 1.0%) 1
hir-stats - Fn 176 ( 1.9%) 2 hir-stats - Fn 176 ( 2.0%) 2
hir-stats - Use 352 ( 3.9%) 4 hir-stats - Use 352 ( 3.9%) 4
hir-stats Path 1_240 (13.6%) 31 40 hir-stats Path 1_240 (13.8%) 31 40
hir-stats PathSegment 1_920 (21.1%) 40 48 hir-stats PathSegment 1_920 (21.4%) 40 48
hir-stats ---------------------------------------------------------------- hir-stats ----------------------------------------------------------------
hir-stats Total 9_096 hir-stats Total 8_992
hir-stats hir-stats