1use std::borrow::Cow;
3use std::fmt;
4use std::ops::Not;
5
6use rustc_abi::ExternAbi;
7use rustc_ast::util::parser::ExprPrecedence;
8use rustc_ast::{
9 self as ast, FloatTy, InlineAsmOptions, InlineAsmTemplatePiece, IntTy, Label, LitIntType,
10 LitKind, TraitObjectSyntax, UintTy, UnsafeBinderCastKind,
11};
12pub use rustc_ast::{
13 AssignOp, AssignOpKind, AttrId, AttrStyle, BinOp, BinOpKind, BindingMode, BorrowKind,
14 BoundConstness, BoundPolarity, ByRef, CaptureBy, DelimArgs, ImplPolarity, IsAuto,
15 MetaItemInner, MetaItemLit, Movability, Mutability, Pinnedness, UnOp,
16};
17use rustc_attr_ir::Attribute;
18use rustc_data_structures::fingerprint::Fingerprint;
19use rustc_data_structures::fx::FxIndexSet;
20use rustc_data_structures::sorted_map::SortedMap;
21use rustc_data_structures::steal::Steal;
22use rustc_data_structures::tagged_ptr::TaggedRef;
23use rustc_data_structures::unord::UnordMap;
24use rustc_error_messages::{DiagArgValue, IntoDiagArg};
25use rustc_hir_id::{HirId, ItemLocalId, ItemLocalMap, OwnerId};
26use rustc_index::IndexVec;
27use rustc_macros::{Decodable, Encodable, StableHash};
28use rustc_span::def_id::LocalDefId;
29use rustc_span::{
30 BytePos, DUMMY_SP, DesugaringKind, ErrorGuaranteed, Ident, LocalExpnId, Span, Spanned, Symbol,
31 kw, sym,
32};
33use rustc_target::asm;
34use tracing::debug;
35
36use crate::def::{CtorKind, DefKind, MacroKinds, PerNS, Res};
37use crate::def_id::{DefId, LocalDefIdMap};
38use crate::intravisit::FnKind;
39use crate::lints::DelayedLints;
40
41#[derive(#[automatically_derived]
impl ::core::fmt::Debug for AngleBrackets {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
AngleBrackets::Missing => "Missing",
AngleBrackets::Empty => "Empty",
AngleBrackets::Full => "Full",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for AngleBrackets { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AngleBrackets { }
#[automatically_derived]
impl ::core::clone::Clone for AngleBrackets {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for AngleBrackets { }
#[automatically_derived]
impl ::core::cmp::PartialEq for AngleBrackets {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for AngleBrackets { }Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
AngleBrackets {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
AngleBrackets::Missing => {}
AngleBrackets::Empty => {}
AngleBrackets::Full => {}
}
}
}
};StableHash)]
42pub enum AngleBrackets {
43 Missing,
45 Empty,
47 Full,
49}
50
51#[derive(#[automatically_derived]
impl ::core::fmt::Debug for LifetimeSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Reference =>
::core::fmt::Formatter::write_str(f, "Reference"),
Self::Path { angle_brackets: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Path",
"angle_brackets", &__self_0),
Self::OutlivesBound =>
::core::fmt::Formatter::write_str(f, "OutlivesBound"),
Self::PreciseCapturing =>
::core::fmt::Formatter::write_str(f, "PreciseCapturing"),
Self::Other => ::core::fmt::Formatter::write_str(f, "Other"),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for LifetimeSource { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LifetimeSource { }
#[automatically_derived]
impl ::core::clone::Clone for LifetimeSource {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<AngleBrackets>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LifetimeSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LifetimeSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Path { angle_brackets: __self_0 }, Self::Path {
angle_brackets: __arg1_0 }) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LifetimeSource {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<AngleBrackets>;
}
}Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
LifetimeSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
LifetimeSource::Reference => {}
LifetimeSource::Path { angle_brackets: ref __binding_0 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LifetimeSource::OutlivesBound => {}
LifetimeSource::PreciseCapturing => {}
LifetimeSource::Other => {}
}
}
}
};StableHash)]
52pub enum LifetimeSource {
53 Reference,
55
56 Path { angle_brackets: AngleBrackets },
59
60 OutlivesBound,
62
63 PreciseCapturing,
65
66 Other,
73}
74
75#[derive(#[automatically_derived]
impl ::core::fmt::Debug for LifetimeSyntax {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LifetimeSyntax::Implicit => "Implicit",
LifetimeSyntax::ExplicitAnonymous => "ExplicitAnonymous",
LifetimeSyntax::ExplicitBound => "ExplicitBound",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for LifetimeSyntax { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LifetimeSyntax { }
#[automatically_derived]
impl ::core::clone::Clone for LifetimeSyntax {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LifetimeSyntax { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LifetimeSyntax {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LifetimeSyntax { }Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
LifetimeSyntax {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
LifetimeSyntax::Implicit => {}
LifetimeSyntax::ExplicitAnonymous => {}
LifetimeSyntax::ExplicitBound => {}
}
}
}
};StableHash)]
76pub enum LifetimeSyntax {
77 Implicit,
79
80 ExplicitAnonymous,
82
83 ExplicitBound,
85}
86
87impl From<Ident> for LifetimeSyntax {
88 fn from(ident: Ident) -> Self {
89 let name = ident.name;
90
91 if name == sym::empty {
92 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("A lifetime name should never be empty")));
};unreachable!("A lifetime name should never be empty");
93 } else if name == kw::UnderscoreLifetime {
94 LifetimeSyntax::ExplicitAnonymous
95 } else {
96 if true {
if !name.as_str().starts_with('\'') {
::core::panicking::panic("assertion failed: name.as_str().starts_with(\'\\\'\')")
};
};debug_assert!(name.as_str().starts_with('\''));
97 LifetimeSyntax::ExplicitBound
98 }
99 }
100}
101
102#[derive(#[automatically_derived]
impl ::core::fmt::Debug for Lifetime {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "Lifetime",
"hir_id", &self.hir_id, "ident", &self.ident, "kind", &self.kind,
"source", &self.source, "syntax", &&self.syntax)
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for Lifetime { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Lifetime { }
#[automatically_derived]
impl ::core::clone::Clone for Lifetime {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<LifetimeKind>;
let _: ::core::clone::AssertParamIsClone<LifetimeSource>;
let _: ::core::clone::AssertParamIsClone<LifetimeSyntax>;
*self
}
}Clone, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Lifetime {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Lifetime {
hir_id: ref __binding_0,
ident: ref __binding_1,
kind: ref __binding_2,
source: ref __binding_3,
syntax: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
153#[repr(align(4))]
161pub struct Lifetime {
162 #[stable_hash(ignore)]
163 pub hir_id: HirId,
164
165 pub ident: Ident,
169
170 pub kind: LifetimeKind,
172
173 pub source: LifetimeSource,
176
177 pub syntax: LifetimeSyntax,
180}
181
182#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ParamName {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Plain(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Plain",
&__self_0),
Self::Error(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Error",
&__self_0),
Self::Fresh => ::core::fmt::Formatter::write_str(f, "Fresh"),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for ParamName { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ParamName { }
#[automatically_derived]
impl ::core::clone::Clone for ParamName {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
*self
}
}Clone, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ParamName {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ParamName::Plain(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ParamName::Error(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ParamName::Fresh => {}
}
}
}
};StableHash)]
183pub enum ParamName {
184 Plain(Ident),
186
187 Error(Ident),
193
194 Fresh,
209}
210
211impl ParamName {
212 pub fn ident(&self) -> Ident {
213 match *self {
214 ParamName::Plain(ident) | ParamName::Error(ident) => ident,
215 ParamName::Fresh => Ident::with_dummy_span(kw::UnderscoreLifetime),
216 }
217 }
218}
219
220#[derive(#[automatically_derived]
impl ::core::fmt::Debug for LifetimeKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Param(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Param",
&__self_0),
Self::ImplicitObjectLifetimeDefault =>
::core::fmt::Formatter::write_str(f,
"ImplicitObjectLifetimeDefault"),
Self::Error(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Error",
&__self_0),
Self::Infer => ::core::fmt::Formatter::write_str(f, "Infer"),
Self::Static => ::core::fmt::Formatter::write_str(f, "Static"),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for LifetimeKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LifetimeKind { }
#[automatically_derived]
impl ::core::clone::Clone for LifetimeKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LifetimeKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LifetimeKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Param(__self_0), Self::Param(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Error(__self_0), Self::Error(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for LifetimeKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<LocalDefId>;
let _: ::core::cmp::AssertParamIsEq<ErrorGuaranteed>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for LifetimeKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Param(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::Error(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LifetimeKind
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
LifetimeKind::Param(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LifetimeKind::ImplicitObjectLifetimeDefault => {}
LifetimeKind::Error(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LifetimeKind::Infer => {}
LifetimeKind::Static => {}
}
}
}
};StableHash)]
221pub enum LifetimeKind {
222 Param(LocalDefId),
224
225 ImplicitObjectLifetimeDefault,
237
238 Error(ErrorGuaranteed),
241
242 Infer,
246
247 Static,
249}
250
251impl LifetimeKind {
252 fn is_elided(&self) -> bool {
253 match self {
254 LifetimeKind::ImplicitObjectLifetimeDefault | LifetimeKind::Infer => true,
255
256 LifetimeKind::Error(..) | LifetimeKind::Param(..) | LifetimeKind::Static => false,
261 }
262 }
263}
264
265impl fmt::Display for Lifetime {
266 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
267 self.ident.name.fmt(f)
268 }
269}
270
271impl Lifetime {
272 pub fn new(
273 hir_id: HirId,
274 ident: Ident,
275 kind: LifetimeKind,
276 source: LifetimeSource,
277 syntax: LifetimeSyntax,
278 ) -> Lifetime {
279 let lifetime = Lifetime { hir_id, ident, kind, source, syntax };
280
281 #[cfg(debug_assertions)]
283 match (lifetime.is_elided(), lifetime.is_anonymous()) {
284 (false, false) => {} (false, true) => {} (true, true) => {} (true, false) => { ::core::panicking::panic_fmt(format_args!("bad Lifetime")); }panic!("bad Lifetime"),
288 }
289
290 lifetime
291 }
292
293 pub fn is_elided(&self) -> bool {
294 self.kind.is_elided()
295 }
296
297 pub fn is_anonymous(&self) -> bool {
298 self.ident.name == kw::UnderscoreLifetime
299 }
300
301 pub fn is_implicit(&self) -> bool {
302 #[allow(non_exhaustive_omitted_patterns)] match self.syntax {
LifetimeSyntax::Implicit => true,
_ => false,
}matches!(self.syntax, LifetimeSyntax::Implicit)
303 }
304
305 pub fn is_static(&self) -> bool {
306 self.kind == LifetimeKind::Static
307 }
308
309 pub fn suggestion(&self, new_lifetime: &str) -> (Span, String) {
310 use LifetimeSource::*;
311 use LifetimeSyntax::*;
312
313 if true {
if !new_lifetime.starts_with('\'') {
::core::panicking::panic("assertion failed: new_lifetime.starts_with(\'\\\'\')")
};
};debug_assert!(new_lifetime.starts_with('\''));
314
315 match (self.syntax, self.source) {
316 (ExplicitBound | ExplicitAnonymous, _) => (self.ident.span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", new_lifetime))
})format!("{new_lifetime}")),
318
319 (Implicit, Path { angle_brackets: AngleBrackets::Full }) => {
321 (self.ident.span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}, ", new_lifetime))
})format!("{new_lifetime}, "))
322 }
323
324 (Implicit, Path { angle_brackets: AngleBrackets::Empty }) => {
326 (self.ident.span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", new_lifetime))
})format!("{new_lifetime}"))
327 }
328
329 (Implicit, Path { angle_brackets: AngleBrackets::Missing }) => {
331 (self.ident.span.shrink_to_hi(), ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("<{0}>", new_lifetime))
})format!("<{new_lifetime}>"))
332 }
333
334 (Implicit, Reference) => (self.ident.span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0} ", new_lifetime))
})format!("{new_lifetime} ")),
336
337 (Implicit, source) => {
338 {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("can\'t suggest for a implicit lifetime of {0:?}",
source)));
}unreachable!("can't suggest for a implicit lifetime of {source:?}")
339 }
340 }
341 }
342}
343
344#[derive(#[automatically_derived]
impl<'hir, R: ::core::fmt::Debug> ::core::fmt::Debug for Path<'hir, R> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "Path", "span",
&self.span, "res", &self.res, "segments", &&self.segments)
}
}Debug, #[automatically_derived]
impl<'hir, R: ::core::clone::Clone> ::core::clone::Clone for Path<'hir, R> {
#[inline]
fn clone(&self) -> Self {
Path {
span: ::core::clone::Clone::clone(&self.span),
res: ::core::clone::Clone::clone(&self.res),
segments: ::core::clone::Clone::clone(&self.segments),
}
}
}Clone, #[automatically_derived]
impl<'hir, R: ::core::marker::Copy> ::core::marker::Copy for Path<'hir, R> { }Copy, const _: () =
{
impl<'hir, R> ::rustc_data_structures::stable_hash::StableHash for
Path<'hir, R> where
R: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Path {
span: ref __binding_0,
res: ref __binding_1,
segments: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
348pub struct Path<'hir, R = Res> {
349 pub span: Span,
350 pub res: R,
352 pub segments: &'hir [PathSegment<'hir>],
354}
355
356pub type UsePath<'hir> = Path<'hir, PerNS<Option<Res>>>;
358
359impl Path<'_> {
360 pub fn is_global(&self) -> bool {
361 self.segments.first().is_some_and(|segment| segment.ident.name == kw::PathRoot)
362 }
363}
364
365#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for PathSegment<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["ident", "hir_id", "res", "args", "infer_args",
"delegation_child_segment"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.ident, &self.hir_id, &self.res, &self.args,
&self.infer_args, &&self.delegation_child_segment];
::core::fmt::Formatter::debug_struct_fields_finish(f, "PathSegment",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for PathSegment<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for PathSegment<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Res>;
let _:
::core::clone::AssertParamIsClone<Option<&'hir GenericArgs<'hir>>>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for PathSegment<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PathSegment<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PathSegment {
ident: ref __binding_0,
hir_id: ref __binding_1,
res: ref __binding_2,
args: ref __binding_3,
infer_args: ref __binding_4,
delegation_child_segment: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{}
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
368pub struct PathSegment<'hir> {
369 pub ident: Ident,
371 #[stable_hash(ignore)]
372 pub hir_id: HirId,
373 pub res: Res,
374
375 pub args: Option<&'hir GenericArgs<'hir>>,
381
382 pub infer_args: bool,
387
388 pub delegation_child_segment: bool,
392}
393
394impl<'hir> PathSegment<'hir> {
395 pub fn new(ident: Ident, hir_id: HirId, res: Res) -> PathSegment<'hir> {
397 PathSegment {
398 ident,
399 hir_id,
400 res,
401 infer_args: true,
402 args: None,
403 delegation_child_segment: false,
404 }
405 }
406
407 pub fn invalid() -> Self {
408 Self::new(Ident::dummy(), HirId::INVALID, Res::Err)
409 }
410
411 pub fn args(&self) -> &GenericArgs<'hir> {
412 if let Some(ref args) = self.args { args } else { GenericArgs::NONE }
413 }
414}
415
416#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ConstItemRhs<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ConstItemRhs<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ConstItemRhs<'hir> { }Copy, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for ConstItemRhs<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Body(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Body",
&__self_0),
Self::Direct(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Direct",
&__self_0),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ConstItemRhs<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ConstItemRhs::Body(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstItemRhs::Direct(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
417pub enum ConstItemRhs<'hir> {
418 Body(BodyId),
419 Direct(&'hir ConstArg<'hir>),
420}
421
422impl<'hir> ConstItemRhs<'hir> {
423 pub fn hir_id(&self) -> HirId {
424 match self {
425 ConstItemRhs::Body(body_id) => body_id.hir_id,
426 ConstItemRhs::Direct(ct_arg) => ct_arg.hir_id,
427 }
428 }
429
430 pub fn span<'tcx>(&self, tcx: impl crate::intravisit::HirTyCtxt<'tcx>) -> Span {
431 match self {
432 ConstItemRhs::Body(body_id) => tcx.hir_body(*body_id).value.span,
433 ConstItemRhs::Direct(ct_arg) => ct_arg.span,
434 }
435 }
436}
437
438#[derive(#[automatically_derived]
impl<'hir, Unambig: ::core::clone::Clone> ::core::clone::Clone for
ConstArg<'hir, Unambig> {
#[inline]
fn clone(&self) -> Self {
ConstArg {
hir_id: ::core::clone::Clone::clone(&self.hir_id),
kind: ::core::clone::Clone::clone(&self.kind),
span: ::core::clone::Clone::clone(&self.span),
}
}
}Clone, #[automatically_derived]
impl<'hir, Unambig: ::core::marker::Copy> ::core::marker::Copy for
ConstArg<'hir, Unambig> {
}Copy, #[automatically_derived]
impl<'hir, Unambig: ::core::fmt::Debug> ::core::fmt::Debug for
ConstArg<'hir, Unambig> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "ConstArg",
"hir_id", &self.hir_id, "kind", &self.kind, "span", &&self.span)
}
}Debug, const _: () =
{
impl<'hir, Unambig> ::rustc_data_structures::stable_hash::StableHash
for ConstArg<'hir, Unambig> where
Unambig: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstArg {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
452#[repr(C)]
453pub struct ConstArg<'hir, Unambig = ()> {
454 #[stable_hash(ignore)]
455 pub hir_id: HirId,
456 pub kind: ConstArgKind<'hir, Unambig>,
457 pub span: Span,
458}
459
460impl<'hir> ConstArg<'hir, AmbigArg> {
461 pub fn as_unambig_ct(&self) -> &ConstArg<'hir> {
472 let ptr = self as *const ConstArg<'hir, AmbigArg> as *const ConstArg<'hir, ()>;
475 unsafe { &*ptr }
476 }
477}
478
479impl<'hir> ConstArg<'hir> {
480 pub fn try_as_ambig_ct(&self) -> Option<&ConstArg<'hir, AmbigArg>> {
486 if let ConstArgKind::Infer(()) = self.kind {
487 return None;
488 }
489
490 let ptr = self as *const ConstArg<'hir> as *const ConstArg<'hir, AmbigArg>;
494 Some(unsafe { &*ptr })
495 }
496}
497
498impl<'hir, Unambig> ConstArg<'hir, Unambig> {
499 pub fn anon_const_hir_id(&self) -> Option<HirId> {
500 match self.kind {
501 ConstArgKind::Anon(ac) => Some(ac.hir_id),
502 _ => None,
503 }
504 }
505}
506
507#[derive(#[automatically_derived]
impl<'hir, Unambig: ::core::clone::Clone> ::core::clone::Clone for
ConstArgKind<'hir, Unambig> {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Tup(__self_0) =>
ConstArgKind::Tup(::core::clone::Clone::clone(__self_0)),
Self::Path(__self_0) =>
ConstArgKind::Path(::core::clone::Clone::clone(__self_0)),
Self::Anon(__self_0) =>
ConstArgKind::Anon(::core::clone::Clone::clone(__self_0)),
Self::Struct(__self_0, __self_1) =>
ConstArgKind::Struct(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::TupleCall(__self_0, __self_1) =>
ConstArgKind::TupleCall(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Array(__self_0) =>
ConstArgKind::Array(::core::clone::Clone::clone(__self_0)),
Self::Error(__self_0) =>
ConstArgKind::Error(::core::clone::Clone::clone(__self_0)),
Self::Infer(__self_0) =>
ConstArgKind::Infer(::core::clone::Clone::clone(__self_0)),
Self::Literal { lit: __self_0, negated: __self_1 } =>
ConstArgKind::Literal {
lit: ::core::clone::Clone::clone(__self_0),
negated: ::core::clone::Clone::clone(__self_1),
},
}
}
}Clone, #[automatically_derived]
impl<'hir, Unambig: ::core::marker::Copy> ::core::marker::Copy for
ConstArgKind<'hir, Unambig> {
}Copy, #[automatically_derived]
impl<'hir, Unambig: ::core::fmt::Debug> ::core::fmt::Debug for
ConstArgKind<'hir, Unambig> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Tup(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
&__self_0),
Self::Path(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Path",
&__self_0),
Self::Anon(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Anon",
&__self_0),
Self::Struct(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Struct",
__self_0, &__self_1),
Self::TupleCall(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"TupleCall", __self_0, &__self_1),
Self::Array(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Array",
&__self_0),
Self::Error(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Error",
&__self_0),
Self::Infer(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Infer",
&__self_0),
Self::Literal { lit: __self_0, negated: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Literal", "lit", __self_0, "negated", &__self_1),
}
}
}Debug, const _: () =
{
impl<'hir, Unambig> ::rustc_data_structures::stable_hash::StableHash
for ConstArgKind<'hir, Unambig> where
Unambig: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ConstArgKind::Tup(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Path(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Anon(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Struct(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ConstArgKind::TupleCall(ref __binding_0, ref __binding_1) =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Array(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Error(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ConstArgKind::Literal {
lit: ref __binding_0, negated: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
509#[repr(u8, C)]
510pub enum ConstArgKind<'hir, Unambig = ()> {
511 Tup(&'hir [ConstArg<'hir>]),
512 Path(QPath<'hir>),
518 Anon(&'hir AnonConst),
519 Struct(QPath<'hir>, &'hir [ConstArgExprField<'hir>]),
521 TupleCall(QPath<'hir>, &'hir [ConstArg<'hir>]),
523 Array(&'hir ConstArgArrayExpr<'hir>),
525 Error(ErrorGuaranteed),
527 Infer(Unambig),
530 Literal {
531 lit: LitKind,
532 negated: bool,
533 },
534}
535
536#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ConstArgExprField<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ConstArgExprField<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ConstArgExprField<'hir> { }Copy, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for ConstArgExprField<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"ConstArgExprField", "hir_id", &self.hir_id, "span", &self.span,
"field", &self.field, "expr", &&self.expr)
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ConstArgExprField<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstArgExprField {
hir_id: ref __binding_0,
span: ref __binding_1,
field: ref __binding_2,
expr: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
537pub struct ConstArgExprField<'hir> {
538 pub hir_id: HirId,
539 pub span: Span,
540 pub field: Ident,
541 pub expr: &'hir ConstArg<'hir>,
542}
543
544#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ConstArgArrayExpr<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ConstArgArrayExpr<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir [ConstArg<'hir>]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ConstArgArrayExpr<'hir> { }Copy, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for ConstArgArrayExpr<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ConstArgArrayExpr", "span", &self.span, "elems", &&self.elems)
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ConstArgArrayExpr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstArgArrayExpr {
span: ref __binding_0, elems: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
545pub struct ConstArgArrayExpr<'hir> {
546 pub span: Span,
547 pub elems: &'hir [ConstArg<'hir>],
548}
549
550#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InferArgKind { }
#[automatically_derived]
impl ::core::clone::Clone for InferArgKind {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InferArgKind { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for InferArgKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
InferArgKind::TypeOrConst => "TypeOrConst",
InferArgKind::Const => "Const",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for InferArgKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for InferArgKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for InferArgKind { }Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for InferArgKind
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
InferArgKind::TypeOrConst => {}
InferArgKind::Const => {}
}
}
}
};StableHash)]
552pub enum InferArgKind {
553 TypeOrConst,
556 Const,
559}
560
561#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InferArg { }
#[automatically_derived]
impl ::core::clone::Clone for InferArg {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<InferArgKind>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InferArg { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for InferArg {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "InferArg",
"hir_id", &self.hir_id, "span", &self.span, "kind", &&self.kind)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for InferArg {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InferArg {
hir_id: ref __binding_0,
span: ref __binding_1,
kind: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
562pub struct InferArg {
563 #[stable_hash(ignore)]
564 pub hir_id: HirId,
565 pub span: Span,
566 pub kind: InferArgKind,
567}
568
569impl InferArg {
570 pub fn to_ty(&self) -> Ty<'static> {
571 Ty { kind: TyKind::Infer(()), span: self.span, hir_id: self.hir_id }
572 }
573}
574
575#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for GenericArg<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Lifetime(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Lifetime", &__self_0),
Self::Type(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
&__self_0),
Self::Const(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
&__self_0),
Self::Infer(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Infer",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for GenericArg<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for GenericArg<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir, AmbigArg>>;
let _:
::core::clone::AssertParamIsClone<&'hir ConstArg<'hir,
AmbigArg>>;
let _: ::core::clone::AssertParamIsClone<&'hir InferArg>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for GenericArg<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericArg<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
GenericArg::Lifetime(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericArg::Type(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericArg::Const(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericArg::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
576pub enum GenericArg<'hir> {
577 Lifetime(&'hir Lifetime),
578 Type(&'hir Ty<'hir, AmbigArg>),
579 Const(&'hir ConstArg<'hir, AmbigArg>),
580 Infer(&'hir InferArg),
590}
591
592impl GenericArg<'_> {
593 pub fn span(&self) -> Span {
594 match self {
595 GenericArg::Lifetime(l) => l.ident.span,
596 GenericArg::Type(t) => t.span,
597 GenericArg::Const(c) => c.span,
598 GenericArg::Infer(i) => i.span,
599 }
600 }
601
602 pub fn hir_id(&self) -> HirId {
603 match self {
604 GenericArg::Lifetime(l) => l.hir_id,
605 GenericArg::Type(t) => t.hir_id,
606 GenericArg::Const(c) => c.hir_id,
607 GenericArg::Infer(i) => i.hir_id,
608 }
609 }
610
611 pub fn descr(&self) -> &'static str {
612 match self {
613 GenericArg::Lifetime(_) => "lifetime",
614 GenericArg::Type(_) => "type",
615 GenericArg::Const(_) => "constant",
616 GenericArg::Infer(InferArg { kind: InferArgKind::TypeOrConst, .. }) => "placeholder",
617 GenericArg::Infer(InferArg { kind: InferArgKind::Const, .. }) => "constant",
618 }
619 }
620
621 pub fn to_ord(&self) -> ast::ParamKindOrd {
622 match self {
623 GenericArg::Lifetime(_) => ast::ParamKindOrd::Lifetime,
624 GenericArg::Type(_) | GenericArg::Const(_) | GenericArg::Infer(_) => {
625 ast::ParamKindOrd::TypeOrConst
626 }
627 }
628 }
629
630 pub fn is_ty_or_const(&self) -> bool {
631 match self {
632 GenericArg::Lifetime(_) => false,
633 GenericArg::Type(_) | GenericArg::Const(_) | GenericArg::Infer(_) => true,
634 }
635 }
636}
637
638#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for GenericArgs<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "GenericArgs",
"args", &self.args, "constraints", &self.constraints,
"parenthesized", &self.parenthesized, "span_ext", &&self.span_ext)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for GenericArgs<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for GenericArgs<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [GenericArg<'hir>]>;
let _:
::core::clone::AssertParamIsClone<&'hir [AssocItemConstraint<'hir>]>;
let _: ::core::clone::AssertParamIsClone<GenericArgsParentheses>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for GenericArgs<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericArgs<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericArgs {
args: ref __binding_0,
constraints: ref __binding_1,
parenthesized: ref __binding_2,
span_ext: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
640pub struct GenericArgs<'hir> {
641 pub args: &'hir [GenericArg<'hir>],
643 pub constraints: &'hir [AssocItemConstraint<'hir>],
645 pub parenthesized: GenericArgsParentheses,
650 pub span_ext: Span,
663}
664
665impl<'hir> GenericArgs<'hir> {
666 pub const NONE: &'hir GenericArgs<'hir> = &GenericArgs {
667 args: &[],
668 constraints: &[],
669 parenthesized: GenericArgsParentheses::No,
670 span_ext: DUMMY_SP,
671 };
672
673 pub fn paren_sugar_inputs_output(&self) -> Option<(&[Ty<'hir>], &Ty<'hir>)> {
678 if self.parenthesized != GenericArgsParentheses::ParenSugar {
679 return None;
680 }
681
682 let inputs = self
683 .args
684 .iter()
685 .find_map(|arg| {
686 let GenericArg::Type(ty) = arg else { return None };
687 let TyKind::Tup(tys) = &ty.kind else { return None };
688 Some(tys)
689 })
690 .unwrap();
691
692 Some((inputs, self.paren_sugar_output_inner()))
693 }
694
695 pub fn paren_sugar_output(&self) -> Option<&Ty<'hir>> {
700 (self.parenthesized == GenericArgsParentheses::ParenSugar)
701 .then(|| self.paren_sugar_output_inner())
702 }
703
704 fn paren_sugar_output_inner(&self) -> &Ty<'hir> {
705 let [constraint] = self.constraints.try_into().unwrap();
706 if true {
{
match (&constraint.ident.name, &sym::Output) {
(left_val, right_val) => {
if !(*left_val == *right_val) {
let kind = ::core::panicking::AssertKind::Eq;
::core::panicking::assert_failed(kind, &*left_val,
&*right_val, ::core::option::Option::None);
}
}
}
};
};debug_assert_eq!(constraint.ident.name, sym::Output);
707 constraint.ty().unwrap()
708 }
709
710 pub fn has_err(&self) -> Option<ErrorGuaranteed> {
711 self.args
712 .iter()
713 .find_map(|arg| {
714 let GenericArg::Type(ty) = arg else { return None };
715 let TyKind::Err(guar) = ty.kind else { return None };
716 Some(guar)
717 })
718 .or_else(|| {
719 self.constraints.iter().find_map(|constraint| {
720 let TyKind::Err(guar) = constraint.ty()?.kind else { return None };
721 Some(guar)
722 })
723 })
724 }
725
726 #[inline]
727 pub fn num_lifetime_args(&self) -> usize {
728 self.args.iter().filter(|arg| #[allow(non_exhaustive_omitted_patterns)] match arg {
GenericArg::Lifetime(_) => true,
_ => false,
}matches!(arg, GenericArg::Lifetime(_))).count()
729 }
730
731 #[inline]
732 pub fn has_lifetime_args(&self) -> bool {
733 self.args.iter().any(|arg| #[allow(non_exhaustive_omitted_patterns)] match arg {
GenericArg::Lifetime(_) => true,
_ => false,
}matches!(arg, GenericArg::Lifetime(_)))
734 }
735
736 #[inline]
737 pub fn num_generic_params(&self) -> usize {
740 self.args.iter().filter(|arg| !#[allow(non_exhaustive_omitted_patterns)] match arg {
GenericArg::Lifetime(_) => true,
_ => false,
}matches!(arg, GenericArg::Lifetime(_))).count()
741 }
742
743 pub fn span(&self) -> Option<Span> {
749 let span_ext = self.span_ext()?;
750 Some(span_ext.with_lo(span_ext.lo() + BytePos(1)).with_hi(span_ext.hi() - BytePos(1)))
751 }
752
753 pub fn span_ext(&self) -> Option<Span> {
755 Some(self.span_ext).filter(|span| !span.is_empty())
756 }
757
758 pub fn is_empty(&self) -> bool {
759 self.args.is_empty()
760 }
761}
762
763#[derive(#[automatically_derived]
impl ::core::marker::Copy for GenericArgsParentheses { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for GenericArgsParentheses { }
#[automatically_derived]
impl ::core::clone::Clone for GenericArgsParentheses {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for GenericArgsParentheses { }
#[automatically_derived]
impl ::core::cmp::PartialEq for GenericArgsParentheses {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for GenericArgsParentheses { }Eq, #[automatically_derived]
impl ::core::fmt::Debug for GenericArgsParentheses {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
GenericArgsParentheses::No => "No",
GenericArgsParentheses::ReturnTypeNotation =>
"ReturnTypeNotation",
GenericArgsParentheses::ParenSugar => "ParenSugar",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
GenericArgsParentheses {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
GenericArgsParentheses::No => {}
GenericArgsParentheses::ReturnTypeNotation => {}
GenericArgsParentheses::ParenSugar => {}
}
}
}
};StableHash)]
764pub enum GenericArgsParentheses {
765 No,
766 ReturnTypeNotation,
769 ParenSugar,
771}
772
773#[derive(#[automatically_derived]
impl ::core::marker::Copy for TraitBoundModifiers { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TraitBoundModifiers { }
#[automatically_derived]
impl ::core::clone::Clone for TraitBoundModifiers {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<BoundConstness>;
let _: ::core::clone::AssertParamIsClone<BoundPolarity>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for TraitBoundModifiers { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TraitBoundModifiers {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.constness == other.constness && self.polarity == other.polarity
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TraitBoundModifiers {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<BoundConstness>;
let _: ::core::cmp::AssertParamIsEq<BoundPolarity>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for TraitBoundModifiers {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.constness, state);
::core::hash::Hash::hash(&self.polarity, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for TraitBoundModifiers {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TraitBoundModifiers", "constness", &self.constness, "polarity",
&&self.polarity)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
TraitBoundModifiers {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitBoundModifiers {
constness: ref __binding_0, polarity: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
775pub struct TraitBoundModifiers {
776 pub constness: BoundConstness,
777 pub polarity: BoundPolarity,
778}
779
780impl TraitBoundModifiers {
781 pub const NONE: Self =
782 TraitBoundModifiers { constness: BoundConstness::Never, polarity: BoundPolarity::Positive };
783}
784
785#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for GenericBound<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for GenericBound<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<PolyTraitRef<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _:
::core::clone::AssertParamIsClone<&'hir [PreciseCapturingArg<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for GenericBound<'hir> { }Copy, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for GenericBound<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Trait(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
&__self_0),
Self::Outlives(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Outlives", &__self_0),
Self::Use(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Use",
__self_0, &__self_1),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericBound<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
GenericBound::Trait(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericBound::Outlives(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericBound::Use(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
786pub enum GenericBound<'hir> {
787 Trait(PolyTraitRef<'hir>),
788 Outlives(&'hir Lifetime),
789 Use(&'hir [PreciseCapturingArg<'hir>], Span),
790}
791
792impl GenericBound<'_> {
793 pub fn trait_ref(&self) -> Option<&TraitRef<'_>> {
794 match self {
795 GenericBound::Trait(data) => Some(&data.trait_ref),
796 _ => None,
797 }
798 }
799
800 pub fn span(&self) -> Span {
801 match self {
802 GenericBound::Trait(t, ..) => t.span,
803 GenericBound::Outlives(l) => l.ident.span,
804 GenericBound::Use(_, span) => *span,
805 }
806 }
807}
808
809pub type GenericBounds<'hir> = &'hir [GenericBound<'hir>];
810
811#[derive(#[automatically_derived]
impl ::core::marker::Copy for MissingLifetimeKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MissingLifetimeKind { }
#[automatically_derived]
impl ::core::clone::Clone for MissingLifetimeKind {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MissingLifetimeKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MissingLifetimeKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MissingLifetimeKind { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for MissingLifetimeKind {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for MissingLifetimeKind {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]
impl ::core::hash::Hash for MissingLifetimeKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
MissingLifetimeKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
MissingLifetimeKind::Underscore => {}
MissingLifetimeKind::Ampersand => {}
MissingLifetimeKind::Comma => {}
MissingLifetimeKind::Brackets => {}
}
}
}
};StableHash, #[automatically_derived]
impl ::core::fmt::Debug for MissingLifetimeKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
MissingLifetimeKind::Underscore => "Underscore",
MissingLifetimeKind::Ampersand => "Ampersand",
MissingLifetimeKind::Comma => "Comma",
MissingLifetimeKind::Brackets => "Brackets",
})
}
}Debug)]
812pub enum MissingLifetimeKind {
813 Underscore,
815 Ampersand,
817 Comma,
819 Brackets,
821}
822
823#[derive(#[automatically_derived]
impl ::core::marker::Copy for LifetimeParamKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LifetimeParamKind { }
#[automatically_derived]
impl ::core::clone::Clone for LifetimeParamKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<MissingLifetimeKind>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for LifetimeParamKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Explicit =>
::core::fmt::Formatter::write_str(f, "Explicit"),
Self::Elided(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Elided",
&__self_0),
Self::Error => ::core::fmt::Formatter::write_str(f, "Error"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
LifetimeParamKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
LifetimeParamKind::Explicit => {}
LifetimeParamKind::Elided(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
LifetimeParamKind::Error => {}
}
}
}
};StableHash)]
824pub enum LifetimeParamKind {
825 Explicit,
828
829 Elided(MissingLifetimeKind),
832
833 Error,
835}
836
837#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for GenericParamKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Lifetime { kind: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Lifetime", "kind", &__self_0),
Self::Type { default: __self_0, synthetic: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Type",
"default", __self_0, "synthetic", &__self_1),
Self::Const { ty: __self_0, default: __self_1, arg_pos: __self_2 }
=>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Const",
"ty", __self_0, "default", __self_1, "arg_pos", &__self_2),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for GenericParamKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for GenericParamKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<LifetimeParamKind>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _:
::core::clone::AssertParamIsClone<Option<&'hir ConstArg<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<u16>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for GenericParamKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericParamKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
GenericParamKind::Lifetime { kind: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
GenericParamKind::Type {
default: ref __binding_0, synthetic: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
GenericParamKind::Const {
ty: ref __binding_0,
default: ref __binding_1,
arg_pos: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
838pub enum GenericParamKind<'hir> {
839 Lifetime {
841 kind: LifetimeParamKind,
842 },
843 Type {
844 default: Option<&'hir Ty<'hir>>,
845 synthetic: bool,
846 },
847 Const {
848 ty: &'hir Ty<'hir>,
849 default: Option<&'hir ConstArg<'hir>>,
851 arg_pos: Option<u16>,
854 },
855}
856
857#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for GenericParam<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["hir_id", "def_id", "name", "span", "pure_wrt_drop", "kind",
"colon_span", "source"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.hir_id, &self.def_id, &self.name, &self.span,
&self.pure_wrt_drop, &self.kind, &self.colon_span,
&&self.source];
::core::fmt::Formatter::debug_struct_fields_finish(f, "GenericParam",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for GenericParam<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for GenericParam<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<ParamName>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<GenericParamKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<GenericParamSource>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for GenericParam<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
GenericParam<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
GenericParam {
hir_id: ref __binding_0,
def_id: ref __binding_1,
name: ref __binding_2,
span: ref __binding_3,
pure_wrt_drop: ref __binding_4,
kind: ref __binding_5,
colon_span: ref __binding_6,
source: ref __binding_7 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
858pub struct GenericParam<'hir> {
859 #[stable_hash(ignore)]
860 pub hir_id: HirId,
861 pub def_id: LocalDefId,
862 pub name: ParamName,
863 pub span: Span,
864 pub pure_wrt_drop: bool,
865 pub kind: GenericParamKind<'hir>,
866 pub colon_span: Option<Span>,
867 pub source: GenericParamSource,
868}
869
870impl<'hir> GenericParam<'hir> {
871 pub fn is_impl_trait(&self) -> bool {
875 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
GenericParamKind::Type { synthetic: true, .. } => true,
_ => false,
}matches!(self.kind, GenericParamKind::Type { synthetic: true, .. })
876 }
877
878 pub fn is_elided_lifetime(&self) -> bool {
882 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
GenericParamKind::Lifetime { kind: LifetimeParamKind::Elided(_) } => true,
_ => false,
}matches!(self.kind, GenericParamKind::Lifetime { kind: LifetimeParamKind::Elided(_) })
883 }
884
885 pub fn is_lifetime(&self) -> bool {
886 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
GenericParamKind::Lifetime { .. } => true,
_ => false,
}matches!(self.kind, GenericParamKind::Lifetime { .. })
887 }
888}
889
890#[derive(#[automatically_derived]
impl ::core::fmt::Debug for GenericParamSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
GenericParamSource::Generics => "Generics",
GenericParamSource::Binder => "Binder",
})
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for GenericParamSource { }
#[automatically_derived]
impl ::core::clone::Clone for GenericParamSource {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for GenericParamSource { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
GenericParamSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
GenericParamSource::Generics => {}
GenericParamSource::Binder => {}
}
}
}
};StableHash)]
897pub enum GenericParamSource {
898 Generics,
900 Binder,
902}
903
904#[derive(#[automatically_derived]
impl ::core::default::Default for GenericParamCount {
#[inline]
fn default() -> Self {
GenericParamCount {
lifetimes: ::core::default::Default::default(),
types: ::core::default::Default::default(),
consts: ::core::default::Default::default(),
infer: ::core::default::Default::default(),
}
}
}Default)]
905pub struct GenericParamCount {
906 pub lifetimes: usize,
907 pub types: usize,
908 pub consts: usize,
909 pub infer: usize,
910}
911
912#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Generics<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "Generics",
"params", &self.params, "predicates", &self.predicates,
"has_where_clause_predicates", &self.has_where_clause_predicates,
"where_clause_span", &self.where_clause_span, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Generics<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Generics<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _:
::core::clone::AssertParamIsClone<&'hir [WherePredicate<'hir>]>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Generics<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Generics<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Generics {
params: ref __binding_0,
predicates: ref __binding_1,
has_where_clause_predicates: ref __binding_2,
where_clause_span: ref __binding_3,
span: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
915pub struct Generics<'hir> {
916 pub params: &'hir [GenericParam<'hir>],
917 pub predicates: &'hir [WherePredicate<'hir>],
918 pub has_where_clause_predicates: bool,
919 pub where_clause_span: Span,
920 pub span: Span,
921}
922
923impl<'hir> Generics<'hir> {
924 pub const fn empty() -> &'hir Generics<'hir> {
925 const NOPE: Generics<'_> = Generics {
926 params: &[],
927 predicates: &[],
928 has_where_clause_predicates: false,
929 where_clause_span: DUMMY_SP,
930 span: DUMMY_SP,
931 };
932 &NOPE
933 }
934
935 pub fn get_named(&self, name: Symbol) -> Option<&GenericParam<'hir>> {
936 self.params.iter().find(|¶m| name == param.name.ident().name)
937 }
938
939 pub fn span_for_lifetime_suggestion(&self) -> Option<Span> {
941 if let Some(first) = self.params.first()
942 && self.span.contains(first.span)
943 {
944 Some(first.span.shrink_to_lo())
947 } else {
948 None
949 }
950 }
951
952 pub fn span_for_param_suggestion(&self) -> Option<Span> {
954 self.params.iter().any(|p| self.span.contains(p.span)).then(|| {
955 self.span.with_lo(self.span.hi() - BytePos(1)).shrink_to_lo()
958 })
959 }
960
961 pub fn tail_span_for_predicate_suggestion(&self) -> Span {
964 let end = self.where_clause_span.shrink_to_hi();
965 if self.has_where_clause_predicates {
966 self.predicates
967 .iter()
968 .rfind(|&p| p.kind.in_where_clause())
969 .map_or(end, |p| p.span)
970 .shrink_to_hi()
971 .to(end)
972 } else {
973 end
974 }
975 }
976
977 pub fn add_where_or_trailing_comma(&self) -> &'static str {
978 if self.has_where_clause_predicates {
979 ","
980 } else if self.where_clause_span.is_empty() {
981 " where"
982 } else {
983 ""
985 }
986 }
987
988 pub fn bounds_for_param(
989 &self,
990 param_def_id: LocalDefId,
991 ) -> impl Iterator<Item = &WhereBoundPredicate<'hir>> {
992 self.predicates.iter().filter_map(move |pred| match pred.kind {
993 WherePredicateKind::BoundPredicate(bp)
994 if bp.is_param_bound(param_def_id.to_def_id()) =>
995 {
996 Some(bp)
997 }
998 _ => None,
999 })
1000 }
1001
1002 pub fn outlives_for_param(
1003 &self,
1004 param_def_id: LocalDefId,
1005 ) -> impl Iterator<Item = &WhereRegionPredicate<'_>> {
1006 self.predicates.iter().filter_map(move |pred| match pred.kind {
1007 WherePredicateKind::RegionPredicate(rp) if rp.is_param_bound(param_def_id) => Some(rp),
1008 _ => None,
1009 })
1010 }
1011
1012 pub fn bounds_span_for_suggestions(
1023 &self,
1024 param_def_id: LocalDefId,
1025 ) -> Option<(Span, Option<Span>)> {
1026 self.bounds_for_param(param_def_id).flat_map(|bp| bp.bounds.iter().rev()).find_map(
1027 |bound| {
1028 let span_for_parentheses = if let Some(trait_ref) = bound.trait_ref()
1029 && let [.., segment] = trait_ref.path.segments
1030 && let Some(ret_ty) = segment.args().paren_sugar_output()
1031 && let ret_ty = ret_ty.peel_refs()
1032 && let TyKind::TraitObject(_, tagged_ptr) = ret_ty.kind
1033 && let TraitObjectSyntax::Dyn = tagged_ptr.tag()
1034 && ret_ty.span.can_be_used_for_suggestions()
1035 {
1036 Some(ret_ty.span)
1037 } else {
1038 None
1039 };
1040
1041 span_for_parentheses.map_or_else(
1042 || {
1043 let bs = bound.span();
1046 bs.from_expansion().not().then(|| (bs.shrink_to_hi(), None))
1051 },
1052 |span| Some((span.shrink_to_hi(), Some(span.shrink_to_lo()))),
1053 )
1054 },
1055 )
1056 }
1057
1058 pub fn span_for_predicate_removal(&self, pos: usize) -> Span {
1059 let predicate = &self.predicates[pos];
1060 let span = predicate.span;
1061
1062 if !predicate.kind.in_where_clause() {
1063 return span;
1066 }
1067
1068 if pos < self.predicates.len() - 1 {
1070 let next_pred = &self.predicates[pos + 1];
1071 if next_pred.kind.in_where_clause() {
1072 return span.until(next_pred.span);
1075 }
1076 }
1077
1078 if pos > 0 {
1079 let prev_pred = &self.predicates[pos - 1];
1080 if prev_pred.kind.in_where_clause() {
1081 return prev_pred.span.shrink_to_hi().to(span);
1084 }
1085 }
1086
1087 self.where_clause_span
1091 }
1092
1093 pub fn span_for_bound_removal(&self, predicate_pos: usize, bound_pos: usize) -> Span {
1094 let predicate = &self.predicates[predicate_pos];
1095 let bounds = predicate.kind.bounds();
1096
1097 if bounds.len() == 1 {
1098 return self.span_for_predicate_removal(predicate_pos);
1099 }
1100
1101 let bound_span = bounds[bound_pos].span();
1102 if bound_pos < bounds.len() - 1 {
1103 bound_span.to(bounds[bound_pos + 1].span().shrink_to_lo())
1109 } else {
1110 bound_span.with_lo(bounds[bound_pos - 1].span().hi())
1116 }
1117 }
1118
1119 pub fn span_for_param_removal(&self, param_index: usize) -> Span {
1142 if param_index >= self.params.len() {
1143 return self.span.shrink_to_hi();
1144 }
1145
1146 let is_param_explicit = |par: &&GenericParam<'_>| match par.kind {
1147 GenericParamKind::Type { .. }
1148 | GenericParamKind::Const { .. }
1149 | GenericParamKind::Lifetime { kind: LifetimeParamKind::Explicit } => true,
1150 _ => false,
1151 };
1152
1153 if let Some(next) = self.params[param_index + 1..].iter().find(is_param_explicit) {
1155 self.params[param_index].span.until(next.span)
1156 } else if let Some(prev) = self.params[..param_index].iter().rfind(is_param_explicit) {
1157 let mut prev_span = prev.span;
1158 if let Some(prev_bounds_span) = self.span_for_param_bounds(prev) {
1160 prev_span = prev_span.to(prev_bounds_span);
1161 }
1162
1163 prev_span.shrink_to_hi().to(
1165 if let Some(cur_bounds_span) = self.span_for_param_bounds(&self.params[param_index])
1166 {
1167 cur_bounds_span
1168 } else {
1169 self.params[param_index].span
1170 },
1171 )
1172 } else {
1173 self.span
1175 }
1176 }
1177
1178 fn span_for_param_bounds(&self, param: &GenericParam<'hir>) -> Option<Span> {
1189 self.predicates
1190 .iter()
1191 .find(|pred| {
1192 if let WherePredicateKind::BoundPredicate(WhereBoundPredicate {
1193 origin: PredicateOrigin::GenericParam,
1194 bounded_ty,
1195 ..
1196 }) = pred.kind
1197 {
1198 bounded_ty.span == param.span
1199 } else {
1200 false
1201 }
1202 })
1203 .map(|pred| pred.span)
1204 }
1205}
1206
1207#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for WherePredicate<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"WherePredicate", "hir_id", &self.hir_id, "span", &self.span,
"kind", &&self.kind)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for WherePredicate<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for WherePredicate<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _:
::core::clone::AssertParamIsClone<&'hir WherePredicateKind<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for WherePredicate<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WherePredicate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
WherePredicate {
hir_id: ref __binding_0,
span: ref __binding_1,
kind: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1209pub struct WherePredicate<'hir> {
1210 #[stable_hash(ignore)]
1211 pub hir_id: HirId,
1212 pub span: Span,
1213 pub kind: &'hir WherePredicateKind<'hir>,
1214}
1215
1216#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for WherePredicateKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::BoundPredicate(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"BoundPredicate", &__self_0),
Self::RegionPredicate(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"RegionPredicate", &__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for WherePredicateKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for WherePredicateKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<WhereBoundPredicate<'hir>>;
let _: ::core::clone::AssertParamIsClone<WhereRegionPredicate<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for WherePredicateKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WherePredicateKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
WherePredicateKind::BoundPredicate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
WherePredicateKind::RegionPredicate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1218pub enum WherePredicateKind<'hir> {
1219 BoundPredicate(WhereBoundPredicate<'hir>),
1221 RegionPredicate(WhereRegionPredicate<'hir>),
1223}
1224
1225impl<'hir> WherePredicateKind<'hir> {
1226 pub fn in_where_clause(&self) -> bool {
1227 match self {
1228 WherePredicateKind::BoundPredicate(p) => p.origin == PredicateOrigin::WhereClause,
1229 WherePredicateKind::RegionPredicate(p) => p.in_where_clause,
1230 }
1231 }
1232
1233 pub fn bounds(&self) -> GenericBounds<'hir> {
1234 match self {
1235 WherePredicateKind::BoundPredicate(p) => p.bounds,
1236 WherePredicateKind::RegionPredicate(p) => p.bounds,
1237 }
1238 }
1239}
1240
1241#[derive(#[automatically_derived]
impl ::core::marker::Copy for PredicateOrigin { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PredicateOrigin { }
#[automatically_derived]
impl ::core::clone::Clone for PredicateOrigin {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for PredicateOrigin {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
PredicateOrigin::WhereClause => "WhereClause",
PredicateOrigin::GenericParam => "GenericParam",
PredicateOrigin::ImplTrait => "ImplTrait",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
PredicateOrigin {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
PredicateOrigin::WhereClause => {}
PredicateOrigin::GenericParam => {}
PredicateOrigin::ImplTrait => {}
}
}
}
};StableHash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PredicateOrigin { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PredicateOrigin {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for PredicateOrigin { }Eq)]
1242pub enum PredicateOrigin {
1243 WhereClause,
1244 GenericParam,
1245 ImplTrait,
1246}
1247
1248#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for WhereBoundPredicate<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"WhereBoundPredicate", "origin", &self.origin,
"bound_generic_params", &self.bound_generic_params, "bounded_ty",
&self.bounded_ty, "bounds", &&self.bounds)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for WhereBoundPredicate<'hir> {
}
#[automatically_derived]
impl<'hir> ::core::clone::Clone for WhereBoundPredicate<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<PredicateOrigin>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for WhereBoundPredicate<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WhereBoundPredicate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
WhereBoundPredicate {
origin: ref __binding_0,
bound_generic_params: ref __binding_1,
bounded_ty: ref __binding_2,
bounds: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1250pub struct WhereBoundPredicate<'hir> {
1251 pub origin: PredicateOrigin,
1253 pub bound_generic_params: &'hir [GenericParam<'hir>],
1255 pub bounded_ty: &'hir Ty<'hir>,
1257 pub bounds: GenericBounds<'hir>,
1259}
1260
1261impl<'hir> WhereBoundPredicate<'hir> {
1262 pub fn is_param_bound(&self, param_def_id: DefId) -> bool {
1264 self.bounded_ty.as_generic_param().is_some_and(|(def_id, _)| def_id == param_def_id)
1265 }
1266}
1267
1268#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for WhereRegionPredicate<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"WhereRegionPredicate", "in_where_clause", &self.in_where_clause,
"lifetime", &self.lifetime, "bounds", &&self.bounds)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for WhereRegionPredicate<'hir> {
}
#[automatically_derived]
impl<'hir> ::core::clone::Clone for WhereRegionPredicate<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for WhereRegionPredicate<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WhereRegionPredicate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
WhereRegionPredicate {
in_where_clause: ref __binding_0,
lifetime: ref __binding_1,
bounds: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1270pub struct WhereRegionPredicate<'hir> {
1271 pub in_where_clause: bool,
1272 pub lifetime: &'hir Lifetime,
1273 pub bounds: GenericBounds<'hir>,
1274}
1275
1276impl<'hir> WhereRegionPredicate<'hir> {
1277 fn is_param_bound(&self, param_def_id: LocalDefId) -> bool {
1279 self.lifetime.kind == LifetimeKind::Param(param_def_id)
1280 }
1281}
1282
1283#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for WhereEqPredicate<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"WhereEqPredicate", "lhs_ty", &self.lhs_ty, "rhs_ty",
&&self.rhs_ty)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for WhereEqPredicate<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for WhereEqPredicate<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for WhereEqPredicate<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
WhereEqPredicate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
WhereEqPredicate {
lhs_ty: ref __binding_0, rhs_ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1285pub struct WhereEqPredicate<'hir> {
1286 pub lhs_ty: &'hir Ty<'hir>,
1287 pub rhs_ty: &'hir Ty<'hir>,
1288}
1289
1290#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'tcx> ::core::clone::TrivialClone for ParentedNode<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::clone::Clone for ParentedNode<'tcx> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<ItemLocalId>;
let _: ::core::clone::AssertParamIsClone<Node<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::marker::Copy for ParentedNode<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ParentedNode<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "ParentedNode",
"parent", &self.parent, "node", &&self.node)
}
}Debug)]
1294pub struct ParentedNode<'tcx> {
1295 pub parent: ItemLocalId,
1296 pub node: Node<'tcx>,
1297}
1298
1299#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for AttributeMap<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "AttributeMap",
"map", &self.map, "define_opaque", &self.define_opaque,
"opt_hash", &&self.opt_hash)
}
}Debug)]
1301pub struct AttributeMap<'tcx> {
1302 pub map: SortedMap<ItemLocalId, &'tcx [Attribute]>,
1303 pub define_opaque: Option<&'tcx [(Span, LocalDefId)]>,
1305 pub opt_hash: Option<Fingerprint>,
1307}
1308
1309impl<'tcx> AttributeMap<'tcx> {
1310 pub const EMPTY: &'static AttributeMap<'static> = &AttributeMap {
1311 map: SortedMap::new(),
1312 opt_hash: Some(Fingerprint::ZERO),
1313 define_opaque: None,
1314 };
1315
1316 #[inline]
1317 pub fn get(&self, id: ItemLocalId) -> &'tcx [Attribute] {
1318 self.map.get(&id).copied().unwrap_or(&[])
1319 }
1320}
1321
1322pub struct OwnerNodes<'tcx> {
1326 pub opt_hash: Option<Fingerprint>,
1329 pub nodes: IndexVec<ItemLocalId, ParentedNode<'tcx>>,
1334 pub bodies: SortedMap<ItemLocalId, &'tcx Body<'tcx>>,
1336}
1337
1338impl<'tcx> OwnerNodes<'tcx> {
1339 pub fn node(&self) -> OwnerNode<'tcx> {
1340 self.nodes[ItemLocalId::ZERO].node.as_owner().unwrap()
1342 }
1343
1344 pub fn synthetic() -> OwnerNodes<'tcx> {
1346 OwnerNodes {
1347 opt_hash: Some(Fingerprint::ZERO),
1350 nodes: IndexVec::from_elem_n(
1351 ParentedNode { parent: ItemLocalId::INVALID, node: OwnerNode::Synthetic.into() },
1352 1,
1353 ),
1354 bodies: SortedMap::new(),
1355 }
1356 }
1357}
1358
1359impl fmt::Debug for OwnerNodes<'_> {
1360 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1361 f.debug_struct("OwnerNodes")
1362 .field("node", &self.nodes[ItemLocalId::ZERO])
1364 .field(
1365 "parents",
1366 &fmt::from_fn(|f| {
1367 f.debug_list()
1368 .entries(self.nodes.iter_enumerated().map(|(id, parented_node)| {
1369 fmt::from_fn(move |f| f.write_fmt(format_args!("({1:?}, {0:?})", parented_node.parent, id))write!(f, "({id:?}, {:?})", parented_node.parent))
1370 }))
1371 .finish()
1372 }),
1373 )
1374 .field("bodies", &self.bodies)
1375 .field("opt_hash", &self.opt_hash)
1376 .finish()
1377 }
1378}
1379
1380#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for OwnerInfo<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["nodes", "parenting", "attrs", "trait_map", "children",
"delayed_lints", "opt_hash"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.nodes, &self.parenting, &self.attrs, &self.trait_map,
&self.children, &self.delayed_lints, &&self.opt_hash];
::core::fmt::Formatter::debug_struct_fields_finish(f, "OwnerInfo",
names, values)
}
}Debug)]
1382pub struct OwnerInfo<'hir> {
1383 pub nodes: OwnerNodes<'hir>,
1385 pub parenting: LocalDefIdMap<ItemLocalId>,
1387 pub attrs: AttributeMap<'hir>,
1389 pub trait_map: ItemLocalMap<&'hir [TraitCandidate<'hir>]>,
1392 pub children: UnordMap<LocalDefId, MaybeOwner<'hir>>,
1394
1395 pub delayed_lints: Steal<DelayedLints>,
1401
1402 pub opt_hash: Option<Fingerprint>,
1404}
1405
1406impl<'tcx> OwnerInfo<'tcx> {
1407 #[inline]
1408 pub fn node(&self) -> OwnerNode<'tcx> {
1409 self.nodes.node()
1410 }
1411
1412 #[inline]
1416 pub fn fingerprint(&self) -> Fingerprint {
1417 let body = self.nodes.opt_hash.expect("HIR hash requested without needs_hir_hash");
1418 let attrs = self.attrs.opt_hash.expect("HIR hash requested without needs_hir_hash");
1419 body.combine(attrs)
1420 }
1421}
1422
1423#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for MaybeOwner<'tcx> { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'tcx> ::core::clone::TrivialClone for MaybeOwner<'tcx> { }
#[automatically_derived]
impl<'tcx> ::core::clone::Clone for MaybeOwner<'tcx> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'tcx OwnerInfo<'tcx>>;
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for MaybeOwner<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Owner(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Owner",
&__self_0),
Self::NonOwner(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"NonOwner", &__self_0),
}
}
}Debug, const _: () =
{
impl<'tcx> ::rustc_data_structures::stable_hash::StableHash for
MaybeOwner<'tcx> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
MaybeOwner::Owner(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
MaybeOwner::NonOwner(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1424pub enum MaybeOwner<'tcx> {
1425 Owner(&'tcx OwnerInfo<'tcx>),
1426 NonOwner(HirId),
1427}
1428
1429impl<'tcx> MaybeOwner<'tcx> {
1430 #[inline]
1431 pub fn as_owner(self) -> Option<&'tcx OwnerInfo<'tcx>> {
1432 match self {
1433 MaybeOwner::Owner(i) => Some(i),
1434 MaybeOwner::NonOwner(_) => None,
1435 }
1436 }
1437
1438 #[inline]
1439 pub fn unwrap(self) -> &'tcx OwnerInfo<'tcx> {
1440 self.as_owner().unwrap_or_else(|| { ::core::panicking::panic_fmt(format_args!("Not a HIR owner")); }panic!("Not a HIR owner"))
1441 }
1442}
1443
1444#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Closure<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["def_id", "binder", "constness", "capture_clause",
"bound_generic_params", "fn_decl", "body", "fn_decl_span",
"fn_arg_span", "kind", "explicit_captures"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.def_id, &self.binder, &self.constness,
&self.capture_clause, &self.bound_generic_params,
&self.fn_decl, &self.body, &self.fn_decl_span,
&self.fn_arg_span, &self.kind, &&self.explicit_captures];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Closure",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Closure<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Closure<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<ClosureBinder>;
let _: ::core::clone::AssertParamIsClone<Constness>;
let _: ::core::clone::AssertParamIsClone<CaptureBy>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir FnDecl<'hir>>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<ClosureKind>;
let _: ::core::clone::AssertParamIsClone<&'hir [ExplicitCapture]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Closure<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Closure<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Closure {
def_id: ref __binding_0,
binder: ref __binding_1,
constness: ref __binding_2,
capture_clause: ref __binding_3,
bound_generic_params: ref __binding_4,
fn_decl: ref __binding_5,
body: ref __binding_6,
fn_decl_span: ref __binding_7,
fn_arg_span: ref __binding_8,
kind: ref __binding_9,
explicit_captures: ref __binding_10 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
{ __binding_8.stable_hash(__hcx, __hasher); }
{ __binding_9.stable_hash(__hcx, __hasher); }
{ __binding_10.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1445pub struct Closure<'hir> {
1446 pub def_id: LocalDefId,
1447 pub binder: ClosureBinder,
1448 pub constness: Constness,
1449 pub capture_clause: CaptureBy,
1450 pub bound_generic_params: &'hir [GenericParam<'hir>],
1451 pub fn_decl: &'hir FnDecl<'hir>,
1452 pub body: BodyId,
1453 pub fn_decl_span: Span,
1455 pub fn_arg_span: Option<Span>,
1457 pub kind: ClosureKind,
1458 pub explicit_captures: &'hir [ExplicitCapture],
1459}
1460
1461#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ExplicitCapture {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f,
"ExplicitCapture", "var_hir_id", &&self.var_hir_id)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ExplicitCapture { }
#[automatically_derived]
impl ::core::clone::Clone for ExplicitCapture {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ExplicitCapture { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ExplicitCapture {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ExplicitCapture { var_hir_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1464pub struct ExplicitCapture {
1465 pub var_hir_id: HirId,
1466}
1467
1468#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ClosureKind { }
#[automatically_derived]
impl ::core::clone::Clone for ClosureKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<CoroutineKind>;
let _: ::core::clone::AssertParamIsClone<CoroutineDesugaring>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ClosureKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ClosureKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Coroutine(__self_0), Self::Coroutine(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::CoroutineClosure(__self_0),
Self::CoroutineClosure(__arg1_0)) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ClosureKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<CoroutineKind>;
let _: ::core::cmp::AssertParamIsEq<CoroutineDesugaring>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for ClosureKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Closure => ::core::fmt::Formatter::write_str(f, "Closure"),
Self::Coroutine(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Coroutine", &__self_0),
Self::CoroutineClosure(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"CoroutineClosure", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for ClosureKind { }Copy, #[automatically_derived]
impl ::core::hash::Hash for ClosureKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Coroutine(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Self::CoroutineClosure(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ClosureKind
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ClosureKind::Closure => {}
ClosureKind::Coroutine(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ClosureKind::CoroutineClosure(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ClosureKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
ClosureKind::Closure => { 0usize }
ClosureKind::Coroutine(ref __binding_0) => { 1usize }
ClosureKind::CoroutineClosure(ref __binding_0) => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
ClosureKind::Closure => {}
ClosureKind::Coroutine(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
ClosureKind::CoroutineClosure(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ClosureKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { ClosureKind::Closure }
1usize => {
ClosureKind::Coroutine(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
ClosureKind::CoroutineClosure(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ClosureKind`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
1469pub enum ClosureKind {
1470 Closure,
1472 Coroutine(CoroutineKind),
1477 CoroutineClosure(CoroutineDesugaring),
1482}
1483
1484#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Block<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["stmts", "expr", "hir_id", "rules", "span",
"targeted_by_break"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.stmts, &self.expr, &self.hir_id, &self.rules, &self.span,
&&self.targeted_by_break];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Block", names,
values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Block<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Block<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Stmt<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<BlockCheckMode>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Block<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Block<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Block {
stmts: ref __binding_0,
expr: ref __binding_1,
hir_id: ref __binding_2,
rules: ref __binding_3,
span: ref __binding_4,
targeted_by_break: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{}
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1488pub struct Block<'hir> {
1489 pub stmts: &'hir [Stmt<'hir>],
1491 pub expr: Option<&'hir Expr<'hir>>,
1494 #[stable_hash(ignore)]
1495 pub hir_id: HirId,
1496 pub rules: BlockCheckMode,
1498 pub span: Span,
1500 pub targeted_by_break: bool,
1504}
1505
1506impl<'hir> Block<'hir> {
1507 pub fn innermost_block(&self) -> &Block<'hir> {
1508 let mut block = self;
1509 while let Some(Expr { kind: ExprKind::Block(inner_block, _), .. }) = block.expr {
1510 block = inner_block;
1511 }
1512 block
1513 }
1514}
1515
1516#[derive(#[automatically_derived]
impl ::core::fmt::Debug for TyFieldPath {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "TyFieldPath",
"variant", &self.variant, "field", &&self.field)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TyFieldPath { }
#[automatically_derived]
impl ::core::clone::Clone for TyFieldPath {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<Ident>>;
let _: ::core::clone::AssertParamIsClone<Ident>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for TyFieldPath { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for TyFieldPath
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TyFieldPath {
variant: ref __binding_0, field: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1517pub struct TyFieldPath {
1518 pub variant: Option<Ident>,
1519 pub field: Ident,
1520}
1521
1522#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TyPat<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "TyPat",
"hir_id", &self.hir_id, "kind", &self.kind, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TyPat<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TyPat<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<TyPatKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TyPat<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TyPat<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TyPat {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1523pub struct TyPat<'hir> {
1524 #[stable_hash(ignore)]
1525 pub hir_id: HirId,
1526 pub kind: TyPatKind<'hir>,
1527 pub span: Span,
1528}
1529
1530#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Pat<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "Pat", "hir_id",
&self.hir_id, "kind", &self.kind, "span", &self.span,
"default_binding_modes", &&self.default_binding_modes)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Pat<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Pat<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<PatKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Pat<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Pat<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Pat {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2,
default_binding_modes: ref __binding_3 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1531pub struct Pat<'hir> {
1532 #[stable_hash(ignore)]
1533 pub hir_id: HirId,
1534 pub kind: PatKind<'hir>,
1535 pub span: Span,
1536 pub default_binding_modes: bool,
1539}
1540
1541impl<'hir> Pat<'hir> {
1542 fn walk_short_(&self, it: &mut impl FnMut(&Pat<'hir>) -> bool) -> bool {
1543 if !it(self) {
1544 return false;
1545 }
1546
1547 use PatKind::*;
1548 match self.kind {
1549 Missing => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1550 Wild | Never | Expr(_) | Range(..) | Binding(.., None) | Err(_) => true,
1551 Deref(s) | Ref(s, _, _) | Binding(.., Some(s)) | Guard(s, _) => s.walk_short_(it),
1552 Struct(_, fields, _) => fields.iter().all(|field| field.pat.walk_short_(it)),
1553 TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().all(|p| p.walk_short_(it)),
1554 Slice(before, slice, after) => {
1555 before.iter().chain(slice).chain(after.iter()).all(|p| p.walk_short_(it))
1556 }
1557 }
1558 }
1559
1560 pub fn walk_short(&self, mut it: impl FnMut(&Pat<'hir>) -> bool) -> bool {
1567 self.walk_short_(&mut it)
1568 }
1569
1570 fn walk_(&self, it: &mut impl FnMut(&Pat<'hir>) -> bool) {
1571 if !it(self) {
1572 return;
1573 }
1574
1575 use PatKind::*;
1576 match self.kind {
1577 Missing | Wild | Never | Expr(_) | Range(..) | Binding(.., None) | Err(_) => {}
1578 Deref(s) | Ref(s, _, _) | Binding(.., Some(s)) | Guard(s, _) => s.walk_(it),
1579 Struct(_, fields, _) => fields.iter().for_each(|field| field.pat.walk_(it)),
1580 TupleStruct(_, s, _) | Tuple(s, _) | Or(s) => s.iter().for_each(|p| p.walk_(it)),
1581 Slice(before, slice, after) => {
1582 before.iter().chain(slice).chain(after.iter()).for_each(|p| p.walk_(it))
1583 }
1584 }
1585 }
1586
1587 pub fn walk(&self, mut it: impl FnMut(&Pat<'hir>) -> bool) {
1591 self.walk_(&mut it)
1592 }
1593
1594 pub fn walk_always(&self, mut it: impl FnMut(&Pat<'_>)) {
1598 self.walk(|p| {
1599 it(p);
1600 true
1601 })
1602 }
1603
1604 pub fn is_never_pattern(&self) -> bool {
1606 let mut is_never_pattern = false;
1607 self.walk(|pat| match &pat.kind {
1608 PatKind::Never => {
1609 is_never_pattern = true;
1610 false
1611 }
1612 PatKind::Or(s) => {
1613 is_never_pattern = s.iter().all(|p| p.is_never_pattern());
1614 false
1615 }
1616 _ => true,
1617 });
1618 is_never_pattern
1619 }
1620
1621 pub fn is_guaranteed_to_constitute_read_for_never(&self) -> bool {
1630 match self.kind {
1631 PatKind::Wild => false,
1633
1634 PatKind::Guard(pat, _) => pat.is_guaranteed_to_constitute_read_for_never(),
1637
1638 PatKind::Or(subpats) => {
1647 subpats.iter().all(|pat| pat.is_guaranteed_to_constitute_read_for_never())
1648 }
1649
1650 PatKind::Never => true,
1652
1653 PatKind::Missing
1656 | PatKind::Binding(_, _, _, _)
1657 | PatKind::Struct(_, _, _)
1658 | PatKind::TupleStruct(_, _, _)
1659 | PatKind::Tuple(_, _)
1660 | PatKind::Ref(_, _, _)
1661 | PatKind::Deref(_)
1662 | PatKind::Expr(_)
1663 | PatKind::Range(_, _, _)
1664 | PatKind::Slice(_, _, _)
1665 | PatKind::Err(_) => true,
1666 }
1667 }
1668}
1669
1670#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for PatField<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "PatField",
"hir_id", &self.hir_id, "ident", &self.ident, "pat", &self.pat,
"is_shorthand", &self.is_shorthand, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for PatField<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for PatField<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for PatField<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PatField<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PatField {
hir_id: ref __binding_0,
ident: ref __binding_1,
pat: ref __binding_2,
is_shorthand: ref __binding_3,
span: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1676pub struct PatField<'hir> {
1677 #[stable_hash(ignore)]
1678 pub hir_id: HirId,
1679 pub ident: Ident,
1681 pub pat: &'hir Pat<'hir>,
1683 pub is_shorthand: bool,
1684 pub span: Span,
1685}
1686
1687#[derive(#[automatically_derived]
impl ::core::marker::Copy for RangeEnd { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RangeEnd { }
#[automatically_derived]
impl ::core::clone::Clone for RangeEnd {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RangeEnd { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RangeEnd {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for RangeEnd {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RangeEnd::Included => "Included",
RangeEnd::Excluded => "Excluded",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for RangeEnd {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
RangeEnd::Included => {}
RangeEnd::Excluded => {}
}
}
}
};StableHash, #[automatically_derived]
impl ::core::hash::Hash for RangeEnd {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::cmp::Eq for RangeEnd { }Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for RangeEnd {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
RangeEnd::Included => { 0usize }
RangeEnd::Excluded => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for RangeEnd {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { RangeEnd::Included }
1usize => { RangeEnd::Excluded }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RangeEnd`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
1688pub enum RangeEnd {
1689 Included,
1690 Excluded,
1691}
1692
1693impl fmt::Display for RangeEnd {
1694 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1695 f.write_str(match self {
1696 RangeEnd::Included => "..=",
1697 RangeEnd::Excluded => "..",
1698 })
1699 }
1700}
1701
1702#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DotDotPos { }
#[automatically_derived]
impl ::core::clone::Clone for DotDotPos {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u32>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DotDotPos { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DotDotPos { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DotDotPos {
#[inline]
fn eq(&self, other: &Self) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DotDotPos {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u32>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for DotDotPos {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for DotDotPos {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DotDotPos(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1706pub struct DotDotPos(u32);
1707
1708impl DotDotPos {
1709 pub fn new(n: Option<usize>) -> Self {
1711 match n {
1712 Some(n) => {
1713 if !(n < u32::MAX as usize) {
::core::panicking::panic("assertion failed: n < u32::MAX as usize")
};assert!(n < u32::MAX as usize);
1714 Self(n as u32)
1715 }
1716 None => Self(u32::MAX),
1717 }
1718 }
1719
1720 pub fn as_opt_usize(&self) -> Option<usize> {
1721 if self.0 == u32::MAX { None } else { Some(self.0 as usize) }
1722 }
1723}
1724
1725impl fmt::Debug for DotDotPos {
1726 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1727 self.as_opt_usize().fmt(f)
1728 }
1729}
1730
1731#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for PatExpr<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "PatExpr",
"hir_id", &self.hir_id, "span", &self.span, "kind", &&self.kind)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for PatExpr<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for PatExpr<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<PatExprKind<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for PatExpr<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PatExpr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PatExpr {
hir_id: ref __binding_0,
span: ref __binding_1,
kind: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1732pub struct PatExpr<'hir> {
1733 #[stable_hash(ignore)]
1734 pub hir_id: HirId,
1735 pub span: Span,
1736 pub kind: PatExprKind<'hir>,
1737}
1738
1739#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for PatExprKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Lit { lit: __self_0, negated: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Lit",
"lit", __self_0, "negated", &__self_1),
Self::Path(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Path",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for PatExprKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for PatExprKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Lit>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for PatExprKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PatExprKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
PatExprKind::Lit {
lit: ref __binding_0, negated: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatExprKind::Path(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1740pub enum PatExprKind<'hir> {
1741 Lit {
1742 lit: Lit,
1743 negated: bool,
1744 },
1745 Path(QPath<'hir>),
1747}
1748
1749#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TyPatKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Range(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Range",
__self_0, &__self_1),
Self::NotNull => ::core::fmt::Formatter::write_str(f, "NotNull"),
Self::Or(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
&__self_0),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TyPatKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TyPatKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [TyPat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TyPatKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TyPatKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
TyPatKind::Range(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyPatKind::NotNull => {}
TyPatKind::Or(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyPatKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1750pub enum TyPatKind<'hir> {
1751 Range(&'hir ConstArg<'hir>, &'hir ConstArg<'hir>),
1753
1754 NotNull,
1756
1757 Or(&'hir [TyPat<'hir>]),
1759
1760 Err(ErrorGuaranteed),
1762}
1763
1764#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for PatKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Missing => ::core::fmt::Formatter::write_str(f, "Missing"),
Self::Wild => ::core::fmt::Formatter::write_str(f, "Wild"),
Self::Binding(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_tuple_field4_finish(f,
"Binding", __self_0, __self_1, __self_2, &__self_3),
Self::Struct(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Struct",
__self_0, __self_1, &__self_2),
Self::TupleStruct(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"TupleStruct", __self_0, __self_1, &__self_2),
Self::Or(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Or",
&__self_0),
Self::Never => ::core::fmt::Formatter::write_str(f, "Never"),
Self::Tuple(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Tuple",
__self_0, &__self_1),
Self::Deref(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Deref",
&__self_0),
Self::Ref(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ref",
__self_0, __self_1, &__self_2),
Self::Expr(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
&__self_0),
Self::Guard(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Guard",
__self_0, &__self_1),
Self::Range(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Range",
__self_0, __self_1, &__self_2),
Self::Slice(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Slice",
__self_0, __self_1, &__self_2),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for PatKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for PatKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<BindingMode>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Pat<'hir>>>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [PatField<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<DotDotPos>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Pinnedness>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<&'hir PatExpr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir PatExpr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir PatExpr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<RangeEnd>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Pat<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Pat<'hir>]>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for PatKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PatKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
PatKind::Missing => {}
PatKind::Wild => {}
PatKind::Binding(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
PatKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::TupleStruct(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Or(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Never => {}
PatKind::Tuple(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatKind::Deref(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Expr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PatKind::Guard(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
PatKind::Range(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Slice(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
PatKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1765pub enum PatKind<'hir> {
1766 Missing,
1768
1769 Wild,
1771
1772 Binding(BindingMode, HirId, Ident, Option<&'hir Pat<'hir>>),
1783
1784 Struct(QPath<'hir>, &'hir [PatField<'hir>], Option<Span>),
1787
1788 TupleStruct(QPath<'hir>, &'hir [Pat<'hir>], DotDotPos),
1792
1793 Or(&'hir [Pat<'hir>]),
1796
1797 Never,
1799
1800 Tuple(&'hir [Pat<'hir>], DotDotPos),
1804
1805 Deref(&'hir Pat<'hir>),
1807
1808 Ref(&'hir Pat<'hir>, Pinnedness, Mutability),
1810
1811 Expr(&'hir PatExpr<'hir>),
1813
1814 Guard(&'hir Pat<'hir>, &'hir Expr<'hir>),
1816
1817 Range(Option<&'hir PatExpr<'hir>>, Option<&'hir PatExpr<'hir>>, RangeEnd),
1819
1820 Slice(&'hir [Pat<'hir>], Option<&'hir Pat<'hir>>, &'hir [Pat<'hir>]),
1830
1831 Err(ErrorGuaranteed),
1833}
1834
1835#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Stmt<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "Stmt",
"hir_id", &self.hir_id, "kind", &self.kind, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Stmt<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Stmt<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<StmtKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Stmt<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Stmt<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Stmt {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1837pub struct Stmt<'hir> {
1838 #[stable_hash(ignore)]
1839 pub hir_id: HirId,
1840 pub kind: StmtKind<'hir>,
1841 pub span: Span,
1842}
1843
1844#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for StmtKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Let(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Let",
&__self_0),
Self::Item(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Item",
&__self_0),
Self::Expr(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
&__self_0),
Self::Semi(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Semi",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for StmtKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for StmtKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir LetStmt<'hir>>;
let _: ::core::clone::AssertParamIsClone<ItemId>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for StmtKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
StmtKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
StmtKind::Let(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StmtKind::Item(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StmtKind::Expr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StmtKind::Semi(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1846pub enum StmtKind<'hir> {
1847 Let(&'hir LetStmt<'hir>),
1849
1850 Item(ItemId),
1852
1853 Expr(&'hir Expr<'hir>),
1855
1856 Semi(&'hir Expr<'hir>),
1858}
1859
1860#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for LetStmt<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["super_", "pat", "ty", "init", "els", "hir_id", "span",
"source"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.super_, &self.pat, &self.ty, &self.init, &self.els,
&self.hir_id, &self.span, &&self.source];
::core::fmt::Formatter::debug_struct_fields_finish(f, "LetStmt",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for LetStmt<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for LetStmt<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Block<'hir>>>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<LocalSource>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for LetStmt<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
LetStmt<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LetStmt {
super_: ref __binding_0,
pat: ref __binding_1,
ty: ref __binding_2,
init: ref __binding_3,
els: ref __binding_4,
hir_id: ref __binding_5,
span: ref __binding_6,
source: ref __binding_7 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{}
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1862pub struct LetStmt<'hir> {
1863 pub super_: Option<Span>,
1865 pub pat: &'hir Pat<'hir>,
1866 pub ty: Option<&'hir Ty<'hir>>,
1868 pub init: Option<&'hir Expr<'hir>>,
1870 pub els: Option<&'hir Block<'hir>>,
1872 #[stable_hash(ignore)]
1873 pub hir_id: HirId,
1874 pub span: Span,
1875 pub source: LocalSource,
1879}
1880
1881#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Arm<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "Arm", "hir_id",
&self.hir_id, "span", &self.span, "pat", &self.pat, "guard",
&self.guard, "body", &&self.body)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Arm<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Arm<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Arm<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Arm<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Arm {
hir_id: ref __binding_0,
span: ref __binding_1,
pat: ref __binding_2,
guard: ref __binding_3,
body: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1884pub struct Arm<'hir> {
1885 #[stable_hash(ignore)]
1886 pub hir_id: HirId,
1887 pub span: Span,
1888 pub pat: &'hir Pat<'hir>,
1890 pub guard: Option<&'hir Expr<'hir>>,
1892 pub body: &'hir Expr<'hir>,
1894}
1895
1896#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for LetExpr<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "LetExpr",
"span", &self.span, "pat", &self.pat, "ty", &self.ty, "init",
&self.init, "recovered", &&self.recovered)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for LetExpr<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for LetExpr<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<ast::Recovered>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for LetExpr<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
LetExpr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
LetExpr {
span: ref __binding_0,
pat: ref __binding_1,
ty: ref __binding_2,
init: ref __binding_3,
recovered: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1902pub struct LetExpr<'hir> {
1903 pub span: Span,
1904 pub pat: &'hir Pat<'hir>,
1905 pub ty: Option<&'hir Ty<'hir>>,
1906 pub init: &'hir Expr<'hir>,
1907 pub recovered: ast::Recovered,
1910}
1911
1912#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for ExprField<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "ExprField",
"hir_id", &self.hir_id, "ident", &self.ident, "expr", &self.expr,
"span", &self.span, "is_shorthand", &&self.is_shorthand)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ExprField<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ExprField<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ExprField<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ExprField<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ExprField {
hir_id: ref __binding_0,
ident: ref __binding_1,
expr: ref __binding_2,
span: ref __binding_3,
is_shorthand: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1913pub struct ExprField<'hir> {
1914 #[stable_hash(ignore)]
1915 pub hir_id: HirId,
1916 pub ident: Ident,
1917 pub expr: &'hir Expr<'hir>,
1918 pub span: Span,
1919 pub is_shorthand: bool,
1920}
1921
1922#[derive(#[automatically_derived]
impl ::core::marker::Copy for BlockCheckMode { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BlockCheckMode { }
#[automatically_derived]
impl ::core::clone::Clone for BlockCheckMode {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<UnsafeSource>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BlockCheckMode { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BlockCheckMode {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::UnsafeBlock(__self_0), Self::UnsafeBlock(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for BlockCheckMode {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::DefaultBlock =>
::core::fmt::Formatter::write_str(f, "DefaultBlock"),
Self::UnsafeBlock(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"UnsafeBlock", &__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
BlockCheckMode {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
BlockCheckMode::DefaultBlock => {}
BlockCheckMode::UnsafeBlock(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1923pub enum BlockCheckMode {
1924 DefaultBlock,
1925 UnsafeBlock(UnsafeSource),
1926}
1927
1928#[derive(#[automatically_derived]
impl ::core::marker::Copy for UnsafeSource { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for UnsafeSource { }
#[automatically_derived]
impl ::core::clone::Clone for UnsafeSource {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for UnsafeSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for UnsafeSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for UnsafeSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
UnsafeSource::CompilerGenerated => "CompilerGenerated",
UnsafeSource::UserProvided => "UserProvided",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for UnsafeSource
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
UnsafeSource::CompilerGenerated => {}
UnsafeSource::UserProvided => {}
}
}
}
};StableHash)]
1929pub enum UnsafeSource {
1930 CompilerGenerated,
1931 UserProvided,
1932}
1933
1934#[derive(#[automatically_derived]
impl ::core::marker::Copy for BodyId { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BodyId { }
#[automatically_derived]
impl ::core::clone::Clone for BodyId {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for BodyId { }
#[automatically_derived]
impl ::core::cmp::PartialEq for BodyId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.hir_id == other.hir_id }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for BodyId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<HirId>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for BodyId {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.hir_id, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for BodyId {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "BodyId",
"hir_id", &&self.hir_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for BodyId {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
BodyId { hir_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1935pub struct BodyId {
1936 pub hir_id: HirId,
1937}
1938
1939#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Body<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Body",
"params", &self.params, "value", &&self.value)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Body<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Body<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Param<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Body<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Body<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Body { params: ref __binding_0, value: ref __binding_1 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
1961pub struct Body<'hir> {
1962 pub params: &'hir [Param<'hir>],
1963 pub value: &'hir Expr<'hir>,
1964}
1965
1966impl<'hir> Body<'hir> {
1967 pub fn id(&self) -> BodyId {
1968 BodyId { hir_id: self.value.hir_id }
1969 }
1970}
1971
1972#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoroutineKind { }
#[automatically_derived]
impl ::core::clone::Clone for CoroutineKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<CoroutineDesugaring>;
let _: ::core::clone::AssertParamIsClone<CoroutineSource>;
let _: ::core::clone::AssertParamIsClone<Movability>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoroutineKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoroutineKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Desugared(__self_0, __self_1),
Self::Desugared(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::Coroutine(__self_0), Self::Coroutine(__arg1_0)) =>
__self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoroutineKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<CoroutineDesugaring>;
let _: ::core::cmp::AssertParamIsEq<CoroutineSource>;
let _: ::core::cmp::AssertParamIsEq<Movability>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for CoroutineKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Desugared(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"Desugared", __self_0, &__self_1),
Self::Coroutine(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Coroutine", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for CoroutineKind { }Copy, #[automatically_derived]
impl ::core::hash::Hash for CoroutineKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Desugared(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
Self::Coroutine(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
}
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
CoroutineKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
CoroutineKind::Desugared(ref __binding_0, ref __binding_1)
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
CoroutineKind::Coroutine(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CoroutineKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CoroutineKind::Desugared(ref __binding_0, ref __binding_1)
=> {
0usize
}
CoroutineKind::Coroutine(ref __binding_0) => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
CoroutineKind::Desugared(ref __binding_0, ref __binding_1)
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
CoroutineKind::Coroutine(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CoroutineKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
CoroutineKind::Desugared(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
CoroutineKind::Coroutine(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoroutineKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
1974pub enum CoroutineKind {
1975 Desugared(CoroutineDesugaring, CoroutineSource),
1977
1978 Coroutine(Movability),
1980}
1981
1982impl CoroutineKind {
1983 pub fn movability(self) -> Movability {
1984 match self {
1985 CoroutineKind::Desugared(CoroutineDesugaring::Async, _)
1986 | CoroutineKind::Desugared(CoroutineDesugaring::AsyncGen, _) => Movability::Static,
1987 CoroutineKind::Desugared(CoroutineDesugaring::Gen, _) => Movability::Movable,
1988 CoroutineKind::Coroutine(mov) => mov,
1989 }
1990 }
1991
1992 pub fn is_fn_like(self) -> bool {
1993 #[allow(non_exhaustive_omitted_patterns)] match self {
CoroutineKind::Desugared(_, CoroutineSource::Fn) => true,
_ => false,
}matches!(self, CoroutineKind::Desugared(_, CoroutineSource::Fn))
1994 }
1995
1996 pub fn is_async_desugaring(self) -> bool {
1997 #[allow(non_exhaustive_omitted_patterns)] match self {
CoroutineKind::Desugared(CoroutineDesugaring::Async |
CoroutineDesugaring::AsyncGen, _) => true,
_ => false,
}matches!(
1998 self,
1999 CoroutineKind::Desugared(CoroutineDesugaring::Async | CoroutineDesugaring::AsyncGen, _)
2000 )
2001 }
2002
2003 pub fn to_plural_string(&self) -> String {
2004 match self {
2005 CoroutineKind::Desugared(d, CoroutineSource::Fn) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:#}fn bodies", d))
})format!("{d:#}fn bodies"),
2006 CoroutineKind::Desugared(d, CoroutineSource::Block) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:#}blocks", d))
})format!("{d:#}blocks"),
2007 CoroutineKind::Desugared(d, CoroutineSource::Closure) => ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0:#}closure bodies", d))
})format!("{d:#}closure bodies"),
2008 CoroutineKind::Coroutine(_) => "coroutines".to_string(),
2009 }
2010 }
2011}
2012
2013impl fmt::Display for CoroutineKind {
2014 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2015 match self {
2016 CoroutineKind::Desugared(d, k) => {
2017 d.fmt(f)?;
2018 k.fmt(f)
2019 }
2020 CoroutineKind::Coroutine(_) => f.write_str("coroutine"),
2021 }
2022 }
2023}
2024
2025#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoroutineSource { }
#[automatically_derived]
impl ::core::clone::Clone for CoroutineSource {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoroutineSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoroutineSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoroutineSource { }Eq, #[automatically_derived]
impl ::core::hash::Hash for CoroutineSource {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for CoroutineSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CoroutineSource::Block => "Block",
CoroutineSource::Closure => "Closure",
CoroutineSource::Fn => "Fn",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for CoroutineSource { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
CoroutineSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
CoroutineSource::Block => {}
CoroutineSource::Closure => {}
CoroutineSource::Fn => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CoroutineSource {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CoroutineSource::Block => { 0usize }
CoroutineSource::Closure => { 1usize }
CoroutineSource::Fn => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CoroutineSource {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { CoroutineSource::Block }
1usize => { CoroutineSource::Closure }
2usize => { CoroutineSource::Fn }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoroutineSource`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
2031pub enum CoroutineSource {
2032 Block,
2034
2035 Closure,
2037
2038 Fn,
2040}
2041
2042impl fmt::Display for CoroutineSource {
2043 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2044 match self {
2045 CoroutineSource::Block => "block",
2046 CoroutineSource::Closure => "closure body",
2047 CoroutineSource::Fn => "fn body",
2048 }
2049 .fmt(f)
2050 }
2051}
2052
2053#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CoroutineDesugaring { }
#[automatically_derived]
impl ::core::clone::Clone for CoroutineDesugaring {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CoroutineDesugaring { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CoroutineDesugaring {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CoroutineDesugaring { }Eq, #[automatically_derived]
impl ::core::fmt::Debug for CoroutineDesugaring {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CoroutineDesugaring::Async => "Async",
CoroutineDesugaring::Gen => "Gen",
CoroutineDesugaring::AsyncGen => "AsyncGen",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for CoroutineDesugaring { }Copy, #[automatically_derived]
impl ::core::hash::Hash for CoroutineDesugaring {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
CoroutineDesugaring {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
CoroutineDesugaring::Async => {}
CoroutineDesugaring::Gen => {}
CoroutineDesugaring::AsyncGen => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CoroutineDesugaring {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CoroutineDesugaring::Async => { 0usize }
CoroutineDesugaring::Gen => { 1usize }
CoroutineDesugaring::AsyncGen => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CoroutineDesugaring {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { CoroutineDesugaring::Async }
1usize => { CoroutineDesugaring::Gen }
2usize => { CoroutineDesugaring::AsyncGen }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CoroutineDesugaring`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
2054pub enum CoroutineDesugaring {
2055 Async,
2057
2058 Gen,
2060
2061 AsyncGen,
2064}
2065
2066impl fmt::Display for CoroutineDesugaring {
2067 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2068 match self {
2069 CoroutineDesugaring::Async => {
2070 if f.alternate() {
2071 f.write_str("`async` ")?;
2072 } else {
2073 f.write_str("async ")?
2074 }
2075 }
2076 CoroutineDesugaring::Gen => {
2077 if f.alternate() {
2078 f.write_str("`gen` ")?;
2079 } else {
2080 f.write_str("gen ")?
2081 }
2082 }
2083 CoroutineDesugaring::AsyncGen => {
2084 if f.alternate() {
2085 f.write_str("`async gen` ")?;
2086 } else {
2087 f.write_str("async gen ")?
2088 }
2089 }
2090 }
2091
2092 Ok(())
2093 }
2094}
2095
2096#[derive(#[automatically_derived]
impl ::core::marker::Copy for BodyOwnerKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for BodyOwnerKind { }
#[automatically_derived]
impl ::core::clone::Clone for BodyOwnerKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for BodyOwnerKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Fn => ::core::fmt::Formatter::write_str(f, "Fn"),
Self::Closure => ::core::fmt::Formatter::write_str(f, "Closure"),
Self::Const { inline: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
"inline", &__self_0),
Self::Static(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Static",
&__self_0),
Self::GlobalAsm =>
::core::fmt::Formatter::write_str(f, "GlobalAsm"),
}
}
}Debug)]
2097pub enum BodyOwnerKind {
2098 Fn,
2100
2101 Closure,
2103
2104 Const { inline: bool },
2106
2107 Static(Mutability),
2109
2110 GlobalAsm,
2112}
2113
2114impl BodyOwnerKind {
2115 pub fn is_fn_or_closure(self) -> bool {
2116 match self {
2117 BodyOwnerKind::Fn | BodyOwnerKind::Closure => true,
2118 BodyOwnerKind::Const { .. } | BodyOwnerKind::Static(_) | BodyOwnerKind::GlobalAsm => {
2119 false
2120 }
2121 }
2122 }
2123}
2124
2125#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ConstContext { }
#[automatically_derived]
impl ::core::clone::Clone for ConstContext {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ConstContext { }Copy, #[automatically_derived]
impl ::core::fmt::Debug for ConstContext {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::ConstFn => ::core::fmt::Formatter::write_str(f, "ConstFn"),
Self::Static(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Static",
&__self_0),
Self::Const { allow_const_fn_promotion: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
"allow_const_fn_promotion", &__self_0),
}
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ConstContext { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ConstContext {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Static(__self_0), Self::Static(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Const { allow_const_fn_promotion: __self_0 },
Self::Const { allow_const_fn_promotion: __arg1_0 }) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ConstContext {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Mutability>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq)]
2127pub enum ConstContext {
2128 ConstFn,
2130
2131 Static(Mutability),
2133
2134 Const {
2141 allow_const_fn_promotion: bool,
2145 },
2146}
2147
2148impl ConstContext {
2149 pub fn keyword_name(self) -> &'static str {
2153 match self {
2154 Self::Const { .. } => "const",
2155 Self::Static(Mutability::Not) => "static",
2156 Self::Static(Mutability::Mut) => "static mut",
2157 Self::ConstFn => "const fn",
2158 }
2159 }
2160}
2161
2162impl fmt::Display for ConstContext {
2165 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2166 match *self {
2167 Self::Const { .. } => f.write_fmt(format_args!("constant"))write!(f, "constant"),
2168 Self::Static(_) => f.write_fmt(format_args!("static"))write!(f, "static"),
2169 Self::ConstFn => f.write_fmt(format_args!("constant function"))write!(f, "constant function"),
2170 }
2171 }
2172}
2173
2174impl IntoDiagArg for ConstContext {
2175 fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
2176 DiagArgValue::Str(Cow::Borrowed(match self {
2177 ConstContext::ConstFn => "constant function",
2178 ConstContext::Static(_) => "static",
2179 ConstContext::Const { .. } => "constant",
2180 }))
2181 }
2182}
2183
2184pub type Lit = Spanned<LitKind>;
2186
2187#[derive(#[automatically_derived]
impl ::core::marker::Copy for AnonConst { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AnonConst { }
#[automatically_derived]
impl ::core::clone::Clone for AnonConst {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for AnonConst {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "AnonConst",
"hir_id", &self.hir_id, "def_id", &self.def_id, "body",
&self.body, "span", &&self.span)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for AnonConst {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
AnonConst {
hir_id: ref __binding_0,
def_id: ref __binding_1,
body: ref __binding_2,
span: ref __binding_3 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2196pub struct AnonConst {
2197 #[stable_hash(ignore)]
2198 pub hir_id: HirId,
2199 pub def_id: LocalDefId,
2200 pub body: BodyId,
2201 pub span: Span,
2202}
2203
2204#[derive(#[automatically_derived]
impl ::core::marker::Copy for ConstBlock { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ConstBlock { }
#[automatically_derived]
impl ::core::clone::Clone for ConstBlock {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ConstBlock {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "ConstBlock",
"hir_id", &self.hir_id, "def_id", &self.def_id, "body",
&&self.body)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ConstBlock {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ConstBlock {
hir_id: ref __binding_0,
def_id: ref __binding_1,
body: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2206pub struct ConstBlock {
2207 #[stable_hash(ignore)]
2208 pub hir_id: HirId,
2209 pub def_id: LocalDefId,
2210 pub body: BodyId,
2211}
2212
2213#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Expr<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "Expr",
"hir_id", &self.hir_id, "kind", &self.kind, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Expr<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Expr<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<ExprKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Expr<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Expr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Expr {
hir_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2222pub struct Expr<'hir> {
2223 #[stable_hash(ignore)]
2224 pub hir_id: HirId,
2225 pub kind: ExprKind<'hir>,
2226 pub span: Span,
2227}
2228
2229impl Expr<'_> {
2230 pub fn precedence(&self, has_attr: &dyn Fn(HirId) -> bool) -> ExprPrecedence {
2231 let prefix_attrs_precedence = || -> ExprPrecedence {
2232 if has_attr(self.hir_id) { ExprPrecedence::Prefix } else { ExprPrecedence::Unambiguous }
2233 };
2234
2235 match &self.kind {
2236 ExprKind::Closure(closure) => match closure.fn_decl.output {
2237 FnRetTy::DefaultReturn(_) => ExprPrecedence::Jump,
2238 FnRetTy::Return(_) => prefix_attrs_precedence(),
2239 },
2240
2241 ExprKind::Break(..)
2242 | ExprKind::Ret(..)
2243 | ExprKind::Yield(..)
2244 | ExprKind::Become(..) => ExprPrecedence::Jump,
2245
2246 ExprKind::Binary(op, ..) => op.node.precedence(),
2248 ExprKind::Cast(..) => ExprPrecedence::Cast,
2249
2250 ExprKind::Assign(..) | ExprKind::AssignOp(..) => ExprPrecedence::Assign,
2251
2252 ExprKind::AddrOf(..) => ExprPrecedence::Prefix,
2254
2255 ExprKind::Let(..) | ExprKind::Unary(..) => ExprPrecedence::Prefix,
2260
2261 ExprKind::Array(_)
2263 | ExprKind::Block(..)
2264 | ExprKind::Call(..)
2265 | ExprKind::ConstBlock(_)
2266 | ExprKind::Continue(..)
2267 | ExprKind::Field(..)
2268 | ExprKind::If(..)
2269 | ExprKind::Index(..)
2270 | ExprKind::InlineAsm(..)
2271 | ExprKind::Lit(_)
2272 | ExprKind::Loop(..)
2273 | ExprKind::Match(..)
2274 | ExprKind::MethodCall(..)
2275 | ExprKind::OffsetOf(..)
2276 | ExprKind::Path(..)
2277 | ExprKind::Repeat(..)
2278 | ExprKind::Struct(..)
2279 | ExprKind::Tup(_)
2280 | ExprKind::Type(..)
2281 | ExprKind::UnsafeBinderCast(..)
2282 | ExprKind::Use(..)
2283 | ExprKind::Err(_) => prefix_attrs_precedence(),
2284
2285 ExprKind::DropTemps(expr, ..) => expr.precedence(has_attr),
2286 }
2287 }
2288
2289 pub fn is_syntactic_place_expr(&self) -> bool {
2294 self.is_place_expr(|_| true)
2295 }
2296
2297 pub fn is_place_expr(&self, mut allow_projections_from: impl FnMut(&Self) -> bool) -> bool {
2302 match self.kind {
2303 ExprKind::Path(QPath::Resolved(_, ref path)) => {
2304 #[allow(non_exhaustive_omitted_patterns)] match path.res {
Res::Local(..) | Res::Def(DefKind::Static { .. }, _) | Res::Err => true,
_ => false,
}matches!(path.res, Res::Local(..) | Res::Def(DefKind::Static { .. }, _) | Res::Err)
2305 }
2306
2307 ExprKind::Type(ref e, _) => e.is_place_expr(allow_projections_from),
2311
2312 ExprKind::UnsafeBinderCast(_, e, _) => e.is_place_expr(allow_projections_from),
2314
2315 ExprKind::Unary(UnOp::Deref, _) => true,
2316
2317 ExprKind::Field(ref base, _) | ExprKind::Index(ref base, _, _) => {
2318 allow_projections_from(base) || base.is_place_expr(allow_projections_from)
2319 }
2320
2321 ExprKind::Err(_guar)
2323 | ExprKind::Let(&LetExpr { recovered: ast::Recovered::Yes(_guar), .. }) => true,
2324
2325 ExprKind::Path(QPath::TypeRelative(..))
2328 | ExprKind::Call(..)
2329 | ExprKind::MethodCall(..)
2330 | ExprKind::Use(..)
2331 | ExprKind::Struct(..)
2332 | ExprKind::Tup(..)
2333 | ExprKind::If(..)
2334 | ExprKind::Match(..)
2335 | ExprKind::Closure { .. }
2336 | ExprKind::Block(..)
2337 | ExprKind::Repeat(..)
2338 | ExprKind::Array(..)
2339 | ExprKind::Break(..)
2340 | ExprKind::Continue(..)
2341 | ExprKind::Ret(..)
2342 | ExprKind::Become(..)
2343 | ExprKind::Let(..)
2344 | ExprKind::Loop(..)
2345 | ExprKind::Assign(..)
2346 | ExprKind::InlineAsm(..)
2347 | ExprKind::OffsetOf(..)
2348 | ExprKind::AssignOp(..)
2349 | ExprKind::Lit(_)
2350 | ExprKind::ConstBlock(..)
2351 | ExprKind::Unary(..)
2352 | ExprKind::AddrOf(..)
2353 | ExprKind::Binary(..)
2354 | ExprKind::Yield(..)
2355 | ExprKind::Cast(..)
2356 | ExprKind::DropTemps(..) => false,
2357 }
2358 }
2359
2360 pub fn range_span(&self) -> Option<Span> {
2363 is_range_literal(self).then(|| self.span.parent_callsite().unwrap())
2364 }
2365
2366 pub fn is_size_lit(&self) -> bool {
2369 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
ExprKind::Lit(Lit {
node: LitKind::Int(_,
LitIntType::Unsuffixed | LitIntType::Unsigned(UintTy::Usize)), ..
}) => true,
_ => false,
}matches!(
2370 self.kind,
2371 ExprKind::Lit(Lit {
2372 node: LitKind::Int(_, LitIntType::Unsuffixed | LitIntType::Unsigned(UintTy::Usize)),
2373 ..
2374 })
2375 )
2376 }
2377
2378 pub fn peel_drop_temps(&self) -> &Self {
2384 let mut expr = self;
2385 while let ExprKind::DropTemps(inner) = &expr.kind {
2386 expr = inner;
2387 }
2388 expr
2389 }
2390
2391 pub fn peel_blocks(&self) -> &Self {
2392 let mut expr = self;
2393 while let ExprKind::Block(Block { expr: Some(inner), .. }, _) = &expr.kind {
2394 expr = inner;
2395 }
2396 expr
2397 }
2398
2399 pub fn peel_borrows(&self) -> &Self {
2400 let mut expr = self;
2401 while let ExprKind::AddrOf(.., inner) = &expr.kind {
2402 expr = inner;
2403 }
2404 expr
2405 }
2406
2407 pub fn can_have_side_effects(&self) -> bool {
2408 match self.peel_drop_temps().kind {
2409 ExprKind::Path(_) | ExprKind::Lit(_) | ExprKind::OffsetOf(..) | ExprKind::Use(..) => {
2410 false
2411 }
2412 ExprKind::Type(base, _)
2413 | ExprKind::Unary(_, base)
2414 | ExprKind::Field(base, _)
2415 | ExprKind::Index(base, _, _)
2416 | ExprKind::AddrOf(.., base)
2417 | ExprKind::Cast(base, _)
2418 | ExprKind::UnsafeBinderCast(_, base, _) => {
2419 base.can_have_side_effects()
2423 }
2424 ExprKind::Binary(_, lhs, rhs) => {
2425 lhs.can_have_side_effects() || rhs.can_have_side_effects()
2429 }
2430 ExprKind::Struct(_, fields, init) => {
2431 let init_side_effects = match init {
2432 StructTailExpr::Base(init) => init.can_have_side_effects(),
2433 StructTailExpr::DefaultFields(_)
2434 | StructTailExpr::None
2435 | StructTailExpr::NoneWithError(_) => false,
2436 };
2437 fields.iter().map(|field| field.expr).any(|e| e.can_have_side_effects())
2438 || init_side_effects
2439 }
2440
2441 ExprKind::Array(args)
2442 | ExprKind::Tup(args)
2443 | ExprKind::Call(
2444 Expr {
2445 kind:
2446 ExprKind::Path(QPath::Resolved(
2447 None,
2448 Path { res: Res::Def(DefKind::Ctor(_, CtorKind::Fn), _), .. },
2449 )),
2450 ..
2451 },
2452 args,
2453 ) => args.iter().any(|arg| arg.can_have_side_effects()),
2454 ExprKind::Repeat(arg, _) => arg.can_have_side_effects(),
2455 ExprKind::If(..)
2456 | ExprKind::Match(..)
2457 | ExprKind::MethodCall(..)
2458 | ExprKind::Call(..)
2459 | ExprKind::Closure { .. }
2460 | ExprKind::Block(..)
2461 | ExprKind::Break(..)
2462 | ExprKind::Continue(..)
2463 | ExprKind::Ret(..)
2464 | ExprKind::Become(..)
2465 | ExprKind::Let(..)
2466 | ExprKind::Loop(..)
2467 | ExprKind::Assign(..)
2468 | ExprKind::InlineAsm(..)
2469 | ExprKind::AssignOp(..)
2470 | ExprKind::ConstBlock(..)
2471 | ExprKind::Yield(..)
2472 | ExprKind::DropTemps(..)
2473 | ExprKind::Err(_) => true,
2474 }
2475 }
2476
2477 pub fn is_approximately_pattern(&self) -> bool {
2479 match &self.kind {
2480 ExprKind::Array(_)
2481 | ExprKind::Call(..)
2482 | ExprKind::Tup(_)
2483 | ExprKind::Lit(_)
2484 | ExprKind::Path(_)
2485 | ExprKind::Struct(..) => true,
2486 _ => false,
2487 }
2488 }
2489
2490 pub fn equivalent_for_indexing(&self, other: &Expr<'_>) -> bool {
2495 match (self.kind, other.kind) {
2496 (ExprKind::Lit(lit1), ExprKind::Lit(lit2)) => lit1.node == lit2.node,
2497 (
2498 ExprKind::Path(QPath::Resolved(None, path1)),
2499 ExprKind::Path(QPath::Resolved(None, path2)),
2500 ) => path1.res == path2.res,
2501 (
2502 ExprKind::Struct(
2503 &QPath::Resolved(None, &Path { res: Res::Def(_, path1_def_id), .. }),
2504 args1,
2505 StructTailExpr::None,
2506 ),
2507 ExprKind::Struct(
2508 &QPath::Resolved(None, &Path { res: Res::Def(_, path2_def_id), .. }),
2509 args2,
2510 StructTailExpr::None,
2511 ),
2512 ) => {
2513 path2_def_id == path1_def_id
2514 && is_range_literal(self)
2515 && is_range_literal(other)
2516 && std::iter::zip(args1, args2)
2517 .all(|(a, b)| a.expr.equivalent_for_indexing(b.expr))
2518 }
2519 _ => false,
2520 }
2521 }
2522
2523 pub fn method_ident(&self) -> Option<Ident> {
2524 match self.kind {
2525 ExprKind::MethodCall(receiver_method, ..) => Some(receiver_method.ident),
2526 ExprKind::Unary(_, expr) | ExprKind::AddrOf(.., expr) => expr.method_ident(),
2527 _ => None,
2528 }
2529 }
2530}
2531
2532pub fn is_range_literal(expr: &Expr<'_>) -> bool {
2535 if let ExprKind::Struct(QPath::Resolved(None, path), _, StructTailExpr::None) = expr.kind
2536 && let [.., segment] = path.segments
2537 && let sym::RangeFrom
2538 | sym::RangeFull
2539 | sym::Range
2540 | sym::RangeToInclusive
2541 | sym::RangeTo
2542 | sym::RangeFromCopy
2543 | sym::RangeCopy
2544 | sym::RangeInclusiveCopy
2545 | sym::RangeToInclusiveCopy = segment.ident.name
2546 && expr.span.is_desugaring(DesugaringKind::RangeExpr)
2547 {
2548 true
2549 } else if let ExprKind::Call(func, _) = &expr.kind
2550 && let ExprKind::Path(QPath::Resolved(None, path)) = func.kind
2551 && let [.., segment] = path.segments
2552 && let sym::range_inclusive_new = segment.ident.name
2553 && expr.span.is_desugaring(DesugaringKind::RangeExpr)
2554 {
2555 true
2556 } else {
2557 false
2558 }
2559}
2560
2561pub fn expr_needs_parens(expr: &Expr<'_>) -> bool {
2568 match expr.kind {
2569 ExprKind::Cast(_, _) | ExprKind::Binary(_, _, _) => true,
2571 _ if is_range_literal(expr) => true,
2573 _ => false,
2574 }
2575}
2576
2577#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for ExprKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::ConstBlock(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ConstBlock", &__self_0),
Self::Array(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Array",
&__self_0),
Self::Call(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Call",
__self_0, &__self_1),
Self::MethodCall(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_tuple_field4_finish(f,
"MethodCall", __self_0, __self_1, __self_2, &__self_3),
Self::Use(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Use",
__self_0, &__self_1),
Self::Tup(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
&__self_0),
Self::Binary(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Binary",
__self_0, __self_1, &__self_2),
Self::Unary(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Unary",
__self_0, &__self_1),
Self::Lit(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Lit",
&__self_0),
Self::Cast(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Cast",
__self_0, &__self_1),
Self::Type(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Type",
__self_0, &__self_1),
Self::DropTemps(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"DropTemps", &__self_0),
Self::Let(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Let",
&__self_0),
Self::If(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "If",
__self_0, __self_1, &__self_2),
Self::Loop(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_tuple_field4_finish(f, "Loop",
__self_0, __self_1, __self_2, &__self_3),
Self::Match(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Match",
__self_0, __self_1, &__self_2),
Self::Closure(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Closure", &__self_0),
Self::Block(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Block",
__self_0, &__self_1),
Self::Assign(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Assign",
__self_0, __self_1, &__self_2),
Self::AssignOp(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"AssignOp", __self_0, __self_1, &__self_2),
Self::Field(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Field",
__self_0, &__self_1),
Self::Index(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Index",
__self_0, __self_1, &__self_2),
Self::Path(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Path",
&__self_0),
Self::AddrOf(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "AddrOf",
__self_0, __self_1, &__self_2),
Self::Break(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Break",
__self_0, &__self_1),
Self::Continue(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Continue", &__self_0),
Self::Ret(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ret",
&__self_0),
Self::Become(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Become",
&__self_0),
Self::InlineAsm(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"InlineAsm", &__self_0),
Self::OffsetOf(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"OffsetOf", __self_0, &__self_1),
Self::Struct(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Struct",
__self_0, __self_1, &__self_2),
Self::Repeat(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Repeat",
__self_0, &__self_1),
Self::Yield(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Yield",
__self_0, &__self_1),
Self::UnsafeBinderCast(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"UnsafeBinderCast", __self_0, __self_1, &__self_2),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ExprKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ExprKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<ConstBlock>;
let _: ::core::clone::AssertParamIsClone<&'hir [Expr<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Expr<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir PathSegment<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Expr<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Expr<'hir>]>;
let _: ::core::clone::AssertParamIsClone<BinOp>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<UnOp>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Lit>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir LetExpr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Block<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<Label>>;
let _: ::core::clone::AssertParamIsClone<LoopSource>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Arm<'hir>]>;
let _: ::core::clone::AssertParamIsClone<MatchSource>;
let _: ::core::clone::AssertParamIsClone<&'hir Closure<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Block<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<Label>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<AssignOp>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<BorrowKind>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Destination>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir InlineAsm<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Ident]>;
let _: ::core::clone::AssertParamIsClone<&'hir QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [ExprField<'hir>]>;
let _: ::core::clone::AssertParamIsClone<StructTailExpr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<YieldSource>;
let _: ::core::clone::AssertParamIsClone<UnsafeBinderCastKind>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<rustc_span::ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ExprKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ExprKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ExprKind::ConstBlock(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Array(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Call(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::MethodCall(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ExprKind::Use(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Tup(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Binary(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Unary(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Lit(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Cast(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Type(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::DropTemps(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Let(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::If(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Loop(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ExprKind::Match(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Closure(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Block(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Assign(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::AssignOp(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Field(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Index(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Path(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::AddrOf(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Break(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Continue(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Ret(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::Become(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::InlineAsm(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ExprKind::OffsetOf(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Repeat(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::Yield(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ExprKind::UnsafeBinderCast(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ExprKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2578pub enum ExprKind<'hir> {
2579 ConstBlock(ConstBlock),
2581 Array(&'hir [Expr<'hir>]),
2583 Call(&'hir Expr<'hir>, &'hir [Expr<'hir>]),
2590 MethodCall(&'hir PathSegment<'hir>, &'hir Expr<'hir>, &'hir [Expr<'hir>], Span),
2607 Use(&'hir Expr<'hir>, Span),
2609 Tup(&'hir [Expr<'hir>]),
2611 Binary(BinOp, &'hir Expr<'hir>, &'hir Expr<'hir>),
2613 Unary(UnOp, &'hir Expr<'hir>),
2615 Lit(Lit),
2617 Cast(&'hir Expr<'hir>, &'hir Ty<'hir>),
2619 Type(&'hir Expr<'hir>, &'hir Ty<'hir>),
2621 DropTemps(&'hir Expr<'hir>),
2627 Let(&'hir LetExpr<'hir>),
2632 If(&'hir Expr<'hir>, &'hir Expr<'hir>, Option<&'hir Expr<'hir>>),
2641 Loop(&'hir Block<'hir>, Option<Label>, LoopSource, Span),
2647 Match(&'hir Expr<'hir>, &'hir [Arm<'hir>], MatchSource),
2650 Closure(&'hir Closure<'hir>),
2657 Block(&'hir Block<'hir>, Option<Label>),
2659
2660 Assign(&'hir Expr<'hir>, &'hir Expr<'hir>, Span),
2662 AssignOp(AssignOp, &'hir Expr<'hir>, &'hir Expr<'hir>),
2666 Field(&'hir Expr<'hir>, Ident),
2668 Index(&'hir Expr<'hir>, &'hir Expr<'hir>, Span),
2672
2673 Path(QPath<'hir>),
2675
2676 AddrOf(BorrowKind, Mutability, &'hir Expr<'hir>),
2678 Break(Destination, Option<&'hir Expr<'hir>>),
2680 Continue(Destination),
2682 Ret(Option<&'hir Expr<'hir>>),
2684 Become(&'hir Expr<'hir>),
2686
2687 InlineAsm(&'hir InlineAsm<'hir>),
2689
2690 OffsetOf(&'hir Ty<'hir>, &'hir [Ident]),
2692
2693 Struct(&'hir QPath<'hir>, &'hir [ExprField<'hir>], StructTailExpr<'hir>),
2698
2699 Repeat(&'hir Expr<'hir>, &'hir ConstArg<'hir>),
2704
2705 Yield(&'hir Expr<'hir>, YieldSource),
2707
2708 UnsafeBinderCast(UnsafeBinderCastKind, &'hir Expr<'hir>, Option<&'hir Ty<'hir>>),
2711
2712 Err(rustc_span::ErrorGuaranteed),
2714}
2715
2716#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for StructTailExpr<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::None => ::core::fmt::Formatter::write_str(f, "None"),
Self::Base(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Base",
&__self_0),
Self::DefaultFields(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"DefaultFields", &__self_0),
Self::NoneWithError(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"NoneWithError", &__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for StructTailExpr<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for StructTailExpr<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<ErrorGuaranteed>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for StructTailExpr<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
StructTailExpr<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
StructTailExpr::None => {}
StructTailExpr::Base(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StructTailExpr::DefaultFields(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
StructTailExpr::NoneWithError(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2717pub enum StructTailExpr<'hir> {
2718 None,
2720 Base(&'hir Expr<'hir>),
2723 DefaultFields(Span),
2727 NoneWithError(ErrorGuaranteed),
2733}
2734
2735#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for QPath<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Resolved(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"Resolved", __self_0, &__self_1),
Self::TypeRelative(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"TypeRelative", __self_0, &__self_1),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for QPath<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for QPath<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Path<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir PathSegment<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for QPath<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
QPath<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
QPath::Resolved(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
QPath::TypeRelative(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2741pub enum QPath<'hir> {
2742 Resolved(Option<&'hir Ty<'hir>>, &'hir Path<'hir>),
2749
2750 TypeRelative(&'hir Ty<'hir>, &'hir PathSegment<'hir>),
2757}
2758
2759impl<'hir> QPath<'hir> {
2760 pub fn span(&self) -> Span {
2762 match *self {
2763 QPath::Resolved(_, path) => path.span,
2764 QPath::TypeRelative(qself, ps) => qself.span.to(ps.ident.span),
2765 }
2766 }
2767
2768 pub fn qself_span(&self) -> Span {
2771 match *self {
2772 QPath::Resolved(_, path) => path.span,
2773 QPath::TypeRelative(qself, _) => qself.span,
2774 }
2775 }
2776}
2777
2778#[derive(#[automatically_derived]
impl ::core::marker::Copy for LocalSource { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LocalSource { }
#[automatically_derived]
impl ::core::clone::Clone for LocalSource {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for LocalSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_c_like_enum_write_str(f,
"Normal AsyncFn AwaitDesugar AssignDesugar Contract",
match self {
LocalSource::Normal => 0usize,
LocalSource::AsyncFn => 7usize,
LocalSource::AwaitDesugar => 15usize,
LocalSource::AssignDesugar => 28usize,
LocalSource::Contract => 42usize,
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LocalSource
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
LocalSource::Normal => {}
LocalSource::AsyncFn => {}
LocalSource::AwaitDesugar => {}
LocalSource::AssignDesugar => {}
LocalSource::Contract => {}
}
}
}
};StableHash)]
2780pub enum LocalSource {
2781 Normal,
2783 AsyncFn,
2794 AwaitDesugar,
2796 AssignDesugar,
2798 Contract,
2800}
2801
2802#[derive(#[automatically_derived]
impl ::core::marker::Copy for MatchSource { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MatchSource { }
#[automatically_derived]
impl ::core::clone::Clone for MatchSource {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MatchSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MatchSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::TryDesugar(__self_0), Self::TryDesugar(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MatchSource {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<HirId>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for MatchSource {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::TryDesugar(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for MatchSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Normal => ::core::fmt::Formatter::write_str(f, "Normal"),
Self::Postfix => ::core::fmt::Formatter::write_str(f, "Postfix"),
Self::ForLoopDesugar =>
::core::fmt::Formatter::write_str(f, "ForLoopDesugar"),
Self::TryDesugar(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TryDesugar", &__self_0),
Self::AwaitDesugar =>
::core::fmt::Formatter::write_str(f, "AwaitDesugar"),
Self::FormatArgs =>
::core::fmt::Formatter::write_str(f, "FormatArgs"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for MatchSource
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
MatchSource::Normal => {}
MatchSource::Postfix => {}
MatchSource::ForLoopDesugar => {}
MatchSource::TryDesugar(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
MatchSource::AwaitDesugar => {}
MatchSource::FormatArgs => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for MatchSource {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
MatchSource::Normal => { 0usize }
MatchSource::Postfix => { 1usize }
MatchSource::ForLoopDesugar => { 2usize }
MatchSource::TryDesugar(ref __binding_0) => { 3usize }
MatchSource::AwaitDesugar => { 4usize }
MatchSource::FormatArgs => { 5usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
MatchSource::Normal => {}
MatchSource::Postfix => {}
MatchSource::ForLoopDesugar => {}
MatchSource::TryDesugar(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
MatchSource::AwaitDesugar => {}
MatchSource::FormatArgs => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for MatchSource {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { MatchSource::Normal }
1usize => { MatchSource::Postfix }
2usize => { MatchSource::ForLoopDesugar }
3usize => {
MatchSource::TryDesugar(::rustc_serialize::Decodable::decode(__decoder))
}
4usize => { MatchSource::AwaitDesugar }
5usize => { MatchSource::FormatArgs }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `MatchSource`, expected 0..6, actual {0}",
n));
}
}
}
}
};Decodable)]
2804pub enum MatchSource {
2805 Normal,
2807 Postfix,
2809 ForLoopDesugar,
2811 TryDesugar(HirId),
2813 AwaitDesugar,
2815 FormatArgs,
2817}
2818
2819impl MatchSource {
2820 #[inline]
2821 pub const fn name(self) -> &'static str {
2822 use MatchSource::*;
2823 match self {
2824 Normal => "match",
2825 Postfix => ".match",
2826 ForLoopDesugar => "for",
2827 TryDesugar(_) => "?",
2828 AwaitDesugar => ".await",
2829 FormatArgs => "format_args!()",
2830 }
2831 }
2832}
2833
2834#[derive(#[automatically_derived]
impl ::core::marker::Copy for LoopSource { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LoopSource { }
#[automatically_derived]
impl ::core::clone::Clone for LoopSource {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LoopSource { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LoopSource {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for LoopSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LoopSource::Loop => "Loop",
LoopSource::While => "While",
LoopSource::ForLoop => "ForLoop",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LoopSource {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
LoopSource::Loop => {}
LoopSource::While => {}
LoopSource::ForLoop => {}
}
}
}
};StableHash)]
2836pub enum LoopSource {
2837 Loop,
2839 While,
2841 ForLoop,
2843}
2844
2845impl LoopSource {
2846 pub fn name(self) -> &'static str {
2847 match self {
2848 LoopSource::Loop => "loop",
2849 LoopSource::While => "while",
2850 LoopSource::ForLoop => "for",
2851 }
2852 }
2853}
2854
2855#[derive(#[automatically_derived]
impl ::core::marker::Copy for LoopIdError { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for LoopIdError { }
#[automatically_derived]
impl ::core::clone::Clone for LoopIdError {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for LoopIdError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
LoopIdError::OutsideLoopScope => "OutsideLoopScope",
LoopIdError::UnlabeledCfInWhileCondition =>
"UnlabeledCfInWhileCondition",
LoopIdError::UnresolvedLabel => "UnresolvedLabel",
})
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for LoopIdError { }
#[automatically_derived]
impl ::core::cmp::PartialEq for LoopIdError {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for LoopIdError
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
LoopIdError::OutsideLoopScope => {}
LoopIdError::UnlabeledCfInWhileCondition => {}
LoopIdError::UnresolvedLabel => {}
}
}
}
};StableHash)]
2856pub enum LoopIdError {
2857 OutsideLoopScope,
2858 UnlabeledCfInWhileCondition,
2859 UnresolvedLabel,
2860}
2861
2862impl fmt::Display for LoopIdError {
2863 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2864 f.write_str(match self {
2865 LoopIdError::OutsideLoopScope => "not inside loop scope",
2866 LoopIdError::UnlabeledCfInWhileCondition => {
2867 "unlabeled control flow (break or continue) in while condition"
2868 }
2869 LoopIdError::UnresolvedLabel => "label not found",
2870 })
2871 }
2872}
2873
2874#[derive(#[automatically_derived]
impl ::core::marker::Copy for Destination { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Destination { }
#[automatically_derived]
impl ::core::clone::Clone for Destination {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<Label>>;
let _: ::core::clone::AssertParamIsClone<Result<HirId, LoopIdError>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Destination {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Destination",
"label", &self.label, "target_id", &&self.target_id)
}
}Debug, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Destination { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Destination {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.label == other.label && self.target_id == other.target_id
}
}PartialEq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Destination
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Destination {
label: ref __binding_0, target_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2875pub struct Destination {
2876 pub label: Option<Label>,
2878
2879 pub target_id: Result<HirId, LoopIdError>,
2882}
2883
2884#[derive(#[automatically_derived]
impl ::core::marker::Copy for YieldSource { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for YieldSource { }
#[automatically_derived]
impl ::core::clone::Clone for YieldSource {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<HirId>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for YieldSource {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Await { expr: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Await",
"expr", &__self_0),
Self::Yield => ::core::fmt::Formatter::write_str(f, "Yield"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for YieldSource
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
YieldSource::Await { expr: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
YieldSource::Yield => {}
}
}
}
};StableHash)]
2886pub enum YieldSource {
2887 Await { expr: Option<HirId> },
2889 Yield,
2891}
2892
2893impl fmt::Display for YieldSource {
2894 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2895 f.write_str(match self {
2896 YieldSource::Await { .. } => "`await`",
2897 YieldSource::Yield => "`yield`",
2898 })
2899 }
2900}
2901
2902#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for FnSig<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "FnSig",
"header", &self.header, "decl", &self.decl, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for FnSig<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for FnSig<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<FnHeader>;
let _: ::core::clone::AssertParamIsClone<&'hir FnDecl<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for FnSig<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FnSig<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnSig {
header: ref __binding_0,
decl: ref __binding_1,
span: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2905pub struct FnSig<'hir> {
2906 pub header: FnHeader,
2907 pub decl: &'hir FnDecl<'hir>,
2908 pub span: Span,
2909}
2910
2911#[derive(#[automatically_derived]
impl ::core::marker::Copy for TraitItemId { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for TraitItemId { }
#[automatically_derived]
impl ::core::clone::Clone for TraitItemId {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for TraitItemId { }
#[automatically_derived]
impl ::core::cmp::PartialEq for TraitItemId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.owner_id == other.owner_id }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for TraitItemId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<OwnerId>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for TraitItemId {
fn encode(&self, __encoder: &mut __E) {
let TraitItemId { owner_id: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for TraitItemId {
fn decode(__decoder: &mut __D) -> Self {
TraitItemId {
owner_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for TraitItemId {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "TraitItemId",
"owner_id", &&self.owner_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for TraitItemId
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitItemId { owner_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2915pub struct TraitItemId {
2916 pub owner_id: OwnerId,
2917}
2918
2919impl TraitItemId {
2920 #[inline]
2921 pub fn hir_id(&self) -> HirId {
2922 HirId::make_owner(self.owner_id.def_id)
2924 }
2925}
2926
2927#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TraitItem<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["ident", "owner_id", "generics", "kind", "span", "defaultness"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.ident, &self.owner_id, &self.generics, &self.kind,
&self.span, &&self.defaultness];
::core::fmt::Formatter::debug_struct_fields_finish(f, "TraitItem",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TraitItem<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TraitItem<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<OwnerId>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<TraitItemKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Defaultness>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TraitItem<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitItem<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitItem {
ident: ref __binding_0,
owner_id: ref __binding_1,
generics: ref __binding_2,
kind: ref __binding_3,
span: ref __binding_4,
defaultness: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2932pub struct TraitItem<'hir> {
2933 pub ident: Ident,
2934 pub owner_id: OwnerId,
2935 pub generics: &'hir Generics<'hir>,
2936 pub kind: TraitItemKind<'hir>,
2937 pub span: Span,
2938 pub defaultness: Defaultness,
2939}
2940
2941macro_rules! expect_methods_self_kind {
2942 ( $( $name:ident, $ret_ty:ty, $pat:pat, $ret_val:expr; )* ) => {
2943 $(
2944 #[track_caller]
2945 pub fn $name(&self) -> $ret_ty {
2946 let $pat = &self.kind else { expect_failed(stringify!($name), self) };
2947 $ret_val
2948 }
2949 )*
2950 }
2951}
2952
2953macro_rules! expect_methods_self {
2954 ( $( $name:ident, $ret_ty:ty, $pat:pat, $ret_val:expr; )* ) => {
2955 $(
2956 #[track_caller]
2957 pub fn $name(&self) -> $ret_ty {
2958 let $pat = self else { expect_failed(stringify!($name), self) };
2959 $ret_val
2960 }
2961 )*
2962 }
2963}
2964
2965#[track_caller]
2966fn expect_failed<T: fmt::Debug>(ident: &'static str, found: T) -> ! {
2967 {
::core::panicking::panic_fmt(format_args!("{0}: found {1:?}", ident,
found));
}panic!("{ident}: found {found:?}")
2968}
2969
2970impl<'hir> TraitItem<'hir> {
2971 #[inline]
2972 pub fn hir_id(&self) -> HirId {
2973 HirId::make_owner(self.owner_id.def_id)
2975 }
2976
2977 pub fn trait_item_id(&self) -> TraitItemId {
2978 TraitItemId { owner_id: self.owner_id }
2979 }
2980
2981 #[track_caller]
pub fn expect_const(&self) -> (&'hir Ty<'hir>, Option<ConstItemRhs<'hir>>) {
let TraitItemKind::Const(ty, rhs) =
&self.kind else { expect_failed("expect_const", self) };
(ty, *rhs)
}
#[track_caller]
pub fn expect_fn(&self) -> (&FnSig<'hir>, &TraitFn<'hir>) {
let TraitItemKind::Fn(ty, trfn) =
&self.kind else { expect_failed("expect_fn", self) };
(ty, trfn)
}
#[track_caller]
pub fn expect_type(&self) -> (GenericBounds<'hir>, Option<&'hir Ty<'hir>>) {
let TraitItemKind::Type(bounds, ty) =
&self.kind else { expect_failed("expect_type", self) };
(bounds, *ty)
}expect_methods_self_kind! {
2982 expect_const, (&'hir Ty<'hir>, Option<ConstItemRhs<'hir>>),
2983 TraitItemKind::Const(ty, rhs), (ty, *rhs);
2984
2985 expect_fn, (&FnSig<'hir>, &TraitFn<'hir>),
2986 TraitItemKind::Fn(ty, trfn), (ty, trfn);
2987
2988 expect_type, (GenericBounds<'hir>, Option<&'hir Ty<'hir>>),
2989 TraitItemKind::Type(bounds, ty), (bounds, *ty);
2990 }
2991}
2992
2993#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TraitFn<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Required(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Required", &__self_0),
Self::Provided(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Provided", &__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TraitFn<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TraitFn<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Option<Ident>]>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TraitFn<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitFn<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
TraitFn::Required(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TraitFn::Provided(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
2995pub enum TraitFn<'hir> {
2996 Required(&'hir [Option<Ident>]),
2998
2999 Provided(BodyId),
3001}
3002
3003#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TraitItemKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Const(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Const",
__self_0, &__self_1),
Self::Fn(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Fn",
__self_0, &__self_1),
Self::Type(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Type",
__self_0, &__self_1),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TraitItemKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TraitItemKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<ConstItemRhs<'hir>>>;
let _: ::core::clone::AssertParamIsClone<FnSig<'hir>>;
let _: ::core::clone::AssertParamIsClone<TraitFn<'hir>>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Ty<'hir>>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TraitItemKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitItemKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
TraitItemKind::Const(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TraitItemKind::Fn(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TraitItemKind::Type(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3005pub enum TraitItemKind<'hir> {
3006 Const(&'hir Ty<'hir>, Option<ConstItemRhs<'hir>>),
3008 Fn(FnSig<'hir>, TraitFn<'hir>),
3010 Type(GenericBounds<'hir>, Option<&'hir Ty<'hir>>),
3013}
3014
3015#[derive(#[automatically_derived]
impl ::core::marker::Copy for ImplItemId { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ImplItemId { }
#[automatically_derived]
impl ::core::clone::Clone for ImplItemId {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ImplItemId { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ImplItemId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.owner_id == other.owner_id }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplItemId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<OwnerId>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ImplItemId {
fn encode(&self, __encoder: &mut __E) {
let ImplItemId { owner_id: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ImplItemId {
fn decode(__decoder: &mut __D) -> Self {
ImplItemId {
owner_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ImplItemId {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "ImplItemId",
"owner_id", &&self.owner_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ImplItemId {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplItemId { owner_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3019pub struct ImplItemId {
3020 pub owner_id: OwnerId,
3021}
3022
3023impl ImplItemId {
3024 #[inline]
3025 pub fn hir_id(&self) -> HirId {
3026 HirId::make_owner(self.owner_id.def_id)
3028 }
3029}
3030
3031#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for ImplItem<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["ident", "owner_id", "generics", "kind", "impl_kind", "span"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.ident, &self.owner_id, &self.generics, &self.kind,
&self.impl_kind, &&self.span];
::core::fmt::Formatter::debug_struct_fields_finish(f, "ImplItem",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ImplItem<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ImplItem<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<OwnerId>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<ImplItemKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<ImplItemImplKind>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ImplItem<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ImplItem<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplItem {
ident: ref __binding_0,
owner_id: ref __binding_1,
generics: ref __binding_2,
kind: ref __binding_3,
impl_kind: ref __binding_4,
span: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3035pub struct ImplItem<'hir> {
3036 pub ident: Ident,
3037 pub owner_id: OwnerId,
3038 pub generics: &'hir Generics<'hir>,
3039 pub kind: ImplItemKind<'hir>,
3040 pub impl_kind: ImplItemImplKind,
3041 pub span: Span,
3042}
3043
3044#[derive(#[automatically_derived]
impl ::core::fmt::Debug for ImplItemImplKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Inherent { vis_span: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Inherent", "vis_span", &__self_0),
Self::Trait { defaultness: __self_0, trait_item_def_id: __self_1 }
=>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Trait",
"defaultness", __self_0, "trait_item_def_id", &__self_1),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ImplItemImplKind { }
#[automatically_derived]
impl ::core::clone::Clone for ImplItemImplKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<Defaultness>;
let _:
::core::clone::AssertParamIsClone<Result<DefId,
ErrorGuaranteed>>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for ImplItemImplKind { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ImplItemImplKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ImplItemImplKind::Inherent { vis_span: ref __binding_0 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ImplItemImplKind::Trait {
defaultness: ref __binding_0,
trait_item_def_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3045pub enum ImplItemImplKind {
3046 Inherent {
3047 vis_span: Span,
3048 },
3049 Trait {
3050 defaultness: Defaultness,
3051 trait_item_def_id: Result<DefId, ErrorGuaranteed>,
3053 },
3054}
3055
3056impl<'hir> ImplItem<'hir> {
3057 #[inline]
3058 pub fn hir_id(&self) -> HirId {
3059 HirId::make_owner(self.owner_id.def_id)
3061 }
3062
3063 pub fn impl_item_id(&self) -> ImplItemId {
3064 ImplItemId { owner_id: self.owner_id }
3065 }
3066
3067 pub fn vis_span(&self) -> Option<Span> {
3068 match self.impl_kind {
3069 ImplItemImplKind::Trait { .. } => None,
3070 ImplItemImplKind::Inherent { vis_span, .. } => Some(vis_span),
3071 }
3072 }
3073
3074 #[track_caller]
pub fn expect_const(&self) -> (&'hir Ty<'hir>, ConstItemRhs<'hir>) {
let ImplItemKind::Const(ty, rhs) =
&self.kind else { expect_failed("expect_const", self) };
(ty, *rhs)
}
#[track_caller]
pub fn expect_fn(&self) -> (&FnSig<'hir>, BodyId) {
let ImplItemKind::Fn(ty, body) =
&self.kind else { expect_failed("expect_fn", self) };
(ty, *body)
}
#[track_caller]
pub fn expect_type(&self) -> &'hir Ty<'hir> {
let ImplItemKind::Type(ty) =
&self.kind else { expect_failed("expect_type", self) };
ty
}expect_methods_self_kind! {
3075 expect_const, (&'hir Ty<'hir>, ConstItemRhs<'hir>), ImplItemKind::Const(ty, rhs), (ty, *rhs);
3076 expect_fn, (&FnSig<'hir>, BodyId), ImplItemKind::Fn(ty, body), (ty, *body);
3077 expect_type, &'hir Ty<'hir>, ImplItemKind::Type(ty), ty;
3078 }
3079}
3080
3081#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for ImplItemKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Const(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Const",
__self_0, &__self_1),
Self::Fn(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Fn",
__self_0, &__self_1),
Self::Type(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Type",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ImplItemKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ImplItemKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<ConstItemRhs<'hir>>;
let _: ::core::clone::AssertParamIsClone<FnSig<'hir>>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ImplItemKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ImplItemKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ImplItemKind::Const(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ImplItemKind::Fn(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ImplItemKind::Type(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3083pub enum ImplItemKind<'hir> {
3084 Const(&'hir Ty<'hir>, ConstItemRhs<'hir>),
3087 Fn(FnSig<'hir>, BodyId),
3089 Type(&'hir Ty<'hir>),
3091}
3092
3093#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for AssocItemConstraint<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"AssocItemConstraint", "hir_id", &self.hir_id, "ident",
&self.ident, "gen_args", &self.gen_args, "kind", &self.kind,
"span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for AssocItemConstraint<'hir> {
}
#[automatically_derived]
impl<'hir> ::core::clone::Clone for AssocItemConstraint<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<&'hir GenericArgs<'hir>>;
let _:
::core::clone::AssertParamIsClone<AssocItemConstraintKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for AssocItemConstraint<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
AssocItemConstraint<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
AssocItemConstraint {
hir_id: ref __binding_0,
ident: ref __binding_1,
gen_args: ref __binding_2,
kind: ref __binding_3,
span: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3104pub struct AssocItemConstraint<'hir> {
3105 #[stable_hash(ignore)]
3106 pub hir_id: HirId,
3107 pub ident: Ident,
3108 pub gen_args: &'hir GenericArgs<'hir>,
3109 pub kind: AssocItemConstraintKind<'hir>,
3110 pub span: Span,
3111}
3112
3113impl<'hir> AssocItemConstraint<'hir> {
3114 pub fn ty(self) -> Option<&'hir Ty<'hir>> {
3116 match self.kind {
3117 AssocItemConstraintKind::Equality { term: Term::Ty(ty) } => Some(ty),
3118 _ => None,
3119 }
3120 }
3121
3122 pub fn ct(self) -> Option<&'hir ConstArg<'hir>> {
3124 match self.kind {
3125 AssocItemConstraintKind::Equality { term: Term::Const(ct) } => Some(ct),
3126 _ => None,
3127 }
3128 }
3129}
3130
3131#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Term<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Ty(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
&__self_0),
Self::Const(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Term<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Term<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Term<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Term<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Term::Ty(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Term::Const(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3132pub enum Term<'hir> {
3133 Ty(&'hir Ty<'hir>),
3134 Const(&'hir ConstArg<'hir>),
3135}
3136
3137impl<'hir> From<&'hir Ty<'hir>> for Term<'hir> {
3138 fn from(ty: &'hir Ty<'hir>) -> Self {
3139 Term::Ty(ty)
3140 }
3141}
3142
3143impl<'hir> From<&'hir ConstArg<'hir>> for Term<'hir> {
3144 fn from(c: &'hir ConstArg<'hir>) -> Self {
3145 Term::Const(c)
3146 }
3147}
3148
3149#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for AssocItemConstraintKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Equality { term: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Equality", "term", &__self_0),
Self::Bound { bounds: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Bound",
"bounds", &__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for
AssocItemConstraintKind<'hir> {
}
#[automatically_derived]
impl<'hir> ::core::clone::Clone for AssocItemConstraintKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Term<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericBound<'hir>]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for AssocItemConstraintKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
AssocItemConstraintKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
AssocItemConstraintKind::Equality { term: ref __binding_0 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
AssocItemConstraintKind::Bound { bounds: ref __binding_0 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3151pub enum AssocItemConstraintKind<'hir> {
3152 Equality { term: Term<'hir> },
3159 Bound { bounds: &'hir [GenericBound<'hir>] },
3161}
3162
3163impl<'hir> AssocItemConstraintKind<'hir> {
3164 pub fn descr(&self) -> &'static str {
3165 match self {
3166 AssocItemConstraintKind::Equality { .. } => "binding",
3167 AssocItemConstraintKind::Bound { .. } => "constraint",
3168 }
3169 }
3170}
3171
3172#[derive(#[automatically_derived]
impl ::core::fmt::Debug for AmbigArg {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match *self {}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for AmbigArg { }
#[automatically_derived]
impl ::core::clone::Clone for AmbigArg {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for AmbigArg { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for AmbigArg {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {}
}
}
};StableHash)]
3176pub enum AmbigArg {}
3177
3178#[derive(#[automatically_derived]
impl<'hir, Unambig: ::core::fmt::Debug> ::core::fmt::Debug for
Ty<'hir, Unambig> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "Ty", "hir_id",
&self.hir_id, "span", &self.span, "kind", &&self.kind)
}
}Debug, #[automatically_derived]
impl<'hir, Unambig: ::core::clone::Clone> ::core::clone::Clone for
Ty<'hir, Unambig> {
#[inline]
fn clone(&self) -> Self {
Ty {
hir_id: ::core::clone::Clone::clone(&self.hir_id),
span: ::core::clone::Clone::clone(&self.span),
kind: ::core::clone::Clone::clone(&self.kind),
}
}
}Clone, #[automatically_derived]
impl<'hir, Unambig: ::core::marker::Copy> ::core::marker::Copy for
Ty<'hir, Unambig> {
}Copy, const _: () =
{
impl<'hir, Unambig> ::rustc_data_structures::stable_hash::StableHash
for Ty<'hir, Unambig> where
Unambig: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Ty {
hir_id: ref __binding_0,
span: ref __binding_1,
kind: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3183#[repr(C)]
3184pub struct Ty<'hir, Unambig = ()> {
3185 #[stable_hash(ignore)]
3186 pub hir_id: HirId,
3187 pub span: Span,
3188 pub kind: TyKind<'hir, Unambig>,
3189}
3190
3191impl<'hir> Ty<'hir, AmbigArg> {
3192 pub fn as_unambig_ty(&self) -> &Ty<'hir> {
3203 let ptr = self as *const Ty<'hir, AmbigArg> as *const Ty<'hir, ()>;
3206 unsafe { &*ptr }
3207 }
3208}
3209
3210impl<'hir> Ty<'hir> {
3211 pub fn try_as_ambig_ty(&self) -> Option<&Ty<'hir, AmbigArg>> {
3217 if let TyKind::Infer(()) = self.kind {
3218 return None;
3219 }
3220
3221 let ptr = self as *const Ty<'hir> as *const Ty<'hir, AmbigArg>;
3225 Some(unsafe { &*ptr })
3226 }
3227}
3228
3229impl<'hir> Ty<'hir, AmbigArg> {
3230 pub fn peel_refs(&self) -> &Ty<'hir> {
3231 let mut final_ty = self.as_unambig_ty();
3232 while let TyKind::Ref(_, ty, _) = &final_ty.kind {
3233 final_ty = ty;
3234 }
3235 final_ty
3236 }
3237}
3238
3239impl<'hir> Ty<'hir> {
3240 pub fn peel_refs(&self) -> &Self {
3241 let mut final_ty = self;
3242 while let TyKind::Ref(_, ty, _) = &final_ty.kind {
3243 final_ty = ty;
3244 }
3245 final_ty
3246 }
3247
3248 pub fn as_generic_param(&self) -> Option<(DefId, Ident)> {
3250 let TyKind::Path(QPath::Resolved(None, path)) = self.kind else {
3251 return None;
3252 };
3253 let [segment] = &path.segments else {
3254 return None;
3255 };
3256 match path.res {
3257 Res::Def(DefKind::TyParam, def_id) | Res::SelfTyParam { trait_: def_id } => {
3258 Some((def_id, segment.ident))
3259 }
3260 _ => None,
3261 }
3262 }
3263
3264 pub fn find_self_aliases(&self) -> Vec<Span> {
3265 use crate::intravisit::Visitor;
3266 struct MyVisitor(Vec<Span>);
3267 impl<'v> Visitor<'v> for MyVisitor {
3268 fn visit_ty(&mut self, t: &'v Ty<'v, AmbigArg>) {
3269 if #[allow(non_exhaustive_omitted_patterns)] match &t.kind {
TyKind::Path(QPath::Resolved(_, Path {
res: crate::def::Res::SelfTyAlias { .. }, .. })) => true,
_ => false,
}matches!(
3270 &t.kind,
3271 TyKind::Path(QPath::Resolved(
3272 _,
3273 Path { res: crate::def::Res::SelfTyAlias { .. }, .. },
3274 ))
3275 ) {
3276 self.0.push(t.span);
3277 return;
3278 }
3279 crate::intravisit::walk_ty(self, t);
3280 }
3281 }
3282
3283 let mut my_visitor = MyVisitor(::alloc::vec::Vec::new()vec![]);
3284 my_visitor.visit_ty_unambig(self);
3285 my_visitor.0
3286 }
3287
3288 pub fn is_suggestable_infer_ty(&self) -> bool {
3291 fn are_suggestable_generic_args(generic_args: &[GenericArg<'_>]) -> bool {
3292 generic_args.iter().any(|arg| match arg {
3293 GenericArg::Type(ty) => ty.as_unambig_ty().is_suggestable_infer_ty(),
3294 GenericArg::Infer(_) => true,
3295 _ => false,
3296 })
3297 }
3298 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/7189d39d9ce936881b8132c6addeaf3e295cd455/compiler/rustc_hir/src/hir.rs:3298",
"rustc_hir::hir", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/7189d39d9ce936881b8132c6addeaf3e295cd455/compiler/rustc_hir/src/hir.rs"),
::tracing_core::__macro_support::Option::Some(3298u32),
::tracing_core::__macro_support::Option::Some("rustc_hir::hir"),
::tracing_core::field::FieldSet::new(&[{
const NAME:
::tracing::__macro_support::FieldName<{
::tracing::__macro_support::FieldName::len("self")
}> =
::tracing::__macro_support::FieldName::new("self");
NAME.as_str()
}], ::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&::tracing::field::debug(&self)
as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!(?self);
3299 match &self.kind {
3300 TyKind::Infer(()) => true,
3301 TyKind::Slice(ty) => ty.is_suggestable_infer_ty(),
3302 TyKind::Array(ty, length) => {
3303 ty.is_suggestable_infer_ty() || #[allow(non_exhaustive_omitted_patterns)] match length.kind {
ConstArgKind::Infer(..) => true,
_ => false,
}matches!(length.kind, ConstArgKind::Infer(..))
3304 }
3305 TyKind::Tup(tys) => tys.iter().any(Self::is_suggestable_infer_ty),
3306 TyKind::Ptr(ty, _) | TyKind::Ref(_, ty, _) => ty.is_suggestable_infer_ty(),
3307 TyKind::Path(QPath::TypeRelative(ty, segment)) => {
3308 ty.is_suggestable_infer_ty() || are_suggestable_generic_args(segment.args().args)
3309 }
3310 TyKind::Path(QPath::Resolved(ty_opt, Path { segments, .. })) => {
3311 ty_opt.is_some_and(Self::is_suggestable_infer_ty)
3312 || segments
3313 .iter()
3314 .any(|segment| are_suggestable_generic_args(segment.args().args))
3315 }
3316 _ => false,
3317 }
3318 }
3319}
3320
3321#[derive(#[automatically_derived]
impl ::core::marker::Copy for PrimTy { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PrimTy { }
#[automatically_derived]
impl ::core::clone::Clone for PrimTy {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<IntTy>;
let _: ::core::clone::AssertParamIsClone<UintTy>;
let _: ::core::clone::AssertParamIsClone<FloatTy>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for PrimTy { }
#[automatically_derived]
impl ::core::cmp::PartialEq for PrimTy {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Int(__self_0), Self::Int(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Uint(__self_0), Self::Uint(__arg1_0)) =>
__self_0 == __arg1_0,
(Self::Float(__self_0), Self::Float(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for PrimTy {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<IntTy>;
let _: ::core::cmp::AssertParamIsEq<UintTy>;
let _: ::core::cmp::AssertParamIsEq<FloatTy>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for PrimTy {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
PrimTy::Int(ref __binding_0) => { 0usize }
PrimTy::Uint(ref __binding_0) => { 1usize }
PrimTy::Float(ref __binding_0) => { 2usize }
PrimTy::Str => { 3usize }
PrimTy::Bool => { 4usize }
PrimTy::Char => { 5usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
PrimTy::Int(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
PrimTy::Uint(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
PrimTy::Float(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
PrimTy::Str => {}
PrimTy::Bool => {}
PrimTy::Char => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for PrimTy {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
PrimTy::Int(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
PrimTy::Uint(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
PrimTy::Float(::rustc_serialize::Decodable::decode(__decoder))
}
3usize => { PrimTy::Str }
4usize => { PrimTy::Bool }
5usize => { PrimTy::Char }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PrimTy`, expected 0..6, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for PrimTy {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state);
match self {
Self::Int(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::Uint(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Self::Float(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for PrimTy {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Int(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Int",
&__self_0),
Self::Uint(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Uint",
&__self_0),
Self::Float(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Float",
&__self_0),
Self::Str => ::core::fmt::Formatter::write_str(f, "Str"),
Self::Bool => ::core::fmt::Formatter::write_str(f, "Bool"),
Self::Char => ::core::fmt::Formatter::write_str(f, "Char"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for PrimTy {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
PrimTy::Int(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PrimTy::Uint(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PrimTy::Float(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PrimTy::Str => {}
PrimTy::Bool => {}
PrimTy::Char => {}
}
}
}
};StableHash)]
3323pub enum PrimTy {
3324 Int(IntTy),
3325 Uint(UintTy),
3326 Float(FloatTy),
3327 Str,
3328 Bool,
3329 Char,
3330}
3331
3332impl PrimTy {
3333 pub const ALL: [Self; 19] = [
3335 Self::Int(IntTy::I8),
3337 Self::Int(IntTy::I16),
3338 Self::Int(IntTy::I32),
3339 Self::Int(IntTy::I64),
3340 Self::Int(IntTy::I128),
3341 Self::Int(IntTy::Isize),
3342 Self::Uint(UintTy::U8),
3343 Self::Uint(UintTy::U16),
3344 Self::Uint(UintTy::U32),
3345 Self::Uint(UintTy::U64),
3346 Self::Uint(UintTy::U128),
3347 Self::Uint(UintTy::Usize),
3348 Self::Float(FloatTy::F16),
3349 Self::Float(FloatTy::F32),
3350 Self::Float(FloatTy::F64),
3351 Self::Float(FloatTy::F128),
3352 Self::Bool,
3353 Self::Char,
3354 Self::Str,
3355 ];
3356
3357 pub fn name_str(self) -> &'static str {
3361 match self {
3362 PrimTy::Int(i) => i.name_str(),
3363 PrimTy::Uint(u) => u.name_str(),
3364 PrimTy::Float(f) => f.name_str(),
3365 PrimTy::Str => "str",
3366 PrimTy::Bool => "bool",
3367 PrimTy::Char => "char",
3368 }
3369 }
3370
3371 pub fn name(self) -> Symbol {
3372 match self {
3373 PrimTy::Int(i) => i.name(),
3374 PrimTy::Uint(u) => u.name(),
3375 PrimTy::Float(f) => f.name(),
3376 PrimTy::Str => sym::str,
3377 PrimTy::Bool => sym::bool,
3378 PrimTy::Char => sym::char,
3379 }
3380 }
3381
3382 pub fn from_name(name: Symbol) -> Option<Self> {
3385 let ty = match name {
3386 sym::i8 => Self::Int(IntTy::I8),
3388 sym::i16 => Self::Int(IntTy::I16),
3389 sym::i32 => Self::Int(IntTy::I32),
3390 sym::i64 => Self::Int(IntTy::I64),
3391 sym::i128 => Self::Int(IntTy::I128),
3392 sym::isize => Self::Int(IntTy::Isize),
3393 sym::u8 => Self::Uint(UintTy::U8),
3394 sym::u16 => Self::Uint(UintTy::U16),
3395 sym::u32 => Self::Uint(UintTy::U32),
3396 sym::u64 => Self::Uint(UintTy::U64),
3397 sym::u128 => Self::Uint(UintTy::U128),
3398 sym::usize => Self::Uint(UintTy::Usize),
3399 sym::f16 => Self::Float(FloatTy::F16),
3400 sym::f32 => Self::Float(FloatTy::F32),
3401 sym::f64 => Self::Float(FloatTy::F64),
3402 sym::f128 => Self::Float(FloatTy::F128),
3403 sym::bool => Self::Bool,
3404 sym::char => Self::Char,
3405 sym::str => Self::Str,
3406 _ => return None,
3407 };
3408 Some(ty)
3409 }
3410}
3411
3412#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for FnPtrTy<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "FnPtrTy",
"safety", &self.safety, "abi", &self.abi, "generic_params",
&self.generic_params, "decl", &self.decl, "param_idents",
&&self.param_idents)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for FnPtrTy<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for FnPtrTy<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Safety>;
let _: ::core::clone::AssertParamIsClone<ExternAbi>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir FnDecl<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Option<Ident>]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for FnPtrTy<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FnPtrTy<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnPtrTy {
safety: ref __binding_0,
abi: ref __binding_1,
generic_params: ref __binding_2,
decl: ref __binding_3,
param_idents: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3413pub struct FnPtrTy<'hir> {
3414 pub safety: Safety,
3415 pub abi: ExternAbi,
3416 pub generic_params: &'hir [GenericParam<'hir>],
3417 pub decl: &'hir FnDecl<'hir>,
3418 pub param_idents: &'hir [Option<Ident>],
3421}
3422
3423#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for UnsafeBinderTy<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"UnsafeBinderTy", "generic_params", &self.generic_params,
"inner_ty", &&self.inner_ty)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for UnsafeBinderTy<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for UnsafeBinderTy<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for UnsafeBinderTy<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
UnsafeBinderTy<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
UnsafeBinderTy {
generic_params: ref __binding_0, inner_ty: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3424pub struct UnsafeBinderTy<'hir> {
3425 pub generic_params: &'hir [GenericParam<'hir>],
3426 pub inner_ty: &'hir Ty<'hir>,
3427}
3428
3429#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for OpaqueTy<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "OpaqueTy",
"hir_id", &self.hir_id, "def_id", &self.def_id, "bounds",
&self.bounds, "origin", &self.origin, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for OpaqueTy<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for OpaqueTy<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
let _: ::core::clone::AssertParamIsClone<OpaqueTyOrigin<LocalDefId>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for OpaqueTy<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
OpaqueTy<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
OpaqueTy {
hir_id: ref __binding_0,
def_id: ref __binding_1,
bounds: ref __binding_2,
origin: ref __binding_3,
span: ref __binding_4 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3430pub struct OpaqueTy<'hir> {
3431 #[stable_hash(ignore)]
3432 pub hir_id: HirId,
3433 pub def_id: LocalDefId,
3434 pub bounds: GenericBounds<'hir>,
3435 pub origin: OpaqueTyOrigin<LocalDefId>,
3436 pub span: Span,
3437}
3438
3439#[derive(#[automatically_derived]
impl<T: ::core::fmt::Debug, U: ::core::fmt::Debug> ::core::fmt::Debug for
PreciseCapturingArgKind<T, U> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Lifetime(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Lifetime", &__self_0),
Self::Param(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Param",
&__self_0),
}
}
}Debug, #[automatically_derived]
impl<T: ::core::clone::Clone, U: ::core::clone::Clone> ::core::clone::Clone
for PreciseCapturingArgKind<T, U> {
#[inline]
fn clone(&self) -> Self {
match self {
Self::Lifetime(__self_0) =>
PreciseCapturingArgKind::Lifetime(::core::clone::Clone::clone(__self_0)),
Self::Param(__self_0) =>
PreciseCapturingArgKind::Param(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<T: ::core::marker::Copy, U: ::core::marker::Copy> ::core::marker::Copy
for PreciseCapturingArgKind<T, U> {
}Copy, const _: () =
{
impl<T, U> ::rustc_data_structures::stable_hash::StableHash for
PreciseCapturingArgKind<T, U> where
T: ::rustc_data_structures::stable_hash::StableHash,
U: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
PreciseCapturingArgKind::Lifetime(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
PreciseCapturingArgKind::Param(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<T, U, __E: ::rustc_span::SpanEncoder>
::rustc_serialize::Encodable<__E> for
PreciseCapturingArgKind<T, U> where
T: ::rustc_serialize::Encodable<__E>,
U: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
PreciseCapturingArgKind::Lifetime(ref __binding_0) => {
0usize
}
PreciseCapturingArgKind::Param(ref __binding_0) => {
1usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
PreciseCapturingArgKind::Lifetime(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
PreciseCapturingArgKind::Param(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<T, U, __D: ::rustc_span::SpanDecoder>
::rustc_serialize::Decodable<__D> for
PreciseCapturingArgKind<T, U> where
T: ::rustc_serialize::Decodable<__D>,
U: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
PreciseCapturingArgKind::Lifetime(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
PreciseCapturingArgKind::Param(::rustc_serialize::Decodable::decode(__decoder))
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `PreciseCapturingArgKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
3440pub enum PreciseCapturingArgKind<T, U> {
3441 Lifetime(T),
3442 Param(U),
3444}
3445
3446pub type PreciseCapturingArg<'hir> =
3447 PreciseCapturingArgKind<&'hir Lifetime, PreciseCapturingNonLifetimeArg>;
3448
3449impl PreciseCapturingArg<'_> {
3450 pub fn hir_id(self) -> HirId {
3451 match self {
3452 PreciseCapturingArg::Lifetime(lt) => lt.hir_id,
3453 PreciseCapturingArg::Param(param) => param.hir_id,
3454 }
3455 }
3456
3457 pub fn name(self) -> Symbol {
3458 match self {
3459 PreciseCapturingArg::Lifetime(lt) => lt.ident.name,
3460 PreciseCapturingArg::Param(param) => param.ident.name,
3461 }
3462 }
3463}
3464
3465#[derive(#[automatically_derived]
impl ::core::fmt::Debug for PreciseCapturingNonLifetimeArg {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"PreciseCapturingNonLifetimeArg", "hir_id", &self.hir_id, "ident",
&self.ident, "res", &&self.res)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for PreciseCapturingNonLifetimeArg { }
#[automatically_derived]
impl ::core::clone::Clone for PreciseCapturingNonLifetimeArg {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<Res>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for PreciseCapturingNonLifetimeArg { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
PreciseCapturingNonLifetimeArg {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PreciseCapturingNonLifetimeArg {
hir_id: ref __binding_0,
ident: ref __binding_1,
res: ref __binding_2 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3470pub struct PreciseCapturingNonLifetimeArg {
3471 #[stable_hash(ignore)]
3472 pub hir_id: HirId,
3473 pub ident: Ident,
3474 pub res: Res,
3475}
3476
3477#[derive(#[automatically_derived]
impl ::core::marker::Copy for RpitContext { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for RpitContext { }
#[automatically_derived]
impl ::core::clone::Clone for RpitContext {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for RpitContext { }
#[automatically_derived]
impl ::core::cmp::PartialEq for RpitContext {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for RpitContext { }Eq, #[automatically_derived]
impl ::core::fmt::Debug for RpitContext {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
RpitContext::Trait => "Trait",
RpitContext::TraitImpl => "TraitImpl",
})
}
}Debug)]
3478#[derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for RpitContext
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
RpitContext::Trait => {}
RpitContext::TraitImpl => {}
}
}
}
};StableHash, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for RpitContext {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
RpitContext::Trait => { 0usize }
RpitContext::TraitImpl => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for RpitContext {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { RpitContext::Trait }
1usize => { RpitContext::TraitImpl }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `RpitContext`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable)]
3479pub enum RpitContext {
3480 Trait,
3481 TraitImpl,
3482}
3483
3484#[derive(#[automatically_derived]
impl<D: ::core::marker::Copy> ::core::marker::Copy for OpaqueTyOrigin<D> { }Copy, #[automatically_derived]
impl<D: ::core::clone::Clone> ::core::clone::Clone for OpaqueTyOrigin<D> {
#[inline]
fn clone(&self) -> Self {
match self {
Self::FnReturn { parent: __self_0, in_trait_or_impl: __self_1 } =>
OpaqueTyOrigin::FnReturn {
parent: ::core::clone::Clone::clone(__self_0),
in_trait_or_impl: ::core::clone::Clone::clone(__self_1),
},
Self::AsyncFn { parent: __self_0, in_trait_or_impl: __self_1 } =>
OpaqueTyOrigin::AsyncFn {
parent: ::core::clone::Clone::clone(__self_0),
in_trait_or_impl: ::core::clone::Clone::clone(__self_1),
},
Self::TyAlias { parent: __self_0, in_assoc_ty: __self_1 } =>
OpaqueTyOrigin::TyAlias {
parent: ::core::clone::Clone::clone(__self_0),
in_assoc_ty: ::core::clone::Clone::clone(__self_1),
},
}
}
}Clone, #[automatically_derived]
impl<D: ::core::cmp::PartialEq> ::core::marker::StructuralPartialEq for
OpaqueTyOrigin<D> {
}
#[automatically_derived]
impl<D: ::core::cmp::PartialEq> ::core::cmp::PartialEq for OpaqueTyOrigin<D> {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::FnReturn { parent: __self_0, in_trait_or_impl: __self_1
}, Self::FnReturn {
parent: __arg1_0, in_trait_or_impl: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::AsyncFn { parent: __self_0, in_trait_or_impl: __self_1
}, Self::AsyncFn {
parent: __arg1_0, in_trait_or_impl: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(Self::TyAlias { parent: __self_0, in_assoc_ty: __self_1 },
Self::TyAlias { parent: __arg1_0, in_assoc_ty: __arg1_1 })
=> __self_1 == __arg1_1 && __self_0 == __arg1_0,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl<D: ::core::cmp::Eq> ::core::cmp::Eq for OpaqueTyOrigin<D> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<D>;
let _: ::core::cmp::AssertParamIsEq<Option<RpitContext>>;
let _: ::core::cmp::AssertParamIsEq<Option<RpitContext>>;
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]
impl<D: ::core::fmt::Debug> ::core::fmt::Debug for OpaqueTyOrigin<D> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::FnReturn { parent: __self_0, in_trait_or_impl: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"FnReturn", "parent", __self_0, "in_trait_or_impl",
&__self_1),
Self::AsyncFn { parent: __self_0, in_trait_or_impl: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"AsyncFn", "parent", __self_0, "in_trait_or_impl",
&__self_1),
Self::TyAlias { parent: __self_0, in_assoc_ty: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TyAlias", "parent", __self_0, "in_assoc_ty", &__self_1),
}
}
}Debug)]
3486#[derive(const _: () =
{
impl<D> ::rustc_data_structures::stable_hash::StableHash for
OpaqueTyOrigin<D> where
D: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
OpaqueTyOrigin::FnReturn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
OpaqueTyOrigin::AsyncFn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
OpaqueTyOrigin::TyAlias {
parent: ref __binding_0, in_assoc_ty: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, const _: () =
{
impl<D, __E: ::rustc_span::SpanEncoder>
::rustc_serialize::Encodable<__E> for OpaqueTyOrigin<D> where
D: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
OpaqueTyOrigin::FnReturn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
0usize
}
OpaqueTyOrigin::AsyncFn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
1usize
}
OpaqueTyOrigin::TyAlias {
parent: ref __binding_0, in_assoc_ty: ref __binding_1 } => {
2usize
}
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
OpaqueTyOrigin::FnReturn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
OpaqueTyOrigin::AsyncFn {
parent: ref __binding_0, in_trait_or_impl: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
OpaqueTyOrigin::TyAlias {
parent: ref __binding_0, in_assoc_ty: ref __binding_1 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
}
}
};Encodable, const _: () =
{
impl<D, __D: ::rustc_span::SpanDecoder>
::rustc_serialize::Decodable<__D> for OpaqueTyOrigin<D> where
D: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
OpaqueTyOrigin::FnReturn {
parent: ::rustc_serialize::Decodable::decode(__decoder),
in_trait_or_impl: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => {
OpaqueTyOrigin::AsyncFn {
parent: ::rustc_serialize::Decodable::decode(__decoder),
in_trait_or_impl: ::rustc_serialize::Decodable::decode(__decoder),
}
}
2usize => {
OpaqueTyOrigin::TyAlias {
parent: ::rustc_serialize::Decodable::decode(__decoder),
in_assoc_ty: ::rustc_serialize::Decodable::decode(__decoder),
}
}
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `OpaqueTyOrigin`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
3487pub enum OpaqueTyOrigin<D> {
3488 FnReturn {
3490 parent: D,
3492 in_trait_or_impl: Option<RpitContext>,
3494 },
3495 AsyncFn {
3497 parent: D,
3499 in_trait_or_impl: Option<RpitContext>,
3501 },
3502 TyAlias {
3504 parent: D,
3506 in_assoc_ty: bool,
3508 },
3509}
3510
3511#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DelegationSelfTyPropagationKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::SelfTy(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "SelfTy",
&__self_0),
Self::SelfParam =>
::core::fmt::Formatter::write_str(f, "SelfParam"),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DelegationSelfTyPropagationKind {
}
#[automatically_derived]
impl ::core::clone::Clone for DelegationSelfTyPropagationKind {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DelegationSelfTyPropagationKind { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DelegationSelfTyPropagationKind {
}
#[automatically_derived]
impl ::core::cmp::PartialEq for DelegationSelfTyPropagationKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::SelfTy(__self_0), Self::SelfTy(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DelegationSelfTyPropagationKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<HirId>;
}
}Eq, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
DelegationSelfTyPropagationKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
DelegationSelfTyPropagationKind::SelfTy(ref __binding_0) =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
DelegationSelfTyPropagationKind::SelfParam => {}
}
}
}
};StableHash)]
3512pub enum DelegationSelfTyPropagationKind {
3513 SelfTy(HirId ),
3516 SelfParam,
3519}
3520
3521#[derive(#[automatically_derived]
impl ::core::fmt::Debug for DelegationInfo {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["call_expr_id", "call_path_res", "child_seg_id",
"parent_seg_id_for_sig", "child_seg_id_for_sig",
"self_ty_propagation_kind", "group_id", "arguments_to_map"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.call_expr_id, &self.call_path_res, &self.child_seg_id,
&self.parent_seg_id_for_sig, &self.child_seg_id_for_sig,
&self.self_ty_propagation_kind, &self.group_id,
&&self.arguments_to_map];
::core::fmt::Formatter::debug_struct_fields_finish(f,
"DelegationInfo", names, values)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
DelegationInfo {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
DelegationInfo {
call_expr_id: ref __binding_0,
call_path_res: ref __binding_1,
child_seg_id: ref __binding_2,
parent_seg_id_for_sig: ref __binding_3,
child_seg_id_for_sig: ref __binding_4,
self_ty_propagation_kind: ref __binding_5,
group_id: ref __binding_6,
arguments_to_map: ref __binding_7 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3522pub struct DelegationInfo {
3523 pub call_expr_id: HirId,
3524 pub call_path_res: DefId,
3525
3526 pub child_seg_id: HirId,
3529
3530 pub parent_seg_id_for_sig: Option<HirId>,
3536 pub child_seg_id_for_sig: Option<HirId>,
3537
3538 pub self_ty_propagation_kind: Option<DelegationSelfTyPropagationKind>,
3539 pub group_id: Option<(LocalExpnId, bool )>,
3540
3541 pub arguments_to_map: FxIndexSet<usize>,
3542}
3543
3544#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for InferDelegationSig<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Input(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Input",
&__self_0),
Self::Output(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Output",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for InferDelegationSig<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for InferDelegationSig<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<usize>;
let _: ::core::clone::AssertParamIsClone<&'hir DelegationInfo>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for InferDelegationSig<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
InferDelegationSig<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
InferDelegationSig::Input(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InferDelegationSig::Output(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3545pub enum InferDelegationSig<'hir> {
3546 Input(usize),
3547 Output(&'hir DelegationInfo),
3549}
3550
3551#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for InferDelegation<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::DefId(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "DefId",
&__self_0),
Self::Sig(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Sig",
__self_0, &__self_1),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for InferDelegation<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for InferDelegation<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<InferDelegationSig<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for InferDelegation<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
InferDelegation<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
InferDelegation::DefId(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InferDelegation::Sig(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3552pub enum InferDelegation<'hir> {
3553 DefId(DefId),
3556 Sig(DefId, InferDelegationSig<'hir>),
3558}
3559
3560#[repr(u8, C)]
3566#[derive(#[automatically_derived]
impl<'hir, Unambig: ::core::fmt::Debug> ::core::fmt::Debug for
TyKind<'hir, Unambig> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::InferDelegation(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"InferDelegation", &__self_0),
Self::Slice(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Slice",
&__self_0),
Self::Array(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Array",
__self_0, &__self_1),
Self::Ptr(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Ptr",
__self_0, &__self_1),
Self::Ref(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Ref",
__self_0, __self_1, &__self_2),
Self::FnPtr(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "FnPtr",
&__self_0),
Self::UnsafeBinder(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"UnsafeBinder", &__self_0),
Self::Never => ::core::fmt::Formatter::write_str(f, "Never"),
Self::Tup(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Tup",
&__self_0),
Self::Path(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Path",
&__self_0),
Self::OpaqueDef(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"OpaqueDef", &__self_0),
Self::TraitAscription(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TraitAscription", &__self_0),
Self::TraitObject(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"TraitObject", __self_0, &__self_1),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
&__self_0),
Self::Pat(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Pat",
__self_0, &__self_1),
Self::FieldOf(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"FieldOf", __self_0, &__self_1),
Self::View(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "View",
__self_0, &__self_1),
Self::Infer(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Infer",
&__self_0),
}
}
}Debug, #[automatically_derived]
impl<'hir, Unambig: ::core::clone::Clone> ::core::clone::Clone for
TyKind<'hir, Unambig> {
#[inline]
fn clone(&self) -> Self {
match self {
Self::InferDelegation(__self_0) =>
TyKind::InferDelegation(::core::clone::Clone::clone(__self_0)),
Self::Slice(__self_0) =>
TyKind::Slice(::core::clone::Clone::clone(__self_0)),
Self::Array(__self_0, __self_1) =>
TyKind::Array(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Ptr(__self_0, __self_1) =>
TyKind::Ptr(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Ref(__self_0, __self_1, __self_2) =>
TyKind::Ref(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2)),
Self::FnPtr(__self_0) =>
TyKind::FnPtr(::core::clone::Clone::clone(__self_0)),
Self::UnsafeBinder(__self_0) =>
TyKind::UnsafeBinder(::core::clone::Clone::clone(__self_0)),
Self::Never => TyKind::Never,
Self::Tup(__self_0) =>
TyKind::Tup(::core::clone::Clone::clone(__self_0)),
Self::Path(__self_0) =>
TyKind::Path(::core::clone::Clone::clone(__self_0)),
Self::OpaqueDef(__self_0) =>
TyKind::OpaqueDef(::core::clone::Clone::clone(__self_0)),
Self::TraitAscription(__self_0) =>
TyKind::TraitAscription(::core::clone::Clone::clone(__self_0)),
Self::TraitObject(__self_0, __self_1) =>
TyKind::TraitObject(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Err(__self_0) =>
TyKind::Err(::core::clone::Clone::clone(__self_0)),
Self::Pat(__self_0, __self_1) =>
TyKind::Pat(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::FieldOf(__self_0, __self_1) =>
TyKind::FieldOf(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::View(__self_0, __self_1) =>
TyKind::View(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Self::Infer(__self_0) =>
TyKind::Infer(::core::clone::Clone::clone(__self_0)),
}
}
}Clone, #[automatically_derived]
impl<'hir, Unambig: ::core::marker::Copy> ::core::marker::Copy for
TyKind<'hir, Unambig> {
}Copy, const _: () =
{
impl<'hir, Unambig> ::rustc_data_structures::stable_hash::StableHash
for TyKind<'hir, Unambig> where
Unambig: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
TyKind::InferDelegation(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Slice(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Array(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Ptr(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Ref(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
TyKind::FnPtr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::UnsafeBinder(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Never => {}
TyKind::Tup(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Path(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::OpaqueDef(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::TraitAscription(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::TraitObject(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TyKind::Pat(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::FieldOf(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::View(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TyKind::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3567pub enum TyKind<'hir, Unambig = ()> {
3568 InferDelegation(InferDelegation<'hir>),
3570 Slice(&'hir Ty<'hir>),
3572 Array(&'hir Ty<'hir>, &'hir ConstArg<'hir>),
3574 Ptr(&'hir Ty<'hir>, Mutability),
3576 Ref(&'hir Lifetime, &'hir Ty<'hir>, Mutability),
3578 FnPtr(&'hir FnPtrTy<'hir>),
3580 UnsafeBinder(&'hir UnsafeBinderTy<'hir>),
3582 Never,
3584 Tup(&'hir [Ty<'hir>]),
3586 Path(QPath<'hir>),
3591 OpaqueDef(&'hir OpaqueTy<'hir>),
3593 TraitAscription(GenericBounds<'hir>),
3595 TraitObject(&'hir [PolyTraitRef<'hir>], TaggedRef<'hir, Lifetime, TraitObjectSyntax>),
3601 Err(rustc_span::ErrorGuaranteed),
3603 Pat(&'hir Ty<'hir>, &'hir TyPat<'hir>),
3605 FieldOf(&'hir Ty<'hir>, &'hir TyFieldPath),
3609 View(&'hir Ty<'hir>, &'hir [Ident]),
3611 Infer(Unambig),
3617}
3618
3619#[derive(#[automatically_derived]
impl ::core::fmt::Debug for InlineAsmRegOrRegClass {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Reg { reg: __self_0, source_name: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "Reg",
"reg", __self_0, "source_name", &__self_1),
Self::RegClass(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"RegClass", &__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for InlineAsmRegOrRegClass { }
#[automatically_derived]
impl ::core::clone::Clone for InlineAsmRegOrRegClass {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<asm::InlineAsmReg>;
let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
let _: ::core::clone::AssertParamIsClone<asm::InlineAsmRegClass>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for InlineAsmRegOrRegClass { }Copy, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
InlineAsmRegOrRegClass {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
InlineAsmRegOrRegClass::Reg {
reg: ref __binding_0, source_name: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
InlineAsmRegOrRegClass::RegClass(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3622pub enum InlineAsmRegOrRegClass {
3623 Reg { reg: asm::InlineAsmReg, source_name: Option<Symbol> },
3624 RegClass(asm::InlineAsmRegClass),
3625}
3626
3627impl InlineAsmRegOrRegClass {
3628 pub fn as_target(self) -> asm::InlineAsmRegOrRegClass {
3630 match self {
3631 Self::Reg { reg, .. } => asm::InlineAsmRegOrRegClass::Reg(reg),
3632 Self::RegClass(reg_class) => asm::InlineAsmRegOrRegClass::RegClass(reg_class),
3633 }
3634 }
3635
3636 pub fn reg_class(self) -> asm::InlineAsmRegClass {
3638 self.as_target().reg_class()
3639 }
3640
3641 pub fn source_name(self) -> Option<Symbol> {
3643 match self {
3644 Self::Reg { source_name, .. } => source_name,
3645 Self::RegClass(_) => None,
3646 }
3647 }
3648}
3649
3650impl fmt::Display for InlineAsmRegOrRegClass {
3652 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3653 self.as_target().fmt(f)
3654 }
3655}
3656
3657#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for InlineAsmOperand<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::In { reg: __self_0, expr: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f, "In",
"reg", __self_0, "expr", &__self_1),
Self::Out { reg: __self_0, late: __self_1, expr: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "Out",
"reg", __self_0, "late", __self_1, "expr", &__self_2),
Self::InOut { reg: __self_0, late: __self_1, expr: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f, "InOut",
"reg", __self_0, "late", __self_1, "expr", &__self_2),
Self::SplitInOut {
reg: __self_0,
late: __self_1,
in_expr: __self_2,
out_expr: __self_3 } =>
::core::fmt::Formatter::debug_struct_field4_finish(f,
"SplitInOut", "reg", __self_0, "late", __self_1, "in_expr",
__self_2, "out_expr", &__self_3),
Self::Const { anon_const: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
"anon_const", &__self_0),
Self::SymFn { expr: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "SymFn",
"expr", &__self_0),
Self::SymStatic { path: __self_0, def_id: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"SymStatic", "path", __self_0, "def_id", &__self_1),
Self::Label { block: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Label",
"block", &__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for InlineAsmOperand<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for InlineAsmOperand<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<InlineAsmRegOrRegClass>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir Expr<'hir>>>;
let _: ::core::clone::AssertParamIsClone<ConstBlock>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<QPath<'hir>>;
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<&'hir Block<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for InlineAsmOperand<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
InlineAsmOperand<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
InlineAsmOperand::In {
reg: ref __binding_0, expr: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Out {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::InOut {
reg: ref __binding_0,
late: ref __binding_1,
expr: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SplitInOut {
reg: ref __binding_0,
late: ref __binding_1,
in_expr: ref __binding_2,
out_expr: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Const { anon_const: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SymFn { expr: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::SymStatic {
path: ref __binding_0, def_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
InlineAsmOperand::Label { block: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3658pub enum InlineAsmOperand<'hir> {
3659 In {
3660 reg: InlineAsmRegOrRegClass,
3661 expr: &'hir Expr<'hir>,
3662 },
3663 Out {
3664 reg: InlineAsmRegOrRegClass,
3665 late: bool,
3666 expr: Option<&'hir Expr<'hir>>,
3667 },
3668 InOut {
3669 reg: InlineAsmRegOrRegClass,
3670 late: bool,
3671 expr: &'hir Expr<'hir>,
3672 },
3673 SplitInOut {
3674 reg: InlineAsmRegOrRegClass,
3675 late: bool,
3676 in_expr: &'hir Expr<'hir>,
3677 out_expr: Option<&'hir Expr<'hir>>,
3678 },
3679 Const {
3680 anon_const: ConstBlock,
3681 },
3682 SymFn {
3683 expr: &'hir Expr<'hir>,
3684 },
3685 SymStatic {
3686 path: QPath<'hir>,
3687 def_id: DefId,
3688 },
3689 Label {
3690 block: &'hir Block<'hir>,
3691 },
3692}
3693
3694impl<'hir> InlineAsmOperand<'hir> {
3695 pub fn reg(&self) -> Option<InlineAsmRegOrRegClass> {
3696 match *self {
3697 Self::In { reg, .. }
3698 | Self::Out { reg, .. }
3699 | Self::InOut { reg, .. }
3700 | Self::SplitInOut { reg, .. } => Some(reg),
3701 Self::Const { .. }
3702 | Self::SymFn { .. }
3703 | Self::SymStatic { .. }
3704 | Self::Label { .. } => None,
3705 }
3706 }
3707
3708 pub fn is_clobber(&self) -> bool {
3709 #[allow(non_exhaustive_omitted_patterns)] match self {
InlineAsmOperand::Out {
reg: InlineAsmRegOrRegClass::Reg { .. }, expr: None, .. } => true,
_ => false,
}matches!(
3710 self,
3711 InlineAsmOperand::Out { reg: InlineAsmRegOrRegClass::Reg { .. }, expr: None, .. }
3712 )
3713 }
3714}
3715
3716#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for InlineAsm<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["asm_macro", "template", "template_strs", "operands", "options",
"line_spans"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.asm_macro, &self.template, &self.template_strs,
&self.operands, &self.options, &&self.line_spans];
::core::fmt::Formatter::debug_struct_fields_finish(f, "InlineAsm",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for InlineAsm<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for InlineAsm<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<ast::AsmMacro>;
let _:
::core::clone::AssertParamIsClone<&'hir [InlineAsmTemplatePiece]>;
let _:
::core::clone::AssertParamIsClone<&'hir [(Symbol,
Option<Symbol>, Span)]>;
let _:
::core::clone::AssertParamIsClone<&'hir [(InlineAsmOperand<'hir>,
Span)]>;
let _: ::core::clone::AssertParamIsClone<InlineAsmOptions>;
let _: ::core::clone::AssertParamIsClone<&'hir [Span]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for InlineAsm<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
InlineAsm<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
InlineAsm {
asm_macro: ref __binding_0,
template: ref __binding_1,
template_strs: ref __binding_2,
operands: ref __binding_3,
options: ref __binding_4,
line_spans: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3717pub struct InlineAsm<'hir> {
3718 pub asm_macro: ast::AsmMacro,
3719 pub template: &'hir [InlineAsmTemplatePiece],
3720 pub template_strs: &'hir [(Symbol, Option<Symbol>, Span)],
3721 pub operands: &'hir [(InlineAsmOperand<'hir>, Span)],
3722 pub options: InlineAsmOptions,
3723 pub line_spans: &'hir [Span],
3724}
3725
3726impl InlineAsm<'_> {
3727 pub fn contains_label(&self) -> bool {
3728 self.operands.iter().any(|x| #[allow(non_exhaustive_omitted_patterns)] match x.0 {
InlineAsmOperand::Label { .. } => true,
_ => false,
}matches!(x.0, InlineAsmOperand::Label { .. }))
3729 }
3730}
3731
3732#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Param<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "Param",
"hir_id", &self.hir_id, "pat", &self.pat, "ty_span",
&self.ty_span, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Param<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Param<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Param<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Param<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Param {
hir_id: ref __binding_0,
pat: ref __binding_1,
ty_span: ref __binding_2,
span: ref __binding_3 } => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3734pub struct Param<'hir> {
3735 #[stable_hash(ignore)]
3736 pub hir_id: HirId,
3737 pub pat: &'hir Pat<'hir>,
3738 pub ty_span: Span,
3739 pub span: Span,
3740}
3741
3742#[derive(#[automatically_derived]
impl ::core::fmt::Debug for SplattedArgIndexError {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::InvalidIndex { splatted_arg_index: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"InvalidIndex", "splatted_arg_index", &__self_0),
Self::OutOfBounds {
splatted_arg_index: __self_0, args_len: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"OutOfBounds", "splatted_arg_index", __self_0, "args_len",
&__self_1),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for SplattedArgIndexError { }
#[automatically_derived]
impl ::core::clone::Clone for SplattedArgIndexError {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u8>;
let _: ::core::clone::AssertParamIsClone<u16>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for SplattedArgIndexError { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for SplattedArgIndexError { }
#[automatically_derived]
impl ::core::cmp::PartialEq for SplattedArgIndexError {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::InvalidIndex { splatted_arg_index: __self_0 },
Self::InvalidIndex { splatted_arg_index: __arg1_0 }) =>
__self_0 == __arg1_0,
(Self::OutOfBounds {
splatted_arg_index: __self_0, args_len: __self_1 },
Self::OutOfBounds {
splatted_arg_index: __arg1_0, args_len: __arg1_1 }) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
_ => unsafe { ::core::intrinsics::unreachable() }
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for SplattedArgIndexError {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
let _: ::core::cmp::AssertParamIsEq<u16>;
}
}Eq)]
3744pub enum SplattedArgIndexError {
3745 InvalidIndex { splatted_arg_index: u8 },
3749
3750 OutOfBounds { splatted_arg_index: u8, args_len: u16 },
3752}
3753
3754#[derive(#[automatically_derived]
impl ::core::marker::Copy for FnDeclFlags { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FnDeclFlags { }
#[automatically_derived]
impl ::core::clone::Clone for FnDeclFlags {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for FnDeclFlags { }
#[automatically_derived]
impl ::core::cmp::PartialEq for FnDeclFlags {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.flags == other.flags && self.splatted == other.splatted
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for FnDeclFlags {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for FnDeclFlags {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for FnDeclFlags {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
match ::core::cmp::Ord::cmp(&self.flags, &other.flags) {
::core::cmp::Ordering::Equal =>
::core::cmp::Ord::cmp(&self.splatted, &other.splatted),
cmp => cmp,
}
}
}Ord, #[automatically_derived]
impl ::core::hash::Hash for FnDeclFlags {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.flags, state);
::core::hash::Hash::hash(&self.splatted, state)
}
}Hash)]
3756#[derive(const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for FnDeclFlags {
fn encode(&self, __encoder: &mut __E) {
let FnDeclFlags {
flags: ref __binding_0, splatted: ref __binding_1 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for FnDeclFlags {
fn decode(__decoder: &mut __D) -> Self {
FnDeclFlags {
flags: ::rustc_serialize::Decodable::decode(__decoder),
splatted: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for FnDeclFlags
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnDeclFlags {
flags: ref __binding_0, splatted: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3757pub struct FnDeclFlags {
3758 flags: u8,
3760
3761 splatted: u8,
3765}
3766
3767impl fmt::Debug for FnDeclFlags {
3768 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3769 let mut f = f.debug_tuple("FnDeclFlags");
3770 f.field(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("ImplicitSelfKind({0:?})",
self.implicit_self()))
})format!("ImplicitSelfKind({:?})", self.implicit_self()));
3771
3772 if self.lifetime_elision_allowed() {
3773 f.field(&"LifetimeElisionAllowed");
3774 } else {
3775 f.field(&"NoLifetimeElision");
3776 }
3777
3778 if self.c_variadic() {
3779 f.field(&"CVariadic");
3780 }
3781
3782 if let Some(index) = self.splatted() {
3783 f.field(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Splatted({0})", index))
})format!("Splatted({})", index));
3784 }
3785
3786 f.finish()
3787 }
3788}
3789
3790impl FnDeclFlags {
3791 const IMPLICIT_SELF_MASK: u8 = 0b111;
3793
3794 const C_VARIADIC_FLAG: u8 = 1 << 3;
3796
3797 const LIFETIME_ELISION_ALLOWED_FLAG: u8 = 1 << 4;
3799
3800 const NO_SPLATTED_ARG_INDEX: u8 = u8::MAX;
3803
3804 pub fn default() -> Self {
3809 Self { flags: 0, splatted: 0 }
3810 .set_implicit_self(ImplicitSelfKind::None)
3811 .set_lifetime_elision_allowed(false)
3812 .set_c_variadic(false)
3813 .set_no_splatted_args()
3814 }
3815
3816 #[must_use = "this method does not modify the receiver"]
3818 pub fn set_implicit_self(mut self, implicit_self: ImplicitSelfKind) -> Self {
3819 self.flags &= !Self::IMPLICIT_SELF_MASK;
3820
3821 match implicit_self {
3822 ImplicitSelfKind::None => self.flags |= 0,
3823 ImplicitSelfKind::Imm => self.flags |= 1,
3824 ImplicitSelfKind::Mut => self.flags |= 2,
3825 ImplicitSelfKind::RefImm => self.flags |= 3,
3826 ImplicitSelfKind::RefMut => self.flags |= 4,
3827 }
3828
3829 self
3830 }
3831
3832 #[must_use = "this method does not modify the receiver"]
3834 pub fn set_c_variadic(mut self, c_variadic: bool) -> Self {
3835 if c_variadic {
3836 self.flags |= Self::C_VARIADIC_FLAG;
3837 } else {
3838 self.flags &= !Self::C_VARIADIC_FLAG;
3839 }
3840
3841 self
3842 }
3843
3844 #[must_use = "this method does not modify the receiver"]
3846 pub fn set_lifetime_elision_allowed(mut self, allowed: bool) -> Self {
3847 if allowed {
3848 self.flags |= Self::LIFETIME_ELISION_ALLOWED_FLAG;
3849 } else {
3850 self.flags &= !Self::LIFETIME_ELISION_ALLOWED_FLAG;
3851 }
3852
3853 self
3854 }
3855
3856 #[must_use = "this method does not modify the receiver"]
3859 pub fn set_splatted(
3860 mut self,
3861 splatted: Option<u8>,
3862 args_len: usize,
3863 ) -> Result<Self, SplattedArgIndexError> {
3864 if let Some(splatted_arg_index) = splatted {
3865 if splatted_arg_index == Self::NO_SPLATTED_ARG_INDEX {
3866 return Err(SplattedArgIndexError::InvalidIndex { splatted_arg_index });
3869 } else if usize::from(splatted_arg_index) >= args_len {
3870 return Err(SplattedArgIndexError::OutOfBounds {
3871 splatted_arg_index,
3872 args_len: args_len as u16,
3873 });
3874 }
3875
3876 self.splatted = splatted_arg_index;
3877 } else {
3878 self.splatted = Self::NO_SPLATTED_ARG_INDEX;
3879 }
3880
3881 Ok(self)
3882 }
3883
3884 #[must_use = "this method does not modify the receiver"]
3886 pub fn set_no_splatted_args(mut self) -> Self {
3887 self.splatted = Self::NO_SPLATTED_ARG_INDEX;
3888
3889 self
3890 }
3891
3892 pub fn implicit_self(self) -> ImplicitSelfKind {
3894 match self.flags & Self::IMPLICIT_SELF_MASK {
3895 0 => ImplicitSelfKind::None,
3896 1 => ImplicitSelfKind::Imm,
3897 2 => ImplicitSelfKind::Mut,
3898 3 => ImplicitSelfKind::RefImm,
3899 4 => ImplicitSelfKind::RefMut,
3900 _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
3901 }
3902 }
3903
3904 pub fn c_variadic(self) -> bool {
3906 self.flags & Self::C_VARIADIC_FLAG != 0
3907 }
3908
3909 pub fn lifetime_elision_allowed(self) -> bool {
3911 self.flags & Self::LIFETIME_ELISION_ALLOWED_FLAG != 0
3912 }
3913
3914 pub fn splatted(self) -> Option<u8> {
3916 if self.splatted == Self::NO_SPLATTED_ARG_INDEX { None } else { Some(self.splatted) }
3917 }
3918}
3919
3920#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for FnDecl<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "FnDecl",
"inputs", &self.inputs, "output", &self.output, "fn_decl_kind",
&&self.fn_decl_kind)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for FnDecl<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for FnDecl<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Ty<'hir>]>;
let _: ::core::clone::AssertParamIsClone<FnRetTy<'hir>>;
let _: ::core::clone::AssertParamIsClone<FnDeclFlags>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for FnDecl<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FnDecl<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnDecl {
inputs: ref __binding_0,
output: ref __binding_1,
fn_decl_kind: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
3922pub struct FnDecl<'hir> {
3923 pub inputs: &'hir [Ty<'hir>],
3927 pub output: FnRetTy<'hir>,
3928 pub fn_decl_kind: FnDeclFlags,
3930}
3931
3932impl<'hir> FnDecl<'hir> {
3933 pub fn opt_delegation_sig_id(&self) -> Option<DefId> {
3934 if let FnRetTy::Return(ty) = self.output
3935 && let TyKind::InferDelegation(InferDelegation::Sig(sig_id, _)) = ty.kind
3936 {
3937 return Some(sig_id);
3938 }
3939 None
3940 }
3941
3942 pub fn opt_delegation_info(&self) -> Option<&'hir DelegationInfo> {
3943 if let FnRetTy::Return(ty) = self.output
3944 && let TyKind::InferDelegation(InferDelegation::Sig(_, kind)) = ty.kind
3945 && let InferDelegationSig::Output(generics) = kind
3946 {
3947 return Some(generics);
3948 }
3949
3950 None
3951 }
3952
3953 pub fn implicit_self(&self) -> ImplicitSelfKind {
3954 self.fn_decl_kind.implicit_self()
3955 }
3956
3957 pub fn c_variadic(&self) -> bool {
3958 self.fn_decl_kind.c_variadic()
3959 }
3960
3961 pub fn lifetime_elision_allowed(&self) -> bool {
3962 self.fn_decl_kind.lifetime_elision_allowed()
3963 }
3964
3965 pub fn splatted(&self) -> Option<u8> {
3966 self.fn_decl_kind.splatted()
3967 }
3968
3969 pub fn dummy(span: Span) -> Self {
3970 Self {
3971 inputs: &[],
3972 output: FnRetTy::DefaultReturn(span),
3973 fn_decl_kind: FnDeclFlags::default().set_lifetime_elision_allowed(true),
3974 }
3975 }
3976}
3977
3978#[derive(#[automatically_derived]
impl ::core::marker::Copy for ImplicitSelfKind { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ImplicitSelfKind { }
#[automatically_derived]
impl ::core::clone::Clone for ImplicitSelfKind {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ImplicitSelfKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ImplicitSelfKind {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ImplicitSelfKind { }Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ImplicitSelfKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
ImplicitSelfKind::Imm => { 0usize }
ImplicitSelfKind::Mut => { 1usize }
ImplicitSelfKind::RefImm => { 2usize }
ImplicitSelfKind::RefMut => { 3usize }
ImplicitSelfKind::None => { 4usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ImplicitSelfKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { ImplicitSelfKind::Imm }
1usize => { ImplicitSelfKind::Mut }
2usize => { ImplicitSelfKind::RefImm }
3usize => { ImplicitSelfKind::RefMut }
4usize => { ImplicitSelfKind::None }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `ImplicitSelfKind`, expected 0..5, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ImplicitSelfKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_c_like_enum_write_str(f,
"Imm Mut RefImm RefMut None",
match self {
ImplicitSelfKind::Imm => 0usize,
ImplicitSelfKind::Mut => 4usize,
ImplicitSelfKind::RefImm => 8usize,
ImplicitSelfKind::RefMut => 15usize,
ImplicitSelfKind::None => 22usize,
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ImplicitSelfKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ImplicitSelfKind::Imm => {}
ImplicitSelfKind::Mut => {}
ImplicitSelfKind::RefImm => {}
ImplicitSelfKind::RefMut => {}
ImplicitSelfKind::None => {}
}
}
}
};StableHash)]
3980pub enum ImplicitSelfKind {
3981 Imm,
3983 Mut,
3985 RefImm,
3987 RefMut,
3989 None,
3992}
3993
3994impl ImplicitSelfKind {
3995 pub fn has_implicit_self(&self) -> bool {
3997 !#[allow(non_exhaustive_omitted_patterns)] match *self {
ImplicitSelfKind::None => true,
_ => false,
}matches!(*self, ImplicitSelfKind::None)
3998 }
3999}
4000
4001#[derive(#[automatically_derived]
impl ::core::marker::Copy for IsAsync { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for IsAsync { }
#[automatically_derived]
impl ::core::clone::Clone for IsAsync {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for IsAsync { }
#[automatically_derived]
impl ::core::cmp::PartialEq for IsAsync {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Async(__self_0), Self::Async(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for IsAsync {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Span>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for IsAsync {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
IsAsync::Async(ref __binding_0) => { 0usize }
IsAsync::NotAsync => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
IsAsync::Async(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
IsAsync::NotAsync => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for IsAsync {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
IsAsync::Async(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => { IsAsync::NotAsync }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `IsAsync`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for IsAsync {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Async(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Async",
&__self_0),
Self::NotAsync =>
::core::fmt::Formatter::write_str(f, "NotAsync"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for IsAsync {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
IsAsync::Async(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
IsAsync::NotAsync => {}
}
}
}
};StableHash)]
4002pub enum IsAsync {
4003 Async(Span),
4004 NotAsync,
4005}
4006
4007impl IsAsync {
4008 pub fn is_async(self) -> bool {
4009 #[allow(non_exhaustive_omitted_patterns)] match self {
IsAsync::Async(_) => true,
_ => false,
}matches!(self, IsAsync::Async(_))
4010 }
4011}
4012
4013#[derive(#[automatically_derived]
impl ::core::marker::Copy for Defaultness { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Defaultness { }
#[automatically_derived]
impl ::core::clone::Clone for Defaultness {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Defaultness { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Defaultness {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Default { has_value: __self_0 }, Self::Default {
has_value: __arg1_0 }) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Defaultness {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for Defaultness {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Default { has_value: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Default", "has_value", &__self_0),
Self::Final => ::core::fmt::Formatter::write_str(f, "Final"),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Defaultness {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Defaultness::Default { has_value: ref __binding_0 } => {
0usize
}
Defaultness::Final => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Defaultness::Default { has_value: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Defaultness::Final => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Defaultness {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
Defaultness::Default {
has_value: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => { Defaultness::Final }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Defaultness`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Defaultness
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Defaultness::Default { has_value: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Defaultness::Final => {}
}
}
}
};StableHash)]
4014#[derive(#[automatically_derived]
impl ::core::default::Default for Defaultness {
#[inline]
fn default() -> Self { Self::Final }
}Default)]
4015pub enum Defaultness {
4016 Default {
4017 has_value: bool,
4018 },
4019 #[default]
4020 Final,
4021}
4022
4023impl Defaultness {
4024 pub fn has_value(&self) -> bool {
4025 match *self {
4026 Defaultness::Default { has_value } => has_value,
4027 Defaultness::Final => true,
4028 }
4029 }
4030
4031 pub fn is_final(&self) -> bool {
4032 *self == Defaultness::Final
4033 }
4034
4035 pub fn is_default(&self) -> bool {
4036 #[allow(non_exhaustive_omitted_patterns)] match *self {
Defaultness::Default { .. } => true,
_ => false,
}matches!(*self, Defaultness::Default { .. })
4037 }
4038}
4039
4040#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for FnRetTy<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::DefaultReturn(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"DefaultReturn", &__self_0),
Self::Return(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Return",
&__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for FnRetTy<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for FnRetTy<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for FnRetTy<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FnRetTy<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
FnRetTy::DefaultReturn(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
FnRetTy::Return(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4041pub enum FnRetTy<'hir> {
4042 DefaultReturn(Span),
4048 Return(&'hir Ty<'hir>),
4050}
4051
4052impl<'hir> FnRetTy<'hir> {
4053 #[inline]
4054 pub fn span(&self) -> Span {
4055 match *self {
4056 Self::DefaultReturn(span) => span,
4057 Self::Return(ref ty) => ty.span,
4058 }
4059 }
4060
4061 pub fn is_suggestable_infer_ty(&self) -> Option<&'hir Ty<'hir>> {
4062 if let Self::Return(ty) = self
4063 && ty.is_suggestable_infer_ty()
4064 {
4065 return Some(*ty);
4066 }
4067 None
4068 }
4069}
4070
4071#[derive(#[automatically_derived]
impl ::core::marker::Copy for ClosureBinder { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ClosureBinder { }
#[automatically_derived]
impl ::core::clone::Clone for ClosureBinder {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ClosureBinder {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Default => ::core::fmt::Formatter::write_str(f, "Default"),
Self::For { span: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "For",
"span", &__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ClosureBinder {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ClosureBinder::Default => {}
ClosureBinder::For { span: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4073pub enum ClosureBinder {
4074 Default,
4076 For { span: Span },
4080}
4081
4082#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Mod<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Mod", "spans",
&self.spans, "item_ids", &&self.item_ids)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Mod<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Mod<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<ModSpans>;
let _: ::core::clone::AssertParamIsClone<&'hir [ItemId]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Mod<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Mod<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Mod { spans: ref __binding_0, item_ids: ref __binding_1 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4083pub struct Mod<'hir> {
4084 pub spans: ModSpans,
4085 pub item_ids: &'hir [ItemId],
4086}
4087
4088#[derive(#[automatically_derived]
impl ::core::marker::Copy for ModSpans { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ModSpans { }
#[automatically_derived]
impl ::core::clone::Clone for ModSpans {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for ModSpans {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "ModSpans",
"inner_span", &self.inner_span, "inject_use_span",
&&self.inject_use_span)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ModSpans {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ModSpans {
inner_span: ref __binding_0,
inject_use_span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4089pub struct ModSpans {
4090 pub inner_span: Span,
4094 pub inject_use_span: Span,
4095}
4096
4097#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for EnumDef<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "EnumDef",
"variants", &&self.variants)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for EnumDef<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for EnumDef<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [Variant<'hir>]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for EnumDef<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
EnumDef<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
EnumDef { variants: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4098pub struct EnumDef<'hir> {
4099 pub variants: &'hir [Variant<'hir>],
4100}
4101
4102#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Variant<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["ident", "hir_id", "def_id", "data", "disr_expr", "span"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.ident, &self.hir_id, &self.def_id, &self.data,
&self.disr_expr, &&self.span];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Variant",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Variant<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Variant<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<VariantData<'hir>>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir AnonConst>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Variant<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Variant<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Variant {
ident: ref __binding_0,
hir_id: ref __binding_1,
def_id: ref __binding_2,
data: ref __binding_3,
disr_expr: ref __binding_4,
span: ref __binding_5 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{}
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4103pub struct Variant<'hir> {
4104 pub ident: Ident,
4106 #[stable_hash(ignore)]
4108 pub hir_id: HirId,
4109 pub def_id: LocalDefId,
4110 pub data: VariantData<'hir>,
4112 pub disr_expr: Option<&'hir AnonConst>,
4114 pub span: Span,
4116}
4117
4118#[derive(#[automatically_derived]
impl<'hir> ::core::marker::Copy for UseTree<'hir> { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for UseTree<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for UseTree<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir UsePath<'hir>>;
let _: ::core::clone::AssertParamIsClone<UseKind<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for UseTree<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "UseTree",
"prefix", &self.prefix, "kind", &&self.kind)
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
UseTree<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
UseTree { prefix: ref __binding_0, kind: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4119pub struct UseTree<'hir> {
4120 pub prefix: &'hir UsePath<'hir>,
4121 pub kind: UseKind<'hir>,
4122}
4123
4124impl UseTree<'_> {
4125 pub fn resolutions(&self) -> impl Iterator<Item = PerNS<Option<Res>>> {
4126 Box::new(std::iter::iter!(|| {
4127 match self.kind {
4128 UseKind::Glob => yield self.prefix.res,
4129 UseKind::Single(_) => yield self.prefix.res,
4130 UseKind::Nested { items } => {
4131 for (item, _, _) in items {
4132 for res in item.resolutions() {
4133 yield res;
4134 }
4135 }
4136 }
4137 }
4138 })())
4139 }
4140}
4141
4142#[derive(#[automatically_derived]
impl<'hir> ::core::marker::Copy for UseKind<'hir> { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for UseKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for UseKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _:
::core::clone::AssertParamIsClone<&'hir [(UseTree<'hir>,
HirId, LocalDefId)]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for UseKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Single(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Single",
&__self_0),
Self::Glob => ::core::fmt::Formatter::write_str(f, "Glob"),
Self::Nested { items: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Nested", "items", &__self_0),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
UseKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
UseKind::Single(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
UseKind::Glob => {}
UseKind::Nested { items: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4143pub enum UseKind<'hir> {
4144 Single(Ident),
4151
4152 Glob,
4154
4155 Nested { items: &'hir [(UseTree<'hir>, HirId, LocalDefId)] },
4157}
4158
4159#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TraitRef<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TraitRef<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Path<'hir>>;
let _: ::core::clone::AssertParamIsClone<HirId>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for TraitRef<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "TraitRef",
"path", &self.path, "hir_ref_id", &&self.hir_ref_id)
}
}Debug, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TraitRef<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitRef<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitRef {
path: ref __binding_0, hir_ref_id: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{}
}
}
}
}
};StableHash)]
4166pub struct TraitRef<'hir> {
4167 pub path: &'hir Path<'hir>,
4168 #[stable_hash(ignore)]
4170 pub hir_ref_id: HirId,
4171}
4172
4173impl TraitRef<'_> {
4174 pub fn trait_def_id(&self) -> Option<DefId> {
4176 match self.path.res {
4177 Res::Def(DefKind::Trait | DefKind::TraitAlias, did) => Some(did),
4178 Res::Err => None,
4179 res => {
::core::panicking::panic_fmt(format_args!("{0:?} did not resolve to a trait or trait alias",
res));
}panic!("{res:?} did not resolve to a trait or trait alias"),
4180 }
4181 }
4182}
4183
4184#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for PolyTraitRef<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for PolyTraitRef<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<TraitBoundModifiers>;
let _: ::core::clone::AssertParamIsClone<TraitRef<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for PolyTraitRef<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "PolyTraitRef",
"bound_generic_params", &self.bound_generic_params, "modifiers",
&self.modifiers, "trait_ref", &self.trait_ref, "span",
&&self.span)
}
}Debug, #[automatically_derived]
impl<'hir> ::core::marker::Copy for PolyTraitRef<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
PolyTraitRef<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PolyTraitRef {
bound_generic_params: ref __binding_0,
modifiers: ref __binding_1,
trait_ref: ref __binding_2,
span: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4185pub struct PolyTraitRef<'hir> {
4186 pub bound_generic_params: &'hir [GenericParam<'hir>],
4188
4189 pub modifiers: TraitBoundModifiers,
4193
4194 pub trait_ref: TraitRef<'hir>,
4196
4197 pub span: Span,
4198}
4199
4200#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for FieldDef<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
let names: &'static _ =
&["span", "vis_span", "mut_restriction", "ident", "hir_id",
"def_id", "ty", "safety", "default"];
let values: &[&dyn ::core::fmt::Debug] =
&[&self.span, &self.vis_span, &self.mut_restriction, &self.ident,
&self.hir_id, &self.def_id, &self.ty, &self.safety,
&&self.default];
::core::fmt::Formatter::debug_struct_fields_finish(f, "FieldDef",
names, values)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for FieldDef<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for FieldDef<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir MutRestriction<'hir>>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<Safety>;
let _: ::core::clone::AssertParamIsClone<Option<&'hir AnonConst>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for FieldDef<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
FieldDef<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FieldDef {
span: ref __binding_0,
vis_span: ref __binding_1,
mut_restriction: ref __binding_2,
ident: ref __binding_3,
hir_id: ref __binding_4,
def_id: ref __binding_5,
ty: ref __binding_6,
safety: ref __binding_7,
default: ref __binding_8 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{}
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
{ __binding_8.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4201pub struct FieldDef<'hir> {
4202 pub span: Span,
4203 pub vis_span: Span,
4204 pub mut_restriction: &'hir MutRestriction<'hir>,
4205 pub ident: Ident,
4206 #[stable_hash(ignore)]
4207 pub hir_id: HirId,
4208 pub def_id: LocalDefId,
4209 pub ty: &'hir Ty<'hir>,
4210 pub safety: Safety,
4211 pub default: Option<&'hir AnonConst>,
4212}
4213
4214impl FieldDef<'_> {
4215 pub fn is_positional(&self) -> bool {
4217 self.ident.as_str().as_bytes()[0].is_ascii_digit()
4218 }
4219}
4220
4221#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for VariantData<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Struct { fields: __self_0, recovered: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Struct", "fields", __self_0, "recovered", &__self_1),
Self::Tuple(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Tuple",
__self_0, __self_1, &__self_2),
Self::Unit(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Unit",
__self_0, &__self_1),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for VariantData<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for VariantData<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir [FieldDef<'hir>]>;
let _: ::core::clone::AssertParamIsClone<ast::Recovered>;
let _: ::core::clone::AssertParamIsClone<&'hir [FieldDef<'hir>]>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<LocalDefId>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for VariantData<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
VariantData<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
VariantData::Struct {
fields: ref __binding_0, recovered: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
VariantData::Tuple(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{}
{ __binding_2.stable_hash(__hcx, __hasher); }
}
VariantData::Unit(ref __binding_0, ref __binding_1) => {
{}
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4223pub enum VariantData<'hir> {
4224 Struct { fields: &'hir [FieldDef<'hir>], recovered: ast::Recovered },
4228 Tuple(&'hir [FieldDef<'hir>], #[stable_hash(ignore)] HirId, LocalDefId),
4232 Unit(#[stable_hash(ignore)] HirId, LocalDefId),
4236}
4237
4238impl<'hir> VariantData<'hir> {
4239 pub fn fields(&self) -> &'hir [FieldDef<'hir>] {
4241 match *self {
4242 VariantData::Struct { fields, .. } | VariantData::Tuple(fields, ..) => fields,
4243 _ => &[],
4244 }
4245 }
4246
4247 pub fn ctor(&self) -> Option<(CtorKind, HirId, LocalDefId)> {
4248 match *self {
4249 VariantData::Tuple(_, hir_id, def_id) => Some((CtorKind::Fn, hir_id, def_id)),
4250 VariantData::Unit(hir_id, def_id) => Some((CtorKind::Const, hir_id, def_id)),
4251 VariantData::Struct { .. } => None,
4252 }
4253 }
4254
4255 #[inline]
4256 pub fn ctor_kind(&self) -> Option<CtorKind> {
4257 self.ctor().map(|(kind, ..)| kind)
4258 }
4259
4260 #[inline]
4262 pub fn ctor_hir_id(&self) -> Option<HirId> {
4263 self.ctor().map(|(_, hir_id, _)| hir_id)
4264 }
4265
4266 #[inline]
4268 pub fn ctor_def_id(&self) -> Option<LocalDefId> {
4269 self.ctor().map(|(.., def_id)| def_id)
4270 }
4271}
4272
4273#[derive(#[automatically_derived]
impl ::core::marker::Copy for ItemId { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ItemId { }
#[automatically_derived]
impl ::core::clone::Clone for ItemId {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ItemId { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ItemId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.owner_id == other.owner_id }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ItemId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<OwnerId>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ItemId {
fn encode(&self, __encoder: &mut __E) {
let ItemId { owner_id: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ItemId {
fn decode(__decoder: &mut __D) -> Self {
ItemId {
owner_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ItemId {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "ItemId",
"owner_id", &&self.owner_id)
}
}Debug, #[automatically_derived]
impl ::core::hash::Hash for ItemId {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.owner_id, state)
}
}Hash, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for ItemId {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ItemId { owner_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4277pub struct ItemId {
4278 pub owner_id: OwnerId,
4279}
4280
4281impl ItemId {
4282 #[inline]
4283 pub fn hir_id(&self) -> HirId {
4284 HirId::make_owner(self.owner_id.def_id)
4286 }
4287}
4288
4289#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Item<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "Item",
"owner_id", &self.owner_id, "kind", &self.kind, "span",
&self.span, "vis_span", &self.vis_span, "eii", &&self.eii)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Item<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Item<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
let _: ::core::clone::AssertParamIsClone<ItemKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Item<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Item<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Item {
owner_id: ref __binding_0,
kind: ref __binding_1,
span: ref __binding_2,
vis_span: ref __binding_3,
eii: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4298pub struct Item<'hir> {
4299 pub owner_id: OwnerId,
4300 pub kind: ItemKind<'hir>,
4301 pub span: Span,
4302 pub vis_span: Span,
4303 pub eii: bool,
4306}
4307
4308impl<'hir> Item<'hir> {
4309 #[inline]
4310 pub fn hir_id(&self) -> HirId {
4311 HirId::make_owner(self.owner_id.def_id)
4313 }
4314
4315 #[inline]
4316 pub fn item_id(&self) -> ItemId {
4317 ItemId { owner_id: self.owner_id }
4318 }
4319
4320 pub fn is_adt(&self) -> bool {
4323 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) => true,
_ => false,
}matches!(self.kind, ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..))
4324 }
4325
4326 pub fn is_struct_or_union(&self) -> bool {
4328 #[allow(non_exhaustive_omitted_patterns)] match self.kind {
ItemKind::Struct(..) | ItemKind::Union(..) => true,
_ => false,
}matches!(self.kind, ItemKind::Struct(..) | ItemKind::Union(..))
4329 }
4330
4331 #[track_caller]
pub fn expect_extern_crate(&self) -> (Option<Symbol>, Ident) {
let ItemKind::ExternCrate(s, ident) =
&self.kind else { expect_failed("expect_extern_crate", self) };
(*s, *ident)
}
#[track_caller]
pub fn expect_use(&self) -> UseTree<'hir> {
let ItemKind::Use(ut) =
&self.kind else { expect_failed("expect_use", self) };
*ut
}
#[track_caller]
pub fn expect_static(&self) -> (Mutability, Ident, &'hir Ty<'hir>, BodyId) {
let ItemKind::Static(mutbl, ident, ty, body) =
&self.kind else { expect_failed("expect_static", self) };
(*mutbl, *ident, ty, *body)
}
#[track_caller]
pub fn expect_const(&self)
-> (Ident, &'hir Generics<'hir>, &'hir Ty<'hir>, ConstItemRhs<'hir>) {
let ItemKind::Const(ident, generics, ty, rhs) =
&self.kind else { expect_failed("expect_const", self) };
(*ident, generics, ty, *rhs)
}
#[track_caller]
pub fn expect_fn(&self)
-> (Ident, &FnSig<'hir>, &'hir Generics<'hir>, BodyId) {
let ItemKind::Fn { ident, sig, generics, body, .. } =
&self.kind else { expect_failed("expect_fn", self) };
(*ident, sig, generics, *body)
}
#[track_caller]
pub fn expect_macro(&self) -> (Ident, &ast::MacroDef, MacroKinds) {
let ItemKind::Macro(ident, def, mk) =
&self.kind else { expect_failed("expect_macro", self) };
(*ident, def, *mk)
}
#[track_caller]
pub fn expect_mod(&self) -> (Ident, &'hir Mod<'hir>) {
let ItemKind::Mod(ident, m) =
&self.kind else { expect_failed("expect_mod", self) };
(*ident, m)
}
#[track_caller]
pub fn expect_foreign_mod(&self) -> (ExternAbi, &'hir [ForeignItemId]) {
let ItemKind::ForeignMod { abi, items } =
&self.kind else { expect_failed("expect_foreign_mod", self) };
(*abi, items)
}
#[track_caller]
pub fn expect_global_asm(&self) -> &'hir InlineAsm<'hir> {
let ItemKind::GlobalAsm { asm, .. } =
&self.kind else { expect_failed("expect_global_asm", self) };
asm
}
#[track_caller]
pub fn expect_ty_alias(&self)
-> (Ident, &'hir Generics<'hir>, &'hir Ty<'hir>) {
let ItemKind::TyAlias(ident, generics, ty) =
&self.kind else { expect_failed("expect_ty_alias", self) };
(*ident, generics, ty)
}
#[track_caller]
pub fn expect_enum(&self) -> (Ident, &'hir Generics<'hir>, &EnumDef<'hir>) {
let ItemKind::Enum(ident, generics, def) =
&self.kind else { expect_failed("expect_enum", self) };
(*ident, generics, def)
}
#[track_caller]
pub fn expect_struct(&self)
-> (Ident, &'hir Generics<'hir>, &VariantData<'hir>) {
let ItemKind::Struct(ident, generics, data) =
&self.kind else { expect_failed("expect_struct", self) };
(*ident, generics, data)
}
#[track_caller]
pub fn expect_union(&self)
-> (Ident, &'hir Generics<'hir>, &VariantData<'hir>) {
let ItemKind::Union(ident, generics, data) =
&self.kind else { expect_failed("expect_union", self) };
(*ident, generics, data)
}
#[track_caller]
pub fn expect_trait(&self)
->
(&'hir ImplRestriction<'hir>, Constness, IsAuto, Safety, Ident,
&'hir Generics<'hir>, GenericBounds<'hir>, &'hir [TraitItemId]) {
let ItemKind::Trait {
impl_restriction,
constness,
is_auto,
safety,
ident,
generics,
bounds,
items } = &self.kind else { expect_failed("expect_trait", self) };
(impl_restriction, *constness, *is_auto, *safety, *ident, generics,
bounds, items)
}
#[track_caller]
pub fn expect_trait_alias(&self)
-> (Constness, Ident, &'hir Generics<'hir>, GenericBounds<'hir>) {
let ItemKind::TraitAlias(constness, ident, generics, bounds) =
&self.kind else { expect_failed("expect_trait_alias", self) };
(*constness, *ident, generics, bounds)
}
#[track_caller]
pub fn expect_impl(&self) -> &Impl<'hir> {
let ItemKind::Impl(imp) =
&self.kind else { expect_failed("expect_impl", self) };
imp
}
#[track_caller]
pub fn expect_test_binder_constraints(&self)
-> (&'hir Generics<'hir>, &'hir TestBinderBody<'hir>) {
let ItemKind::TestBinderConstraints { generics, body } =
&self.kind else {
expect_failed("expect_test_binder_constraints", self)
};
(generics, body)
}expect_methods_self_kind! {
4332 expect_extern_crate, (Option<Symbol>, Ident),
4333 ItemKind::ExternCrate(s, ident), (*s, *ident);
4334
4335 expect_use, UseTree<'hir>, ItemKind::Use(ut), *ut;
4336
4337 expect_static, (Mutability, Ident, &'hir Ty<'hir>, BodyId),
4338 ItemKind::Static(mutbl, ident, ty, body), (*mutbl, *ident, ty, *body);
4339
4340 expect_const, (Ident, &'hir Generics<'hir>, &'hir Ty<'hir>, ConstItemRhs<'hir>),
4341 ItemKind::Const(ident, generics, ty, rhs), (*ident, generics, ty, *rhs);
4342
4343 expect_fn, (Ident, &FnSig<'hir>, &'hir Generics<'hir>, BodyId),
4344 ItemKind::Fn { ident, sig, generics, body, .. }, (*ident, sig, generics, *body);
4345
4346 expect_macro, (Ident, &ast::MacroDef, MacroKinds),
4347 ItemKind::Macro(ident, def, mk), (*ident, def, *mk);
4348
4349 expect_mod, (Ident, &'hir Mod<'hir>), ItemKind::Mod(ident, m), (*ident, m);
4350
4351 expect_foreign_mod, (ExternAbi, &'hir [ForeignItemId]),
4352 ItemKind::ForeignMod { abi, items }, (*abi, items);
4353
4354 expect_global_asm, &'hir InlineAsm<'hir>, ItemKind::GlobalAsm { asm, .. }, asm;
4355
4356 expect_ty_alias, (Ident, &'hir Generics<'hir>, &'hir Ty<'hir>),
4357 ItemKind::TyAlias(ident, generics, ty), (*ident, generics, ty);
4358
4359 expect_enum, (Ident, &'hir Generics<'hir>, &EnumDef<'hir>),
4360 ItemKind::Enum(ident, generics, def), (*ident, generics, def);
4361
4362 expect_struct, (Ident, &'hir Generics<'hir>, &VariantData<'hir>),
4363 ItemKind::Struct(ident, generics, data), (*ident, generics, data);
4364
4365 expect_union, (Ident, &'hir Generics<'hir>, &VariantData<'hir>),
4366 ItemKind::Union(ident, generics, data), (*ident, generics, data);
4367
4368 expect_trait,
4369 (
4370 &'hir ImplRestriction<'hir>,
4371 Constness,
4372 IsAuto,
4373 Safety,
4374 Ident,
4375 &'hir Generics<'hir>,
4376 GenericBounds<'hir>,
4377 &'hir [TraitItemId]
4378 ),
4379 ItemKind::Trait { impl_restriction, constness, is_auto, safety, ident, generics, bounds, items },
4380 (impl_restriction, *constness, *is_auto, *safety, *ident, generics, bounds, items);
4381
4382 expect_trait_alias, (Constness, Ident, &'hir Generics<'hir>, GenericBounds<'hir>),
4383 ItemKind::TraitAlias(constness, ident, generics, bounds), (*constness, *ident, generics, bounds);
4384
4385 expect_impl, &Impl<'hir>, ItemKind::Impl(imp), imp;
4386
4387 expect_test_binder_constraints, (&'hir Generics<'hir>, &'hir TestBinderBody<'hir>),
4388 ItemKind::TestBinderConstraints { generics, body }, (generics, body);
4389 }
4390}
4391
4392#[derive(#[automatically_derived]
impl ::core::marker::Copy for Safety { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Safety { }
#[automatically_derived]
impl ::core::clone::Clone for Safety {
#[inline]
fn clone(&self) -> Self { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Safety { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Safety {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other)
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Safety { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Safety {
#[inline]
fn partial_cmp(&self, other: &Self)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for Safety {
#[inline]
fn cmp(&self, other: &Self) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&::core::intrinsics::discriminant_value(self),
&::core::intrinsics::discriminant_value(other))
}
}Ord, #[automatically_derived]
impl ::core::hash::Hash for Safety {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&::core::intrinsics::discriminant_value(self),
state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for Safety {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
Safety::Unsafe => "Unsafe",
Safety::Safe => "Safe",
})
}
}Debug)]
4393#[derive(const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Safety {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Safety::Unsafe => { 0usize }
Safety::Safe => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Safety {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Safety::Unsafe }
1usize => { Safety::Safe }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Safety`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Safety {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self { Safety::Unsafe => {} Safety::Safe => {} }
}
}
};StableHash, #[automatically_derived]
impl ::core::default::Default for Safety {
#[inline]
fn default() -> Self { Self::Unsafe }
}Default)]
4394pub enum Safety {
4395 #[default]
4400 Unsafe,
4401 Safe,
4402}
4403
4404impl Safety {
4405 pub fn prefix_str(self) -> &'static str {
4406 match self {
4407 Self::Unsafe => "unsafe ",
4408 Self::Safe => "",
4409 }
4410 }
4411
4412 #[inline]
4413 pub fn is_unsafe(self) -> bool {
4414 !self.is_safe()
4415 }
4416
4417 #[inline]
4418 pub fn is_safe(self) -> bool {
4419 match self {
4420 Self::Unsafe => false,
4421 Self::Safe => true,
4422 }
4423 }
4424}
4425
4426impl fmt::Display for Safety {
4427 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4428 f.write_str(match *self {
4429 Self::Unsafe => "unsafe",
4430 Self::Safe => "safe",
4431 })
4432 }
4433}
4434
4435#[derive(#[automatically_derived]
impl ::core::marker::Copy for Constness { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Constness { }
#[automatically_derived]
impl ::core::clone::Clone for Constness {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Constness { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Constness {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Const { always: __self_0 }, Self::Const {
always: __arg1_0 }) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Constness {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<bool>;
}
}Eq, #[automatically_derived]
impl ::core::fmt::Debug for Constness {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Const { always: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Const",
"always", &__self_0),
Self::NotConst =>
::core::fmt::Formatter::write_str(f, "NotConst"),
}
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Constness {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Constness::Const { always: ref __binding_0 } => { 0usize }
Constness::NotConst => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Constness::Const { always: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Constness::NotConst => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Constness {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
Constness::Const {
always: ::rustc_serialize::Decodable::decode(__decoder),
}
}
1usize => { Constness::NotConst }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Constness`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Constness {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Constness::Const { always: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Constness::NotConst => {}
}
}
}
};StableHash)]
4436pub enum Constness {
4437 Const { always: bool },
4438 NotConst,
4439}
4440
4441impl Default for Constness {
4444 fn default() -> Self {
4445 Self::Const { always: false }
4446 }
4447}
4448
4449impl fmt::Display for Constness {
4450 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4451 f.write_str(match *self {
4452 Self::Const { always: true } => "comptime",
4453 Self::Const { always: false } => "const",
4454 Self::NotConst => "non-const",
4455 })
4456 }
4457}
4458
4459#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for ImplRestriction<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ImplRestriction", "kind", &self.kind, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ImplRestriction<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ImplRestriction<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<RestrictionKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ImplRestriction<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ImplRestriction<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ImplRestriction {
kind: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4460pub struct ImplRestriction<'hir> {
4461 pub kind: RestrictionKind<'hir>,
4462 pub span: Span,
4463}
4464
4465#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for MutRestriction<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f,
"MutRestriction", "kind", &self.kind, "span", &&self.span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for MutRestriction<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for MutRestriction<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<RestrictionKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for MutRestriction<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
MutRestriction<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
MutRestriction {
kind: ref __binding_0, span: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4466pub struct MutRestriction<'hir> {
4467 pub kind: RestrictionKind<'hir>,
4468 pub span: Span,
4469}
4470
4471#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for RestrictionKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Unrestricted =>
::core::fmt::Formatter::write_str(f, "Unrestricted"),
Self::Restricted(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Restricted", &__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for RestrictionKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for RestrictionKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Path<'hir, DefId>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for RestrictionKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
RestrictionKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
RestrictionKind::Unrestricted => {}
RestrictionKind::Restricted(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4472pub enum RestrictionKind<'hir> {
4473 Unrestricted,
4475 Restricted(&'hir Path<'hir, DefId>),
4479}
4480
4481#[derive(#[automatically_derived]
impl ::core::marker::Copy for HeaderSafety { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for HeaderSafety { }
#[automatically_derived]
impl ::core::clone::Clone for HeaderSafety {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Safety>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for HeaderSafety {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::SafeTargetFeatures =>
::core::fmt::Formatter::write_str(f, "SafeTargetFeatures"),
Self::Normal(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Normal",
&__self_0),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for HeaderSafety
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
HeaderSafety::SafeTargetFeatures => {}
HeaderSafety::Normal(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for HeaderSafety { }
#[automatically_derived]
impl ::core::cmp::PartialEq for HeaderSafety {
#[inline]
fn eq(&self, other: &Self) -> bool {
::core::intrinsics::discriminant_value(self) ==
::core::intrinsics::discriminant_value(other) &&
match (self, other) {
(Self::Normal(__self_0), Self::Normal(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for HeaderSafety {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Safety>;
}
}Eq)]
4486pub enum HeaderSafety {
4487 SafeTargetFeatures,
4493 Normal(Safety),
4494}
4495
4496impl From<Safety> for HeaderSafety {
4497 fn from(v: Safety) -> Self {
4498 Self::Normal(v)
4499 }
4500}
4501
4502#[derive(#[automatically_derived]
impl ::core::marker::Copy for FnHeader { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for FnHeader { }
#[automatically_derived]
impl ::core::clone::Clone for FnHeader {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<HeaderSafety>;
let _: ::core::clone::AssertParamIsClone<Constness>;
let _: ::core::clone::AssertParamIsClone<IsAsync>;
let _: ::core::clone::AssertParamIsClone<ExternAbi>;
*self
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for FnHeader {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f, "FnHeader",
"safety", &self.safety, "constness", &self.constness, "asyncness",
&self.asyncness, "abi", &&self.abi)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for FnHeader {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
FnHeader {
safety: ref __binding_0,
constness: ref __binding_1,
asyncness: ref __binding_2,
abi: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4503pub struct FnHeader {
4504 pub safety: HeaderSafety,
4505 pub constness: Constness,
4506 pub asyncness: IsAsync,
4507 pub abi: ExternAbi,
4508}
4509
4510impl FnHeader {
4511 pub fn is_async(&self) -> bool {
4512 #[allow(non_exhaustive_omitted_patterns)] match self.asyncness {
IsAsync::Async(_) => true,
_ => false,
}matches!(self.asyncness, IsAsync::Async(_))
4513 }
4514
4515 pub fn is_unsafe(&self) -> bool {
4516 self.safety().is_unsafe()
4517 }
4518
4519 pub fn is_safe(&self) -> bool {
4520 self.safety().is_safe()
4521 }
4522
4523 pub fn safety(&self) -> Safety {
4524 match self.safety {
4525 HeaderSafety::SafeTargetFeatures => Safety::Unsafe,
4526 HeaderSafety::Normal(safety) => safety,
4527 }
4528 }
4529}
4530
4531#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TestBinderBody<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"TestBinderBody", "span", &self.span, "foralls", &self.foralls,
"exists", &self.exists, "constraints", &self.constraints,
"predicates", &&self.predicates)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TestBinderBody<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TestBinderBody<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _:
::core::clone::AssertParamIsClone<&'hir [TestBinderForall<'hir>]>;
let _:
::core::clone::AssertParamIsClone<&'hir [TestBinderExists<'hir>]>;
let _: ::core::clone::AssertParamIsClone<TestBinderConstraint<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir [WherePredicate<'hir>]>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TestBinderBody<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderBody<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderBody {
span: ref __binding_0,
foralls: ref __binding_1,
exists: ref __binding_2,
constraints: ref __binding_3,
predicates: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4532pub struct TestBinderBody<'hir> {
4533 pub span: Span,
4534 pub foralls: &'hir [TestBinderForall<'hir>],
4535 pub exists: &'hir [TestBinderExists<'hir>],
4536 pub constraints: TestBinderConstraint<'hir>,
4538 pub predicates: &'hir [WherePredicate<'hir>],
4540}
4541
4542#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TestBinderForall<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"TestBinderForall", "span", &self.span, "hir_id", &self.hir_id,
"generics", &self.generics, "body", &self.body, "assert_on_exit",
&&self.assert_on_exit)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TestBinderForall<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TestBinderForall<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TestBinderBody<'hir>>;
let _:
::core::clone::AssertParamIsClone<Option<&'hir TestBinderConstraint<'hir>>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TestBinderForall<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderForall<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderForall {
span: ref __binding_0,
hir_id: ref __binding_1,
generics: ref __binding_2,
body: ref __binding_3,
assert_on_exit: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4543pub struct TestBinderForall<'hir> {
4544 pub span: Span,
4545 pub hir_id: HirId,
4546 pub generics: &'hir Generics<'hir>,
4547 pub body: &'hir TestBinderBody<'hir>,
4548 pub assert_on_exit: Option<&'hir TestBinderConstraint<'hir>>,
4549}
4550
4551#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TestBinderExists<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field4_finish(f,
"TestBinderExists", "span", &self.span, "hir_id", &self.hir_id,
"params", &self.params, "body", &&self.body)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TestBinderExists<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TestBinderExists<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir TestBinderBody<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TestBinderExists<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderExists<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderExists {
span: ref __binding_0,
hir_id: ref __binding_1,
params: ref __binding_2,
body: ref __binding_3 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4552pub struct TestBinderExists<'hir> {
4553 pub span: Span,
4554 pub hir_id: HirId,
4555 pub params: &'hir [GenericParam<'hir>],
4556 pub body: &'hir TestBinderBody<'hir>,
4557}
4558
4559#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TestBinderConstraint<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::And { items: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "And",
"items", &__self_0),
Self::Or { items: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Or",
"items", &__self_0),
Self::Ambiguity { span: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"Ambiguity", "span", &__self_0),
Self::Lifetime { lhs: __self_0, rhs: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"Lifetime", "lhs", __self_0, "rhs", &__self_1),
Self::PlaceholderOutlives { lhs: __self_0, rhs: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"PlaceholderOutlives", "lhs", __self_0, "rhs", &__self_1),
Self::AliasOutlives { bound_type_constraint: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"AliasOutlives", "bound_type_constraint", &__self_0),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TestBinderConstraint<'hir> {
}
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TestBinderConstraint<'hir> {
#[inline]
fn clone(&self) -> Self {
let _:
::core::clone::AssertParamIsClone<&'hir [TestBinderConstraint<'hir>]>;
let _:
::core::clone::AssertParamIsClone<&'hir [TestBinderConstraint<'hir>]>;
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _:
::core::clone::AssertParamIsClone<&'hir TestBinderBoundTypeConstraint<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TestBinderConstraint<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderConstraint<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
TestBinderConstraint::And { items: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::Or { items: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::Ambiguity { span: ref __binding_0 } =>
{
{ __binding_0.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::Lifetime {
lhs: ref __binding_0, rhs: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::PlaceholderOutlives {
lhs: ref __binding_0, rhs: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
TestBinderConstraint::AliasOutlives {
bound_type_constraint: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4560pub enum TestBinderConstraint<'hir> {
4561 And { items: &'hir [TestBinderConstraint<'hir>] },
4562 Or { items: &'hir [TestBinderConstraint<'hir>] },
4563 Ambiguity { span: Span },
4564 Lifetime { lhs: &'hir Lifetime, rhs: &'hir Lifetime },
4565 PlaceholderOutlives { lhs: &'hir Ty<'hir>, rhs: &'hir Lifetime },
4566 AliasOutlives { bound_type_constraint: &'hir TestBinderBoundTypeConstraint<'hir> },
4567}
4568
4569#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TestBinderBoundTypeConstraint<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"TestBinderBoundTypeConstraint", "span", &self.span, "hir_id",
&self.hir_id, "params", &self.params, "lhs", &self.lhs, "rhs",
&&self.rhs)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for
TestBinderBoundTypeConstraint<'hir> {
}
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TestBinderBoundTypeConstraint<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
let _: ::core::clone::AssertParamIsClone<HirId>;
let _: ::core::clone::AssertParamIsClone<&'hir [GenericParam<'hir>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TestBinderBoundTypeConstraint<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TestBinderBoundTypeConstraint<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TestBinderBoundTypeConstraint {
span: ref __binding_0,
hir_id: ref __binding_1,
params: ref __binding_2,
lhs: ref __binding_3,
rhs: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4570pub struct TestBinderBoundTypeConstraint<'hir> {
4571 pub span: Span,
4572 pub hir_id: HirId,
4573 pub params: &'hir [GenericParam<'hir>],
4574 pub lhs: &'hir Ty<'hir>,
4575 pub rhs: &'hir Lifetime,
4576}
4577
4578#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for ItemKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::ExternCrate(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"ExternCrate", __self_0, &__self_1),
Self::Use(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Use",
&__self_0),
Self::Static(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_tuple_field4_finish(f, "Static",
__self_0, __self_1, __self_2, &__self_3),
Self::Const(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_tuple_field4_finish(f, "Const",
__self_0, __self_1, __self_2, &__self_3),
Self::Fn {
sig: __self_0,
ident: __self_1,
generics: __self_2,
body: __self_3,
has_body: __self_4 } =>
::core::fmt::Formatter::debug_struct_field5_finish(f, "Fn",
"sig", __self_0, "ident", __self_1, "generics", __self_2,
"body", __self_3, "has_body", &__self_4),
Self::Macro(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Macro",
__self_0, __self_1, &__self_2),
Self::Mod(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Mod",
__self_0, &__self_1),
Self::ForeignMod { abi: __self_0, items: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"ForeignMod", "abi", __self_0, "items", &__self_1),
Self::GlobalAsm { asm: __self_0, fake_body: __self_1 } =>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"GlobalAsm", "asm", __self_0, "fake_body", &__self_1),
Self::TyAlias(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"TyAlias", __self_0, __self_1, &__self_2),
Self::Enum(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Enum",
__self_0, __self_1, &__self_2),
Self::Struct(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Struct",
__self_0, __self_1, &__self_2),
Self::Union(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Union",
__self_0, __self_1, &__self_2),
Self::Trait {
impl_restriction: __self_0,
constness: __self_1,
is_auto: __self_2,
safety: __self_3,
ident: __self_4,
generics: __self_5,
bounds: __self_6,
items: __self_7 } => {
let names: &'static _ =
&["impl_restriction", "constness", "is_auto", "safety",
"ident", "generics", "bounds", "items"];
let values: &[&dyn ::core::fmt::Debug] =
&[__self_0, __self_1, __self_2, __self_3, __self_4,
__self_5, __self_6, &__self_7];
::core::fmt::Formatter::debug_struct_fields_finish(f, "Trait",
names, values)
}
Self::TraitAlias(__self_0, __self_1, __self_2, __self_3) =>
::core::fmt::Formatter::debug_tuple_field4_finish(f,
"TraitAlias", __self_0, __self_1, __self_2, &__self_3),
Self::Impl(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Impl",
&__self_0),
Self::TestBinderConstraints { generics: __self_0, body: __self_1 }
=>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"TestBinderConstraints", "generics", __self_0, "body",
&__self_1),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ItemKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ItemKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Option<Symbol>>;
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<UseTree<'hir>>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<BodyId>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<ConstItemRhs<'hir>>;
let _: ::core::clone::AssertParamIsClone<FnSig<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<&'hir ast::MacroDef>;
let _: ::core::clone::AssertParamIsClone<MacroKinds>;
let _: ::core::clone::AssertParamIsClone<&'hir Mod<'hir>>;
let _: ::core::clone::AssertParamIsClone<ExternAbi>;
let _: ::core::clone::AssertParamIsClone<&'hir [ForeignItemId]>;
let _: ::core::clone::AssertParamIsClone<&'hir InlineAsm<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<EnumDef<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<VariantData<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<VariantData<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ImplRestriction<'hir>>;
let _: ::core::clone::AssertParamIsClone<Constness>;
let _: ::core::clone::AssertParamIsClone<IsAuto>;
let _: ::core::clone::AssertParamIsClone<Safety>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [TraitItemId]>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<GenericBounds<'hir>>;
let _: ::core::clone::AssertParamIsClone<Impl<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TestBinderBody<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ItemKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ItemKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ItemKind::ExternCrate(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ItemKind::Use(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ItemKind::Static(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ItemKind::Const(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ItemKind::Fn {
sig: ref __binding_0,
ident: ref __binding_1,
generics: ref __binding_2,
body: ref __binding_3,
has_body: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
ItemKind::Macro(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Mod(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ItemKind::ForeignMod {
abi: ref __binding_0, items: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ItemKind::GlobalAsm {
asm: ref __binding_0, fake_body: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
ItemKind::TyAlias(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Enum(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Struct(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Union(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ItemKind::Trait {
impl_restriction: ref __binding_0,
constness: ref __binding_1,
is_auto: ref __binding_2,
safety: ref __binding_3,
ident: ref __binding_4,
generics: ref __binding_5,
bounds: ref __binding_6,
items: ref __binding_7 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
{ __binding_5.stable_hash(__hcx, __hasher); }
{ __binding_6.stable_hash(__hcx, __hasher); }
{ __binding_7.stable_hash(__hcx, __hasher); }
}
ItemKind::TraitAlias(ref __binding_0, ref __binding_1,
ref __binding_2, ref __binding_3) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
}
ItemKind::Impl(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
ItemKind::TestBinderConstraints {
generics: ref __binding_0, body: ref __binding_1 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4579pub enum ItemKind<'hir> {
4580 ExternCrate(Option<Symbol>, Ident),
4584
4585 Use(UseTree<'hir>),
4591
4592 Static(Mutability, Ident, &'hir Ty<'hir>, BodyId),
4594 Const(Ident, &'hir Generics<'hir>, &'hir Ty<'hir>, ConstItemRhs<'hir>),
4596 Fn {
4598 sig: FnSig<'hir>,
4599 ident: Ident,
4600 generics: &'hir Generics<'hir>,
4601 body: BodyId,
4602 has_body: bool,
4606 },
4607 Macro(Ident, &'hir ast::MacroDef, MacroKinds),
4609 Mod(Ident, &'hir Mod<'hir>),
4611 ForeignMod {
4613 abi: ExternAbi,
4614 items: &'hir [ForeignItemId],
4615 },
4616 GlobalAsm {
4618 asm: &'hir InlineAsm<'hir>,
4619 fake_body: BodyId,
4625 },
4626 TyAlias(Ident, &'hir Generics<'hir>, &'hir Ty<'hir>),
4628 Enum(Ident, &'hir Generics<'hir>, EnumDef<'hir>),
4630 Struct(Ident, &'hir Generics<'hir>, VariantData<'hir>),
4632 Union(Ident, &'hir Generics<'hir>, VariantData<'hir>),
4634 Trait {
4636 impl_restriction: &'hir ImplRestriction<'hir>,
4637 constness: Constness,
4638 is_auto: IsAuto,
4639 safety: Safety,
4640 ident: Ident,
4641 generics: &'hir Generics<'hir>,
4642 bounds: GenericBounds<'hir>,
4643 items: &'hir [TraitItemId],
4644 },
4645 TraitAlias(Constness, Ident, &'hir Generics<'hir>, GenericBounds<'hir>),
4647
4648 Impl(Impl<'hir>),
4650
4651 TestBinderConstraints {
4652 generics: &'hir Generics<'hir>,
4653 body: &'hir TestBinderBody<'hir>,
4654 },
4655}
4656
4657#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for Impl<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "Impl",
"generics", &self.generics, "of_trait", &self.of_trait, "self_ty",
&self.self_ty, "items", &self.items, "constness",
&&self.constness)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Impl<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Impl<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _:
::core::clone::AssertParamIsClone<Option<&'hir TraitImplHeader<'hir>>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [ImplItemId]>;
let _: ::core::clone::AssertParamIsClone<Constness>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for Impl<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Impl<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Impl {
generics: ref __binding_0,
of_trait: ref __binding_1,
self_ty: ref __binding_2,
items: ref __binding_3,
constness: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4662pub struct Impl<'hir> {
4663 pub generics: &'hir Generics<'hir>,
4664 pub of_trait: Option<&'hir TraitImplHeader<'hir>>,
4665 pub self_ty: &'hir Ty<'hir>,
4666 pub items: &'hir [ImplItemId],
4667 pub constness: Constness,
4668}
4669
4670#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TraitImplHeader<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f,
"TraitImplHeader", "safety", &self.safety, "polarity",
&self.polarity, "defaultness", &self.defaultness,
"defaultness_span", &self.defaultness_span, "trait_ref",
&&self.trait_ref)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TraitImplHeader<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TraitImplHeader<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Safety>;
let _: ::core::clone::AssertParamIsClone<ImplPolarity>;
let _: ::core::clone::AssertParamIsClone<Defaultness>;
let _: ::core::clone::AssertParamIsClone<Option<Span>>;
let _: ::core::clone::AssertParamIsClone<TraitRef<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TraitImplHeader<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitImplHeader<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitImplHeader {
safety: ref __binding_0,
polarity: ref __binding_1,
defaultness: ref __binding_2,
defaultness_span: ref __binding_3,
trait_ref: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4671pub struct TraitImplHeader<'hir> {
4672 pub safety: Safety,
4673 pub polarity: ImplPolarity,
4674 pub defaultness: Defaultness,
4675 pub defaultness_span: Option<Span>,
4678 pub trait_ref: TraitRef<'hir>,
4679}
4680
4681impl ItemKind<'_> {
4682 pub fn ident(&self) -> Option<Ident> {
4683 match *self {
4684 ItemKind::ExternCrate(_, ident)
4685 | ItemKind::Use(UseTree { kind: UseKind::Single(ident), .. })
4686 | ItemKind::Static(_, ident, ..)
4687 | ItemKind::Const(ident, ..)
4688 | ItemKind::Fn { ident, .. }
4689 | ItemKind::Macro(ident, ..)
4690 | ItemKind::Mod(ident, ..)
4691 | ItemKind::TyAlias(ident, ..)
4692 | ItemKind::Enum(ident, ..)
4693 | ItemKind::Struct(ident, ..)
4694 | ItemKind::Union(ident, ..)
4695 | ItemKind::Trait { ident, .. }
4696 | ItemKind::TraitAlias(_, ident, ..) => Some(ident),
4697
4698 ItemKind::Use(UseTree { kind: UseKind::Glob | UseKind::Nested { .. }, .. })
4699 | ItemKind::ForeignMod { .. }
4700 | ItemKind::GlobalAsm { .. }
4701 | ItemKind::Impl(_)
4702 | ItemKind::TestBinderConstraints { .. } => None,
4703 }
4704 }
4705
4706 pub fn generics(&self) -> Option<&Generics<'_>> {
4707 Some(match self {
4708 ItemKind::Fn { generics, .. }
4709 | ItemKind::TyAlias(_, generics, _)
4710 | ItemKind::Const(_, generics, _, _)
4711 | ItemKind::Enum(_, generics, _)
4712 | ItemKind::Struct(_, generics, _)
4713 | ItemKind::Union(_, generics, _)
4714 | ItemKind::Trait { generics, .. }
4715 | ItemKind::TraitAlias(_, _, generics, _)
4716 | ItemKind::Impl(Impl { generics, .. })
4717 | ItemKind::TestBinderConstraints { generics, .. } => generics,
4718 _ => return None,
4719 })
4720 }
4721
4722 pub fn recovered(&self) -> bool {
4723 match self {
4724 ItemKind::Struct(
4725 _,
4726 _,
4727 VariantData::Struct { recovered: ast::Recovered::Yes(_), .. },
4728 ) => true,
4729 ItemKind::Union(
4730 _,
4731 _,
4732 VariantData::Struct { recovered: ast::Recovered::Yes(_), .. },
4733 ) => true,
4734 ItemKind::Enum(_, _, def) => def.variants.iter().any(|v| match v.data {
4735 VariantData::Struct { recovered: ast::Recovered::Yes(_), .. } => true,
4736 _ => false,
4737 }),
4738 _ => false,
4739 }
4740 }
4741}
4742
4743#[derive(#[automatically_derived]
impl ::core::marker::Copy for ForeignItemId { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for ForeignItemId { }
#[automatically_derived]
impl ::core::clone::Clone for ForeignItemId {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<OwnerId>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for ForeignItemId { }
#[automatically_derived]
impl ::core::cmp::PartialEq for ForeignItemId {
#[inline]
fn eq(&self, other: &Self) -> bool { self.owner_id == other.owner_id }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for ForeignItemId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<OwnerId>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for ForeignItemId {
fn encode(&self, __encoder: &mut __E) {
let ForeignItemId { owner_id: ref __binding_0 } = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for ForeignItemId {
fn decode(__decoder: &mut __D) -> Self {
ForeignItemId {
owner_id: ::rustc_serialize::Decodable::decode(__decoder),
}
}
}
};Decodable, #[automatically_derived]
impl ::core::fmt::Debug for ForeignItemId {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "ForeignItemId",
"owner_id", &&self.owner_id)
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
ForeignItemId {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ForeignItemId { owner_id: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4747pub struct ForeignItemId {
4748 pub owner_id: OwnerId,
4749}
4750
4751impl ForeignItemId {
4752 #[inline]
4753 pub fn hir_id(&self) -> HirId {
4754 HirId::make_owner(self.owner_id.def_id)
4756 }
4757}
4758
4759#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for ForeignItem<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field5_finish(f, "ForeignItem",
"ident", &self.ident, "kind", &self.kind, "owner_id",
&self.owner_id, "span", &self.span, "vis_span", &&self.vis_span)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ForeignItem<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ForeignItem<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Ident>;
let _: ::core::clone::AssertParamIsClone<ForeignItemKind<'hir>>;
let _: ::core::clone::AssertParamIsClone<OwnerId>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ForeignItem<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ForeignItem<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
ForeignItem {
ident: ref __binding_0,
kind: ref __binding_1,
owner_id: ref __binding_2,
span: ref __binding_3,
vis_span: ref __binding_4 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
{ __binding_3.stable_hash(__hcx, __hasher); }
{ __binding_4.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4760pub struct ForeignItem<'hir> {
4761 pub ident: Ident,
4762 pub kind: ForeignItemKind<'hir>,
4763 pub owner_id: OwnerId,
4764 pub span: Span,
4765 pub vis_span: Span,
4766}
4767
4768impl ForeignItem<'_> {
4769 #[inline]
4770 pub fn hir_id(&self) -> HirId {
4771 HirId::make_owner(self.owner_id.def_id)
4773 }
4774
4775 pub fn foreign_item_id(&self) -> ForeignItemId {
4776 ForeignItemId { owner_id: self.owner_id }
4777 }
4778}
4779
4780#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for ForeignItemKind<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Fn(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Fn",
__self_0, __self_1, &__self_2),
Self::Static(__self_0, __self_1, __self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f, "Static",
__self_0, __self_1, &__self_2),
Self::Type => ::core::fmt::Formatter::write_str(f, "Type"),
}
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for ForeignItemKind<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for ForeignItemKind<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<FnSig<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir [Option<Ident>]>;
let _: ::core::clone::AssertParamIsClone<&'hir Generics<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _: ::core::clone::AssertParamIsClone<Mutability>;
let _: ::core::clone::AssertParamIsClone<Safety>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for ForeignItemKind<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
ForeignItemKind<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
ForeignItemKind::Fn(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ForeignItemKind::Static(ref __binding_0, ref __binding_1,
ref __binding_2) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
ForeignItemKind::Type => {}
}
}
}
};StableHash)]
4782pub enum ForeignItemKind<'hir> {
4783 Fn(FnSig<'hir>, &'hir [Option<Ident>], &'hir Generics<'hir>),
4790 Static(&'hir Ty<'hir>, Mutability, Safety),
4792 Type,
4794}
4795
4796#[derive(#[automatically_derived]
impl ::core::fmt::Debug for Upvar {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field1_finish(f, "Upvar", "span",
&&self.span)
}
}Debug, #[automatically_derived]
impl ::core::marker::Copy for Upvar { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Upvar { }
#[automatically_derived]
impl ::core::clone::Clone for Upvar {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Upvar {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Upvar { span: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4798pub struct Upvar {
4799 pub span: Span,
4801}
4802
4803#[derive(#[automatically_derived]
impl<'hir> ::core::fmt::Debug for TraitCandidate<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f,
"TraitCandidate", "def_id", &self.def_id, "import_ids",
&self.import_ids, "lint_ambiguous", &&self.lint_ambiguous)
}
}Debug, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for TraitCandidate<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for TraitCandidate<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<DefId>;
let _: ::core::clone::AssertParamIsClone<&'hir [LocalDefId]>;
let _: ::core::clone::AssertParamIsClone<bool>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::marker::Copy for TraitCandidate<'hir> { }Copy, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
TraitCandidate<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
TraitCandidate {
def_id: ref __binding_0,
import_ids: ref __binding_1,
lint_ambiguous: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4807pub struct TraitCandidate<'hir> {
4808 pub def_id: DefId,
4809 pub import_ids: &'hir [LocalDefId],
4810 pub lint_ambiguous: bool,
4815}
4816
4817#[derive(#[automatically_derived]
impl<'hir> ::core::marker::Copy for OwnerNode<'hir> { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for OwnerNode<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for OwnerNode<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Item<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ForeignItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TraitItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ImplItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Mod<'hir>>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for OwnerNode<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Item(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Item",
&__self_0),
Self::ForeignItem(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ForeignItem", &__self_0),
Self::TraitItem(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TraitItem", &__self_0),
Self::ImplItem(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ImplItem", &__self_0),
Self::Crate(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Crate",
&__self_0),
Self::Synthetic =>
::core::fmt::Formatter::write_str(f, "Synthetic"),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
OwnerNode<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
OwnerNode::Item(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::ForeignItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::TraitItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::ImplItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::Crate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
OwnerNode::Synthetic => {}
}
}
}
};StableHash)]
4818pub enum OwnerNode<'hir> {
4819 Item(&'hir Item<'hir>),
4820 ForeignItem(&'hir ForeignItem<'hir>),
4821 TraitItem(&'hir TraitItem<'hir>),
4822 ImplItem(&'hir ImplItem<'hir>),
4823 Crate(&'hir Mod<'hir>),
4824 Synthetic,
4825}
4826
4827impl<'hir> OwnerNode<'hir> {
4828 pub fn span(&self) -> Span {
4829 match self {
4830 OwnerNode::Item(Item { span, .. })
4831 | OwnerNode::ForeignItem(ForeignItem { span, .. })
4832 | OwnerNode::ImplItem(ImplItem { span, .. })
4833 | OwnerNode::TraitItem(TraitItem { span, .. }) => *span,
4834 OwnerNode::Crate(Mod { spans: ModSpans { inner_span, .. }, .. }) => *inner_span,
4835 OwnerNode::Synthetic => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
4836 }
4837 }
4838
4839 pub fn fn_sig(self) -> Option<&'hir FnSig<'hir>> {
4840 match self {
4841 OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
4842 | OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
4843 | OwnerNode::Item(Item { kind: ItemKind::Fn { sig: fn_sig, .. }, .. })
4844 | OwnerNode::ForeignItem(ForeignItem {
4845 kind: ForeignItemKind::Fn(fn_sig, _, _), ..
4846 }) => Some(fn_sig),
4847 _ => None,
4848 }
4849 }
4850
4851 pub fn fn_decl(self) -> Option<&'hir FnDecl<'hir>> {
4852 match self {
4853 OwnerNode::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
4854 | OwnerNode::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
4855 | OwnerNode::Item(Item { kind: ItemKind::Fn { sig: fn_sig, .. }, .. })
4856 | OwnerNode::ForeignItem(ForeignItem {
4857 kind: ForeignItemKind::Fn(fn_sig, _, _), ..
4858 }) => Some(fn_sig.decl),
4859 _ => None,
4860 }
4861 }
4862
4863 pub fn body_id(&self) -> Option<BodyId> {
4864 match self {
4865 OwnerNode::Item(Item {
4866 kind:
4867 ItemKind::Static(_, _, _, body)
4868 | ItemKind::Const(.., ConstItemRhs::Body(body))
4869 | ItemKind::Fn { body, .. },
4870 ..
4871 })
4872 | OwnerNode::TraitItem(TraitItem {
4873 kind:
4874 TraitItemKind::Fn(_, TraitFn::Provided(body))
4875 | TraitItemKind::Const(_, Some(ConstItemRhs::Body(body))),
4876 ..
4877 })
4878 | OwnerNode::ImplItem(ImplItem {
4879 kind: ImplItemKind::Fn(_, body) | ImplItemKind::Const(_, ConstItemRhs::Body(body)),
4880 ..
4881 }) => Some(*body),
4882 _ => None,
4883 }
4884 }
4885
4886 pub fn generics(self) -> Option<&'hir Generics<'hir>> {
4887 Node::generics(self.into())
4888 }
4889
4890 pub fn def_id(self) -> OwnerId {
4891 match self {
4892 OwnerNode::Item(Item { owner_id, .. })
4893 | OwnerNode::TraitItem(TraitItem { owner_id, .. })
4894 | OwnerNode::ImplItem(ImplItem { owner_id, .. })
4895 | OwnerNode::ForeignItem(ForeignItem { owner_id, .. }) => *owner_id,
4896 OwnerNode::Crate(..) => rustc_hir_id::CRATE_HIR_ID.owner,
4897 OwnerNode::Synthetic => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
4898 }
4899 }
4900
4901 pub fn is_impl_block(&self) -> bool {
4903 #[allow(non_exhaustive_omitted_patterns)] match self {
OwnerNode::Item(Item { kind: ItemKind::Impl(_), .. }) => true,
_ => false,
}matches!(self, OwnerNode::Item(Item { kind: ItemKind::Impl(_), .. }))
4904 }
4905
4906 #[track_caller]
pub fn expect_item(&self) -> &'hir Item<'hir> {
let OwnerNode::Item(n) = self else { expect_failed("expect_item", self) };
n
}
#[track_caller]
pub fn expect_foreign_item(&self) -> &'hir ForeignItem<'hir> {
let OwnerNode::ForeignItem(n) =
self else { expect_failed("expect_foreign_item", self) };
n
}
#[track_caller]
pub fn expect_impl_item(&self) -> &'hir ImplItem<'hir> {
let OwnerNode::ImplItem(n) =
self else { expect_failed("expect_impl_item", self) };
n
}
#[track_caller]
pub fn expect_trait_item(&self) -> &'hir TraitItem<'hir> {
let OwnerNode::TraitItem(n) =
self else { expect_failed("expect_trait_item", self) };
n
}expect_methods_self! {
4907 expect_item, &'hir Item<'hir>, OwnerNode::Item(n), n;
4908 expect_foreign_item, &'hir ForeignItem<'hir>, OwnerNode::ForeignItem(n), n;
4909 expect_impl_item, &'hir ImplItem<'hir>, OwnerNode::ImplItem(n), n;
4910 expect_trait_item, &'hir TraitItem<'hir>, OwnerNode::TraitItem(n), n;
4911 }
4912}
4913
4914impl<'hir> From<&'hir Item<'hir>> for OwnerNode<'hir> {
4915 fn from(val: &'hir Item<'hir>) -> Self {
4916 OwnerNode::Item(val)
4917 }
4918}
4919
4920impl<'hir> From<&'hir ForeignItem<'hir>> for OwnerNode<'hir> {
4921 fn from(val: &'hir ForeignItem<'hir>) -> Self {
4922 OwnerNode::ForeignItem(val)
4923 }
4924}
4925
4926impl<'hir> From<&'hir ImplItem<'hir>> for OwnerNode<'hir> {
4927 fn from(val: &'hir ImplItem<'hir>) -> Self {
4928 OwnerNode::ImplItem(val)
4929 }
4930}
4931
4932impl<'hir> From<&'hir TraitItem<'hir>> for OwnerNode<'hir> {
4933 fn from(val: &'hir TraitItem<'hir>) -> Self {
4934 OwnerNode::TraitItem(val)
4935 }
4936}
4937
4938impl<'hir> From<OwnerNode<'hir>> for Node<'hir> {
4939 fn from(val: OwnerNode<'hir>) -> Self {
4940 match val {
4941 OwnerNode::Item(n) => Node::Item(n),
4942 OwnerNode::ForeignItem(n) => Node::ForeignItem(n),
4943 OwnerNode::ImplItem(n) => Node::ImplItem(n),
4944 OwnerNode::TraitItem(n) => Node::TraitItem(n),
4945 OwnerNode::Crate(n) => Node::Crate(n),
4946 OwnerNode::Synthetic => Node::Synthetic,
4947 }
4948 }
4949}
4950
4951#[derive(#[automatically_derived]
impl<'hir> ::core::marker::Copy for Node<'hir> { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl<'hir> ::core::clone::TrivialClone for Node<'hir> { }
#[automatically_derived]
impl<'hir> ::core::clone::Clone for Node<'hir> {
#[inline]
fn clone(&self) -> Self {
let _: ::core::clone::AssertParamIsClone<&'hir Param<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Item<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir UseTree<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ForeignItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TraitItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ImplItem<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Variant<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir FieldDef<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir AnonConst>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstBlock>;
let _: ::core::clone::AssertParamIsClone<&'hir ConstArg<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Expr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir ExprField<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir ConstArgExprField<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Stmt<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir PathSegment<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Ty<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir AssocItemConstraint<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TraitRef<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir OpaqueTy<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir TyPat<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Pat<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir PatField<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir PatExpr<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Arm<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Block<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir LetStmt<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir VariantData<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Lifetime>;
let _: ::core::clone::AssertParamIsClone<&'hir GenericParam<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir Mod<'hir>>;
let _: ::core::clone::AssertParamIsClone<&'hir InferArg>;
let _: ::core::clone::AssertParamIsClone<&'hir WherePredicate<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir PreciseCapturingNonLifetimeArg>;
let _:
::core::clone::AssertParamIsClone<&'hir TestBinderForall<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir TestBinderExists<'hir>>;
let _:
::core::clone::AssertParamIsClone<&'hir TestBinderBoundTypeConstraint<'hir>>;
let _: ::core::clone::AssertParamIsClone<Span>;
*self
}
}Clone, #[automatically_derived]
impl<'hir> ::core::fmt::Debug for Node<'hir> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Self::Param(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Param",
&__self_0),
Self::Item(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Item",
&__self_0),
Self::NestedUseTree(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"NestedUseTree", &__self_0),
Self::ForeignItem(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ForeignItem", &__self_0),
Self::TraitItem(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TraitItem", &__self_0),
Self::ImplItem(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ImplItem", &__self_0),
Self::Variant(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Variant", &__self_0),
Self::Field(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Field",
&__self_0),
Self::AnonConst(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"AnonConst", &__self_0),
Self::ConstBlock(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ConstBlock", &__self_0),
Self::ConstArg(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ConstArg", &__self_0),
Self::Expr(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Expr",
&__self_0),
Self::ExprField(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ExprField", &__self_0),
Self::ConstArgExprField(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"ConstArgExprField", &__self_0),
Self::Stmt(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Stmt",
&__self_0),
Self::PathSegment(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"PathSegment", &__self_0),
Self::Ty(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ty",
&__self_0),
Self::AssocItemConstraint(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"AssocItemConstraint", &__self_0),
Self::TraitRef(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TraitRef", &__self_0),
Self::OpaqueTy(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"OpaqueTy", &__self_0),
Self::TyPat(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "TyPat",
&__self_0),
Self::Pat(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Pat",
&__self_0),
Self::PatField(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"PatField", &__self_0),
Self::PatExpr(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"PatExpr", &__self_0),
Self::Arm(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Arm",
&__self_0),
Self::Block(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Block",
&__self_0),
Self::LetStmt(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"LetStmt", &__self_0),
Self::Ctor(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Ctor",
&__self_0),
Self::Lifetime(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Lifetime", &__self_0),
Self::GenericParam(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"GenericParam", &__self_0),
Self::Crate(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Crate",
&__self_0),
Self::Infer(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Infer",
&__self_0),
Self::WherePredicate(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"WherePredicate", &__self_0),
Self::PreciseCapturingNonLifetimeArg(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"PreciseCapturingNonLifetimeArg", &__self_0),
Self::TestBinderForall(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TestBinderForall", &__self_0),
Self::TestBinderExists(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TestBinderExists", &__self_0),
Self::TestBinderBoundTypeConstraint(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"TestBinderBoundTypeConstraint", &__self_0),
Self::Synthetic =>
::core::fmt::Formatter::write_str(f, "Synthetic"),
Self::Err(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Err",
&__self_0),
}
}
}Debug, const _: () =
{
impl<'hir> ::rustc_data_structures::stable_hash::StableHash for
Node<'hir> {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Node::Param(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Item(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::NestedUseTree(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ForeignItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TraitItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ImplItem(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Variant(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Field(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::AnonConst(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ConstBlock(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ConstArg(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Expr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ExprField(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::ConstArgExprField(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Stmt(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::PathSegment(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Ty(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::AssocItemConstraint(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TraitRef(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::OpaqueTy(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TyPat(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Pat(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::PatField(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::PatExpr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Arm(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Block(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::LetStmt(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Ctor(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Lifetime(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::GenericParam(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Crate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Infer(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::WherePredicate(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::PreciseCapturingNonLifetimeArg(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TestBinderForall(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TestBinderExists(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::TestBinderBoundTypeConstraint(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Node::Synthetic => {}
Node::Err(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
4952pub enum Node<'hir> {
4953 Param(&'hir Param<'hir>),
4954 Item(&'hir Item<'hir>),
4955 NestedUseTree(&'hir UseTree<'hir>),
4956 ForeignItem(&'hir ForeignItem<'hir>),
4957 TraitItem(&'hir TraitItem<'hir>),
4958 ImplItem(&'hir ImplItem<'hir>),
4959 Variant(&'hir Variant<'hir>),
4960 Field(&'hir FieldDef<'hir>),
4961 AnonConst(&'hir AnonConst),
4962 ConstBlock(&'hir ConstBlock),
4963 ConstArg(&'hir ConstArg<'hir>),
4964 Expr(&'hir Expr<'hir>),
4965 ExprField(&'hir ExprField<'hir>),
4966 ConstArgExprField(&'hir ConstArgExprField<'hir>),
4967 Stmt(&'hir Stmt<'hir>),
4968 PathSegment(&'hir PathSegment<'hir>),
4969 Ty(&'hir Ty<'hir>),
4970 AssocItemConstraint(&'hir AssocItemConstraint<'hir>),
4971 TraitRef(&'hir TraitRef<'hir>),
4972 OpaqueTy(&'hir OpaqueTy<'hir>),
4973 TyPat(&'hir TyPat<'hir>),
4974 Pat(&'hir Pat<'hir>),
4975 PatField(&'hir PatField<'hir>),
4976 PatExpr(&'hir PatExpr<'hir>),
4980 Arm(&'hir Arm<'hir>),
4981 Block(&'hir Block<'hir>),
4982 LetStmt(&'hir LetStmt<'hir>),
4983 Ctor(&'hir VariantData<'hir>),
4986 Lifetime(&'hir Lifetime),
4987 GenericParam(&'hir GenericParam<'hir>),
4988 Crate(&'hir Mod<'hir>),
4989 Infer(&'hir InferArg),
4990 WherePredicate(&'hir WherePredicate<'hir>),
4991 PreciseCapturingNonLifetimeArg(&'hir PreciseCapturingNonLifetimeArg),
4992 TestBinderForall(&'hir TestBinderForall<'hir>),
4993 TestBinderExists(&'hir TestBinderExists<'hir>),
4994 TestBinderBoundTypeConstraint(&'hir TestBinderBoundTypeConstraint<'hir>),
4995 Synthetic,
4997 Err(Span),
4998}
4999
5000impl<'hir> Node<'hir> {
5001 pub fn ident(&self) -> Option<Ident> {
5016 match self {
5017 Node::Item(item) => item.kind.ident(),
5018 Node::TraitItem(TraitItem { ident, .. })
5019 | Node::ImplItem(ImplItem { ident, .. })
5020 | Node::ForeignItem(ForeignItem { ident, .. })
5021 | Node::NestedUseTree(UseTree { kind: UseKind::Single(ident), .. })
5022 | Node::Field(FieldDef { ident, .. })
5023 | Node::Variant(Variant { ident, .. })
5024 | Node::PathSegment(PathSegment { ident, .. }) => Some(*ident),
5025 Node::Lifetime(lt) => Some(lt.ident),
5026 Node::GenericParam(p) => Some(p.name.ident()),
5027 Node::AssocItemConstraint(c) => Some(c.ident),
5028 Node::PatField(f) => Some(f.ident),
5029 Node::ExprField(f) => Some(f.ident),
5030 Node::ConstArgExprField(f) => Some(f.field),
5031 Node::PreciseCapturingNonLifetimeArg(a) => Some(a.ident),
5032 Node::Param(..)
5033 | Node::AnonConst(..)
5034 | Node::ConstBlock(..)
5035 | Node::ConstArg(..)
5036 | Node::Expr(..)
5037 | Node::Stmt(..)
5038 | Node::Block(..)
5039 | Node::Ctor(..)
5040 | Node::Pat(..)
5041 | Node::TyPat(..)
5042 | Node::PatExpr(..)
5043 | Node::Arm(..)
5044 | Node::LetStmt(..)
5045 | Node::Crate(..)
5046 | Node::Ty(..)
5047 | Node::TraitRef(..)
5048 | Node::OpaqueTy(..)
5049 | Node::NestedUseTree(_)
5050 | Node::Infer(..)
5051 | Node::WherePredicate(..)
5052 | Node::TestBinderForall(..)
5053 | Node::TestBinderExists(..)
5054 | Node::TestBinderBoundTypeConstraint(..)
5055 | Node::Synthetic
5056 | Node::Err(..) => None,
5057 }
5058 }
5059
5060 pub fn fn_decl(self) -> Option<&'hir FnDecl<'hir>> {
5061 match self {
5062 Node::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
5063 | Node::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
5064 | Node::Item(Item { kind: ItemKind::Fn { sig: fn_sig, .. }, .. })
5065 | Node::ForeignItem(ForeignItem { kind: ForeignItemKind::Fn(fn_sig, _, _), .. }) => {
5066 Some(fn_sig.decl)
5067 }
5068 Node::Expr(Expr { kind: ExprKind::Closure(Closure { fn_decl, .. }), .. }) => {
5069 Some(fn_decl)
5070 }
5071 _ => None,
5072 }
5073 }
5074
5075 pub fn impl_block_of_trait(self, trait_def_id: DefId) -> Option<&'hir Impl<'hir>> {
5077 if let Node::Item(Item { kind: ItemKind::Impl(impl_block), .. }) = self
5078 && let Some(of_trait) = impl_block.of_trait
5079 && let Some(trait_id) = of_trait.trait_ref.trait_def_id()
5080 && trait_id == trait_def_id
5081 {
5082 Some(impl_block)
5083 } else {
5084 None
5085 }
5086 }
5087
5088 pub fn fn_sig(self) -> Option<&'hir FnSig<'hir>> {
5089 match self {
5090 Node::TraitItem(TraitItem { kind: TraitItemKind::Fn(fn_sig, _), .. })
5091 | Node::ImplItem(ImplItem { kind: ImplItemKind::Fn(fn_sig, _), .. })
5092 | Node::Item(Item { kind: ItemKind::Fn { sig: fn_sig, .. }, .. })
5093 | Node::ForeignItem(ForeignItem { kind: ForeignItemKind::Fn(fn_sig, _, _), .. }) => {
5094 Some(fn_sig)
5095 }
5096 _ => None,
5097 }
5098 }
5099
5100 pub fn ty(self) -> Option<&'hir Ty<'hir>> {
5102 match self {
5103 Node::Item(it) => match it.kind {
5104 ItemKind::TyAlias(_, _, ty)
5105 | ItemKind::Static(_, _, ty, _)
5106 | ItemKind::Const(_, _, ty, _) => Some(ty),
5107 ItemKind::Impl(impl_item) => Some(&impl_item.self_ty),
5108 _ => None,
5109 },
5110 Node::TraitItem(it) => match it.kind {
5111 TraitItemKind::Const(ty, _) => Some(ty),
5112 TraitItemKind::Type(_, ty) => ty,
5113 _ => None,
5114 },
5115 Node::ImplItem(it) => match it.kind {
5116 ImplItemKind::Const(ty, _) => Some(ty),
5117 ImplItemKind::Type(ty) => Some(ty),
5118 _ => None,
5119 },
5120 Node::ForeignItem(it) => match it.kind {
5121 ForeignItemKind::Static(ty, ..) => Some(ty),
5122 _ => None,
5123 },
5124 Node::GenericParam(param) => match param.kind {
5125 GenericParamKind::Lifetime { .. } => None,
5126 GenericParamKind::Type { default, .. } => default,
5127 GenericParamKind::Const { ty, .. } => Some(ty),
5128 },
5129 Node::Field(f) => Some(f.ty),
5130 _ => None,
5131 }
5132 }
5133
5134 pub fn alias_ty(self) -> Option<&'hir Ty<'hir>> {
5135 match self {
5136 Node::Item(Item { kind: ItemKind::TyAlias(_, _, ty), .. }) => Some(ty),
5137 _ => None,
5138 }
5139 }
5140
5141 #[inline]
5142 pub fn associated_body(&self) -> Option<(LocalDefId, BodyId)> {
5143 match self {
5144 Node::Item(Item {
5145 owner_id,
5146 kind:
5147 ItemKind::Const(.., ConstItemRhs::Body(body))
5148 | ItemKind::Static(.., body)
5149 | ItemKind::Fn { body, .. },
5150 ..
5151 })
5152 | Node::TraitItem(TraitItem {
5153 owner_id,
5154 kind:
5155 TraitItemKind::Const(_, Some(ConstItemRhs::Body(body)))
5156 | TraitItemKind::Fn(_, TraitFn::Provided(body)),
5157 ..
5158 })
5159 | Node::ImplItem(ImplItem {
5160 owner_id,
5161 kind: ImplItemKind::Const(.., ConstItemRhs::Body(body)) | ImplItemKind::Fn(_, body),
5162 ..
5163 }) => Some((owner_id.def_id, *body)),
5164
5165 Node::Item(Item {
5166 owner_id, kind: ItemKind::GlobalAsm { asm: _, fake_body }, ..
5167 }) => Some((owner_id.def_id, *fake_body)),
5168
5169 Node::Expr(Expr { kind: ExprKind::Closure(Closure { def_id, body, .. }), .. }) => {
5170 Some((*def_id, *body))
5171 }
5172
5173 Node::AnonConst(constant) => Some((constant.def_id, constant.body)),
5174 Node::ConstBlock(constant) => Some((constant.def_id, constant.body)),
5175
5176 _ => None,
5177 }
5178 }
5179
5180 pub fn body_id(&self) -> Option<BodyId> {
5181 Some(self.associated_body()?.1)
5182 }
5183
5184 pub fn generics(self) -> Option<&'hir Generics<'hir>> {
5185 match self {
5186 Node::ForeignItem(ForeignItem {
5187 kind: ForeignItemKind::Fn(_, _, generics), ..
5188 })
5189 | Node::TraitItem(TraitItem { generics, .. })
5190 | Node::ImplItem(ImplItem { generics, .. }) => Some(generics),
5191 Node::Item(item) => item.kind.generics(),
5192 _ => None,
5193 }
5194 }
5195
5196 pub fn as_owner(self) -> Option<OwnerNode<'hir>> {
5197 match self {
5198 Node::Item(i) => Some(OwnerNode::Item(i)),
5199 Node::ForeignItem(i) => Some(OwnerNode::ForeignItem(i)),
5200 Node::TraitItem(i) => Some(OwnerNode::TraitItem(i)),
5201 Node::ImplItem(i) => Some(OwnerNode::ImplItem(i)),
5202 Node::Crate(i) => Some(OwnerNode::Crate(i)),
5203 Node::Synthetic => Some(OwnerNode::Synthetic),
5204 _ => None,
5205 }
5206 }
5207
5208 pub fn fn_kind(self) -> Option<FnKind<'hir>> {
5209 match self {
5210 Node::Item(i) => match i.kind {
5211 ItemKind::Fn { ident, sig, generics, .. } => {
5212 Some(FnKind::ItemFn(ident, generics, sig.header))
5213 }
5214 _ => None,
5215 },
5216 Node::TraitItem(ti) => match ti.kind {
5217 TraitItemKind::Fn(ref sig, _) => Some(FnKind::Method(ti.ident, sig)),
5218 _ => None,
5219 },
5220 Node::ImplItem(ii) => match ii.kind {
5221 ImplItemKind::Fn(ref sig, _) => Some(FnKind::Method(ii.ident, sig)),
5222 _ => None,
5223 },
5224 Node::Expr(e) => match e.kind {
5225 ExprKind::Closure { .. } => Some(FnKind::Closure),
5226 _ => None,
5227 },
5228 _ => None,
5229 }
5230 }
5231
5232 pub fn path(self) -> Option<&'hir QPath<'hir>> {
5234 match self {
5235 Node::Ty(Ty { kind: TyKind::Path(path), .. })
5236 | Node::Expr(Expr { kind: ExprKind::Path(path), .. })
5237 | Node::PatExpr(PatExpr { kind: PatExprKind::Path(path), .. }) => Some(path),
5238 _ => None,
5239 }
5240 }
5241
5242 #[track_caller]
pub fn expect_param(&self) -> &'hir Param<'hir> {
let Node::Param(n) = self else { expect_failed("expect_param", self) };
n
}
#[track_caller]
pub fn expect_item(&self) -> &'hir Item<'hir> {
let Node::Item(n) = self else { expect_failed("expect_item", self) };
n
}
#[track_caller]
pub fn expect_foreign_item(&self) -> &'hir ForeignItem<'hir> {
let Node::ForeignItem(n) =
self else { expect_failed("expect_foreign_item", self) };
n
}
#[track_caller]
pub fn expect_trait_item(&self) -> &'hir TraitItem<'hir> {
let Node::TraitItem(n) =
self else { expect_failed("expect_trait_item", self) };
n
}
#[track_caller]
pub fn expect_impl_item(&self) -> &'hir ImplItem<'hir> {
let Node::ImplItem(n) =
self else { expect_failed("expect_impl_item", self) };
n
}
#[track_caller]
pub fn expect_variant(&self) -> &'hir Variant<'hir> {
let Node::Variant(n) =
self else { expect_failed("expect_variant", self) };
n
}
#[track_caller]
pub fn expect_field(&self) -> &'hir FieldDef<'hir> {
let Node::Field(n) = self else { expect_failed("expect_field", self) };
n
}
#[track_caller]
pub fn expect_anon_const(&self) -> &'hir AnonConst {
let Node::AnonConst(n) =
self else { expect_failed("expect_anon_const", self) };
n
}
#[track_caller]
pub fn expect_inline_const(&self) -> &'hir ConstBlock {
let Node::ConstBlock(n) =
self else { expect_failed("expect_inline_const", self) };
n
}
#[track_caller]
pub fn expect_expr(&self) -> &'hir Expr<'hir> {
let Node::Expr(n) = self else { expect_failed("expect_expr", self) };
n
}
#[track_caller]
pub fn expect_expr_field(&self) -> &'hir ExprField<'hir> {
let Node::ExprField(n) =
self else { expect_failed("expect_expr_field", self) };
n
}
#[track_caller]
pub fn expect_stmt(&self) -> &'hir Stmt<'hir> {
let Node::Stmt(n) = self else { expect_failed("expect_stmt", self) };
n
}
#[track_caller]
pub fn expect_path_segment(&self) -> &'hir PathSegment<'hir> {
let Node::PathSegment(n) =
self else { expect_failed("expect_path_segment", self) };
n
}
#[track_caller]
pub fn expect_ty(&self) -> &'hir Ty<'hir> {
let Node::Ty(n) = self else { expect_failed("expect_ty", self) };
n
}
#[track_caller]
pub fn expect_assoc_item_constraint(&self)
-> &'hir AssocItemConstraint<'hir> {
let Node::AssocItemConstraint(n) =
self else { expect_failed("expect_assoc_item_constraint", self) };
n
}
#[track_caller]
pub fn expect_trait_ref(&self) -> &'hir TraitRef<'hir> {
let Node::TraitRef(n) =
self else { expect_failed("expect_trait_ref", self) };
n
}
#[track_caller]
pub fn expect_opaque_ty(&self) -> &'hir OpaqueTy<'hir> {
let Node::OpaqueTy(n) =
self else { expect_failed("expect_opaque_ty", self) };
n
}
#[track_caller]
pub fn expect_pat(&self) -> &'hir Pat<'hir> {
let Node::Pat(n) = self else { expect_failed("expect_pat", self) };
n
}
#[track_caller]
pub fn expect_pat_field(&self) -> &'hir PatField<'hir> {
let Node::PatField(n) =
self else { expect_failed("expect_pat_field", self) };
n
}
#[track_caller]
pub fn expect_arm(&self) -> &'hir Arm<'hir> {
let Node::Arm(n) = self else { expect_failed("expect_arm", self) };
n
}
#[track_caller]
pub fn expect_block(&self) -> &'hir Block<'hir> {
let Node::Block(n) = self else { expect_failed("expect_block", self) };
n
}
#[track_caller]
pub fn expect_let_stmt(&self) -> &'hir LetStmt<'hir> {
let Node::LetStmt(n) =
self else { expect_failed("expect_let_stmt", self) };
n
}
#[track_caller]
pub fn expect_ctor(&self) -> &'hir VariantData<'hir> {
let Node::Ctor(n) = self else { expect_failed("expect_ctor", self) };
n
}
#[track_caller]
pub fn expect_lifetime(&self) -> &'hir Lifetime {
let Node::Lifetime(n) =
self else { expect_failed("expect_lifetime", self) };
n
}
#[track_caller]
pub fn expect_generic_param(&self) -> &'hir GenericParam<'hir> {
let Node::GenericParam(n) =
self else { expect_failed("expect_generic_param", self) };
n
}
#[track_caller]
pub fn expect_crate(&self) -> &'hir Mod<'hir> {
let Node::Crate(n) = self else { expect_failed("expect_crate", self) };
n
}
#[track_caller]
pub fn expect_infer(&self) -> &'hir InferArg {
let Node::Infer(n) = self else { expect_failed("expect_infer", self) };
n
}
#[track_caller]
pub fn expect_closure(&self) -> &'hir Closure<'hir> {
let Node::Expr(Expr { kind: ExprKind::Closure(n), .. }) =
self else { expect_failed("expect_closure", self) };
n
}expect_methods_self! {
5243 expect_param, &'hir Param<'hir>, Node::Param(n), n;
5244 expect_item, &'hir Item<'hir>, Node::Item(n), n;
5245 expect_foreign_item, &'hir ForeignItem<'hir>, Node::ForeignItem(n), n;
5246 expect_trait_item, &'hir TraitItem<'hir>, Node::TraitItem(n), n;
5247 expect_impl_item, &'hir ImplItem<'hir>, Node::ImplItem(n), n;
5248 expect_variant, &'hir Variant<'hir>, Node::Variant(n), n;
5249 expect_field, &'hir FieldDef<'hir>, Node::Field(n), n;
5250 expect_anon_const, &'hir AnonConst, Node::AnonConst(n), n;
5251 expect_inline_const, &'hir ConstBlock, Node::ConstBlock(n), n;
5252 expect_expr, &'hir Expr<'hir>, Node::Expr(n), n;
5253 expect_expr_field, &'hir ExprField<'hir>, Node::ExprField(n), n;
5254 expect_stmt, &'hir Stmt<'hir>, Node::Stmt(n), n;
5255 expect_path_segment, &'hir PathSegment<'hir>, Node::PathSegment(n), n;
5256 expect_ty, &'hir Ty<'hir>, Node::Ty(n), n;
5257 expect_assoc_item_constraint, &'hir AssocItemConstraint<'hir>, Node::AssocItemConstraint(n), n;
5258 expect_trait_ref, &'hir TraitRef<'hir>, Node::TraitRef(n), n;
5259 expect_opaque_ty, &'hir OpaqueTy<'hir>, Node::OpaqueTy(n), n;
5260 expect_pat, &'hir Pat<'hir>, Node::Pat(n), n;
5261 expect_pat_field, &'hir PatField<'hir>, Node::PatField(n), n;
5262 expect_arm, &'hir Arm<'hir>, Node::Arm(n), n;
5263 expect_block, &'hir Block<'hir>, Node::Block(n), n;
5264 expect_let_stmt, &'hir LetStmt<'hir>, Node::LetStmt(n), n;
5265 expect_ctor, &'hir VariantData<'hir>, Node::Ctor(n), n;
5266 expect_lifetime, &'hir Lifetime, Node::Lifetime(n), n;
5267 expect_generic_param, &'hir GenericParam<'hir>, Node::GenericParam(n), n;
5268 expect_crate, &'hir Mod<'hir>, Node::Crate(n), n;
5269 expect_infer, &'hir InferArg, Node::Infer(n), n;
5270 expect_closure, &'hir Closure<'hir>, Node::Expr(Expr { kind: ExprKind::Closure(n), .. }), n;
5271 }
5272}
5273
5274#[cfg(target_pointer_width = "64")]
5276mod size_asserts {
5277 use rustc_data_structures::static_assert_size;
5278
5279 use super::*;
5280 const _: [(); 48] = [(); ::std::mem::size_of::<Block<'_>>()];static_assert_size!(Block<'_>, 48);
5282 const _: [(); 24] = [(); ::std::mem::size_of::<Body<'_>>()];static_assert_size!(Body<'_>, 24);
5283 const _: [(); 64] = [(); ::std::mem::size_of::<Expr<'_>>()];static_assert_size!(Expr<'_>, 64);
5284 const _: [(); 48] = [(); ::std::mem::size_of::<ExprKind<'_>>()];static_assert_size!(ExprKind<'_>, 48);
5285 const _: [(); 40] = [(); ::std::mem::size_of::<FnDecl<'_>>()];static_assert_size!(FnDecl<'_>, 40);
5286 const _: [(); 88] = [(); ::std::mem::size_of::<ForeignItem<'_>>()];static_assert_size!(ForeignItem<'_>, 88);
5287 const _: [(); 56] = [(); ::std::mem::size_of::<ForeignItemKind<'_>>()];static_assert_size!(ForeignItemKind<'_>, 56);
5288 const _: [(); 16] = [(); ::std::mem::size_of::<GenericArg<'_>>()];static_assert_size!(GenericArg<'_>, 16);
5289 const _: [(); 64] = [(); ::std::mem::size_of::<GenericBound<'_>>()];static_assert_size!(GenericBound<'_>, 64);
5290 const _: [(); 56] = [(); ::std::mem::size_of::<Generics<'_>>()];static_assert_size!(Generics<'_>, 56);
5291 const _: [(); 48] = [(); ::std::mem::size_of::<Impl<'_>>()];static_assert_size!(Impl<'_>, 48);
5292 const _: [(); 88] = [(); ::std::mem::size_of::<ImplItem<'_>>()];static_assert_size!(ImplItem<'_>, 88);
5293 const _: [(); 40] = [(); ::std::mem::size_of::<ImplItemKind<'_>>()];static_assert_size!(ImplItemKind<'_>, 40);
5294 const _: [(); 88] = [(); ::std::mem::size_of::<Item<'_>>()];static_assert_size!(Item<'_>, 88);
5295 const _: [(); 64] = [(); ::std::mem::size_of::<ItemKind<'_>>()];static_assert_size!(ItemKind<'_>, 64);
5296 const _: [(); 64] = [(); ::std::mem::size_of::<LetStmt<'_>>()];static_assert_size!(LetStmt<'_>, 64);
5297 const _: [(); 32] = [(); ::std::mem::size_of::<Param<'_>>()];static_assert_size!(Param<'_>, 32);
5298 const _: [(); 80] = [(); ::std::mem::size_of::<Pat<'_>>()];static_assert_size!(Pat<'_>, 80);
5299 const _: [(); 56] = [(); ::std::mem::size_of::<PatKind<'_>>()];static_assert_size!(PatKind<'_>, 56);
5300 const _: [(); 40] = [(); ::std::mem::size_of::<Path<'_>>()];static_assert_size!(Path<'_>, 40);
5301 const _: [(); 48] = [(); ::std::mem::size_of::<PathSegment<'_>>()];static_assert_size!(PathSegment<'_>, 48);
5302 const _: [(); 24] = [(); ::std::mem::size_of::<QPath<'_>>()];static_assert_size!(QPath<'_>, 24);
5303 const _: [(); 12] = [(); ::std::mem::size_of::<Res>()];static_assert_size!(Res, 12);
5304 const _: [(); 32] = [(); ::std::mem::size_of::<Stmt<'_>>()];static_assert_size!(Stmt<'_>, 32);
5305 const _: [(); 16] = [(); ::std::mem::size_of::<StmtKind<'_>>()];static_assert_size!(StmtKind<'_>, 16);
5306 const _: [(); 48] = [(); ::std::mem::size_of::<TraitImplHeader<'_>>()];static_assert_size!(TraitImplHeader<'_>, 48);
5307 const _: [(); 88] = [(); ::std::mem::size_of::<TraitItem<'_>>()];static_assert_size!(TraitItem<'_>, 88);
5308 const _: [(); 48] = [(); ::std::mem::size_of::<TraitItemKind<'_>>()];static_assert_size!(TraitItemKind<'_>, 48);
5309 const _: [(); 48] = [(); ::std::mem::size_of::<Ty<'_>>()];static_assert_size!(Ty<'_>, 48);
5310 const _: [(); 32] = [(); ::std::mem::size_of::<TyKind<'_>>()];static_assert_size!(TyKind<'_>, 32);
5311 }
5313
5314#[cfg(test)]
5315mod tests;