1use std::fmt;
4
5use rustc_data_structures::fx::FxHashSet;
6use rustc_data_structures::intern::Interned;
7use rustc_data_structures::unord::UnordSet;
8use rustc_index::{IndexSlice, IndexVec};
9use rustc_middle::ty::{
10 self, ReBound, ReEarlyParam, ReErased, ReError, ReLateParam, RePlaceholder, ReStatic, ReVar,
11 Region, RegionVid, Ty, TyCtxt, TypeFoldable, fold_regions,
12};
13use rustc_middle::{bug, span_bug};
14use rustc_span::Span;
15use tracing::{debug, instrument};
16
17use super::outlives::test_type_match;
18use crate::infer::lexical_region_resolve::indexed_edges::{EdgeDirection, IndexedConstraintEdges};
19use crate::infer::region_constraints::{
20 ConstraintKind, GenericKind, RegionConstraintData, VarInfos, VerifyBound,
21};
22use crate::infer::{RegionRelations, RegionVariableOrigin, SubregionOrigin};
23
24mod indexed_edges;
25
26#[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("resolve",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(31u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&[],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{ meta.fields().value_set(&[]) })
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return:
(LexicalRegionResolutions<'tcx>,
Vec<RegionResolutionError<'tcx>>) = loop {};
return __tracing_attr_fake_return;
}
{
if !data.constraints.iter().all(|(c, _)|
match c.kind {
ConstraintKind::VarSubVar | ConstraintKind::RegSubVar |
ConstraintKind::VarSubReg | ConstraintKind::RegSubReg =>
true,
ConstraintKind::VarEqVar | ConstraintKind::VarEqReg |
ConstraintKind::RegEqReg => false,
}) {
{
::core::panicking::panic_fmt(format_args!("Every constraint should be decomposed into outlives here"));
}
};
let mut errors = ::alloc::vec::Vec::new();
let mut resolver =
LexicalResolver { region_rels, var_infos, data };
let values = resolver.infer_variable_values(&mut errors);
(values, errors)
}
}
}#[instrument(level = "debug", skip(region_rels, var_infos, data))]
32pub(crate) fn resolve<'tcx>(
33 region_rels: &RegionRelations<'_, 'tcx>,
34 var_infos: VarInfos<'tcx>,
35 data: RegionConstraintData<'tcx>,
36) -> (LexicalRegionResolutions<'tcx>, Vec<RegionResolutionError<'tcx>>) {
37 assert!(
38 data.constraints.iter().all(|(c, _)| match c.kind {
39 ConstraintKind::VarSubVar
40 | ConstraintKind::RegSubVar
41 | ConstraintKind::VarSubReg
42 | ConstraintKind::RegSubReg => true,
43
44 ConstraintKind::VarEqVar | ConstraintKind::VarEqReg | ConstraintKind::RegEqReg => false,
45 }),
46 "Every constraint should be decomposed into outlives here"
47 );
48
49 let mut errors = vec![];
50 let mut resolver = LexicalResolver { region_rels, var_infos, data };
51 let values = resolver.infer_variable_values(&mut errors);
52 (values, errors)
53}
54
55#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for LexicalRegionResolutions<'tcx> {
#[inline]
fn clone(&self) -> LexicalRegionResolutions<'tcx> {
LexicalRegionResolutions {
values: ::core::clone::Clone::clone(&self.values),
}
}
}Clone)]
58pub(crate) struct LexicalRegionResolutions<'tcx> {
59 pub(crate) values: IndexVec<RegionVid, VarValue<'tcx>>,
60}
61
62#[derive(#[automatically_derived]
impl<'tcx> ::core::marker::Copy for VarValue<'tcx> { }Copy, #[automatically_derived]
impl<'tcx> ::core::clone::Clone for VarValue<'tcx> {
#[inline]
fn clone(&self) -> VarValue<'tcx> {
let _: ::core::clone::AssertParamIsClone<ty::UniverseIndex>;
let _: ::core::clone::AssertParamIsClone<Region<'tcx>>;
*self
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for VarValue<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
VarValue::Empty(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Empty",
&__self_0),
VarValue::Value(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Value",
&__self_0),
VarValue::ErrorValue =>
::core::fmt::Formatter::write_str(f, "ErrorValue"),
}
}
}Debug)]
63pub(crate) enum VarValue<'tcx> {
64 Empty(ty::UniverseIndex),
71 Value(Region<'tcx>),
72 ErrorValue,
73}
74
75#[derive(#[automatically_derived]
impl<'tcx> ::core::clone::Clone for RegionResolutionError<'tcx> {
#[inline]
fn clone(&self) -> RegionResolutionError<'tcx> {
match self {
RegionResolutionError::ConcreteFailure(__self_0, __self_1,
__self_2) =>
RegionResolutionError::ConcreteFailure(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2)),
RegionResolutionError::GenericBoundFailure(__self_0, __self_1,
__self_2) =>
RegionResolutionError::GenericBoundFailure(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2)),
RegionResolutionError::SubSupConflict(__self_0, __self_1,
__self_2, __self_3, __self_4, __self_5, __self_6) =>
RegionResolutionError::SubSupConflict(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2),
::core::clone::Clone::clone(__self_3),
::core::clone::Clone::clone(__self_4),
::core::clone::Clone::clone(__self_5),
::core::clone::Clone::clone(__self_6)),
RegionResolutionError::UpperBoundUniverseConflict(__self_0,
__self_1, __self_2, __self_3, __self_4) =>
RegionResolutionError::UpperBoundUniverseConflict(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2),
::core::clone::Clone::clone(__self_3),
::core::clone::Clone::clone(__self_4)),
RegionResolutionError::CannotNormalize(__self_0, __self_1) =>
RegionResolutionError::CannotNormalize(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
}
}
}Clone, #[automatically_derived]
impl<'tcx> ::core::fmt::Debug for RegionResolutionError<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
RegionResolutionError::ConcreteFailure(__self_0, __self_1,
__self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"ConcreteFailure", __self_0, __self_1, &__self_2),
RegionResolutionError::GenericBoundFailure(__self_0, __self_1,
__self_2) =>
::core::fmt::Formatter::debug_tuple_field3_finish(f,
"GenericBoundFailure", __self_0, __self_1, &__self_2),
RegionResolutionError::SubSupConflict(__self_0, __self_1,
__self_2, __self_3, __self_4, __self_5, __self_6) => {
let values: &[&dyn ::core::fmt::Debug] =
&[__self_0, __self_1, __self_2, __self_3, __self_4,
__self_5, &__self_6];
::core::fmt::Formatter::debug_tuple_fields_finish(f,
"SubSupConflict", values)
}
RegionResolutionError::UpperBoundUniverseConflict(__self_0,
__self_1, __self_2, __self_3, __self_4) =>
::core::fmt::Formatter::debug_tuple_field5_finish(f,
"UpperBoundUniverseConflict", __self_0, __self_1, __self_2,
__self_3, &__self_4),
RegionResolutionError::CannotNormalize(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f,
"CannotNormalize", __self_0, &__self_1),
}
}
}Debug)]
76pub enum RegionResolutionError<'tcx> {
77 ConcreteFailure(SubregionOrigin<'tcx>, Region<'tcx>, Region<'tcx>),
81
82 GenericBoundFailure(SubregionOrigin<'tcx>, GenericKind<'tcx>, Region<'tcx>),
87
88 SubSupConflict(
94 RegionVid,
95 RegionVariableOrigin<'tcx>,
96 SubregionOrigin<'tcx>,
97 Region<'tcx>,
98 SubregionOrigin<'tcx>,
99 Region<'tcx>,
100 Vec<Span>, ),
102
103 UpperBoundUniverseConflict(
106 RegionVid,
107 RegionVariableOrigin<'tcx>,
108 ty::UniverseIndex, SubregionOrigin<'tcx>, Region<'tcx>, ),
112
113 CannotNormalize(ty::PolyTypeOutlivesPredicate<'tcx>, SubregionOrigin<'tcx>),
114}
115
116impl<'tcx> RegionResolutionError<'tcx> {
117 pub fn origin(&self) -> &SubregionOrigin<'tcx> {
118 match self {
119 RegionResolutionError::ConcreteFailure(origin, _, _)
120 | RegionResolutionError::GenericBoundFailure(origin, _, _)
121 | RegionResolutionError::SubSupConflict(_, _, origin, _, _, _, _)
122 | RegionResolutionError::UpperBoundUniverseConflict(_, _, _, origin, _)
123 | RegionResolutionError::CannotNormalize(_, origin) => origin,
124 }
125 }
126}
127
128struct RegionAndOrigin<'tcx> {
129 region: Region<'tcx>,
130 origin: SubregionOrigin<'tcx>,
131}
132
133struct LexicalResolver<'cx, 'tcx> {
134 region_rels: &'cx RegionRelations<'cx, 'tcx>,
135 var_infos: VarInfos<'tcx>,
136 data: RegionConstraintData<'tcx>,
137}
138
139impl<'cx, 'tcx> LexicalResolver<'cx, 'tcx> {
140 fn tcx(&self) -> TyCtxt<'tcx> {
141 self.region_rels.tcx
142 }
143
144 fn infer_variable_values(
145 &mut self,
146 errors: &mut Vec<RegionResolutionError<'tcx>>,
147 ) -> LexicalRegionResolutions<'tcx> {
148 let mut var_data = self.construct_var_data();
149
150 let mut seen = UnordSet::default();
152 self.data.constraints.retain_mut(|(constraint, _)| {
153 constraint.visible_for_leak_check = ty::VisibleForLeakCheck::Unreachable;
155 seen.insert(*constraint)
156 });
157
158 if truecfg!(debug_assertions) {
159 self.dump_constraints();
160 }
161
162 self.expansion(&mut var_data);
163 self.collect_errors(&mut var_data, errors);
164 self.collect_var_errors(&var_data, errors);
165 var_data
166 }
167
168 fn num_vars(&self) -> usize {
169 self.var_infos.len()
170 }
171
172 fn construct_var_data(&self) -> LexicalRegionResolutions<'tcx> {
175 LexicalRegionResolutions {
176 values: IndexVec::<RegionVid, _>::from_fn_n(
177 |vid| {
178 let vid_universe = self.var_infos[vid].universe;
179 VarValue::Empty(vid_universe)
180 },
181 self.num_vars(),
182 ),
183 }
184 }
185
186 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("dump_constraints",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(186u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&[],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::DEBUG <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{ meta.fields().value_set(&[]) })
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: () = loop {};
return __tracing_attr_fake_return;
}
{
for (idx, (constraint, _)) in
self.data.constraints.iter().enumerate() {
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:189",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(189u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Constraint {0} => {1:?}",
idx, constraint) as &dyn Value))])
});
} else { ; }
};
}
}
}
}#[instrument(level = "debug", skip(self))]
187 fn dump_constraints(&self) {
188 for (idx, (constraint, _)) in self.data.constraints.iter().enumerate() {
189 debug!("Constraint {} => {:?}", idx, constraint);
190 }
191 }
192
193 fn expansion(&self, var_values: &mut LexicalRegionResolutions<'tcx>) {
194 let mut constraints = IndexVec::from_elem(Vec::new(), &var_values.values);
202 let mut changes = Vec::new();
204 for (c, _) in &self.data.constraints {
205 match c.kind {
206 ConstraintKind::RegSubVar => {
207 let sup_vid = c.sup.as_var();
208 let sup_data = var_values.value_mut(sup_vid);
209
210 if self.expand_node(c.sub, sup_vid, sup_data) {
211 changes.push(sup_vid);
212 }
213 }
214 ConstraintKind::VarSubVar => {
215 let sub_vid = c.sub.as_var();
216 let sup_vid = c.sup.as_var();
217 match *var_values.value(sub_vid) {
218 VarValue::ErrorValue => continue,
219 VarValue::Empty(sub_universe) => {
220 let sup_data = var_values.value_mut(sup_vid);
221
222 let changed = match *sup_data {
223 VarValue::Empty(sup_universe) => {
224 let ui = sub_universe.min(sup_universe);
227
228 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:228",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(228u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Expanding value of {0:?} from empty lifetime with universe {1:?} to empty lifetime with universe {2:?}",
sup_vid, sup_universe, ui) as &dyn Value))])
});
} else { ; }
};debug!(
229 "Expanding value of {:?} \
230 from empty lifetime with universe {:?} \
231 to empty lifetime with universe {:?}",
232 sup_vid, sup_universe, ui
233 );
234
235 *sup_data = VarValue::Empty(ui);
236 true
237 }
238 VarValue::Value(cur_region) => {
239 match cur_region.kind() {
240 RePlaceholder(placeholder)
245 if !sub_universe.can_name(placeholder.universe) =>
246 {
247 let lub = self.tcx().lifetimes.re_static;
248 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:248",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(248u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Expanding value of {0:?} from {1:?} to {2:?}",
sup_vid, cur_region, lub) as &dyn Value))])
});
} else { ; }
};debug!(
249 "Expanding value of {:?} from {:?} to {:?}",
250 sup_vid, cur_region, lub
251 );
252
253 *sup_data = VarValue::Value(lub);
254 true
255 }
256
257 _ => false,
258 }
259 }
260
261 VarValue::ErrorValue => false,
262 };
263
264 if changed {
265 changes.push(sup_vid);
266 }
267 match sup_data {
268 VarValue::Value(Region(Interned(ReStatic, _)))
269 | VarValue::ErrorValue => (),
270 _ => {
271 constraints[sub_vid].push((sub_vid, sup_vid));
272 constraints[sup_vid].push((sub_vid, sup_vid));
273 }
274 }
275 }
276 VarValue::Value(sub_region) => {
277 let sup_data = var_values.value_mut(sup_vid);
278
279 if self.expand_node(sub_region, sup_vid, sup_data) {
280 changes.push(sup_vid);
281 }
282 match sup_data {
283 VarValue::Value(Region(Interned(ReStatic, _)))
284 | VarValue::ErrorValue => (),
285 _ => {
286 constraints[sub_vid].push((sub_vid, sup_vid));
287 constraints[sup_vid].push((sub_vid, sup_vid));
288 }
289 }
290 }
291 }
292 }
293 ConstraintKind::RegSubReg | ConstraintKind::VarSubReg => {
294 continue;
297 }
298
299 ConstraintKind::VarEqVar | ConstraintKind::VarEqReg | ConstraintKind::RegEqReg => {
300 ::core::panicking::panic("internal error: entered unreachable code")unreachable!()
301 }
302 }
303 }
304
305 while let Some(vid) = changes.pop() {
306 constraints[vid].retain(|&(a_vid, b_vid)| {
307 let VarValue::Value(a_region) = *var_values.value(a_vid) else {
308 return false;
309 };
310 let b_data = var_values.value_mut(b_vid);
311 if self.expand_node(a_region, b_vid, b_data) {
312 changes.push(b_vid);
313 }
314 !#[allow(non_exhaustive_omitted_patterns)] match b_data {
VarValue::Value(Region(Interned(ReStatic, _))) | VarValue::ErrorValue =>
true,
_ => false,
}matches!(
315 b_data,
316 VarValue::Value(Region(Interned(ReStatic, _))) | VarValue::ErrorValue
317 )
318 });
319 }
320 }
321
322 fn expand_node(
327 &self,
328 a_region: Region<'tcx>,
329 b_vid: RegionVid,
330 b_data: &mut VarValue<'tcx>,
331 ) -> bool {
332 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:332",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(332u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("expand_node({0:?}, {1:?} == {2:?})",
a_region, b_vid, b_data) as &dyn Value))])
});
} else { ; }
};debug!("expand_node({:?}, {:?} == {:?})", a_region, b_vid, b_data);
333
334 match *b_data {
335 VarValue::Empty(empty_ui) => {
336 let lub = match a_region.kind() {
337 RePlaceholder(placeholder) => {
338 if empty_ui.can_name(placeholder.universe) {
342 ty::Region::new_placeholder(self.tcx(), placeholder)
343 } else {
344 self.tcx().lifetimes.re_static
345 }
346 }
347
348 _ => a_region,
349 };
350
351 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:351",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(351u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Expanding value of {0:?} from empty lifetime to {1:?}",
b_vid, lub) as &dyn Value))])
});
} else { ; }
};debug!("Expanding value of {:?} from empty lifetime to {:?}", b_vid, lub);
352
353 *b_data = VarValue::Value(lub);
354 true
355 }
356 VarValue::Value(cur_region) => {
357 let b_universe = self.var_infos[b_vid].universe;
361
362 let mut lub = self.lub_concrete_regions(a_region, cur_region);
363 if lub == cur_region {
364 return false;
365 }
366
367 if let ty::RePlaceholder(p) = lub.kind()
377 && b_universe.cannot_name(p.universe)
378 {
379 lub = self.tcx().lifetimes.re_static;
380 }
381
382 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:382",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(382u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("Expanding value of {0:?} from {1:?} to {2:?}",
b_vid, cur_region, lub) as &dyn Value))])
});
} else { ; }
};debug!("Expanding value of {:?} from {:?} to {:?}", b_vid, cur_region, lub);
383
384 *b_data = VarValue::Value(lub);
385 true
386 }
387
388 VarValue::ErrorValue => false,
389 }
390 }
391
392 fn sub_region_values(&self, a: VarValue<'tcx>, b: VarValue<'tcx>) -> bool {
394 match (a, b) {
395 (VarValue::ErrorValue, _) | (_, VarValue::ErrorValue) => return true,
397 (VarValue::Empty(a_ui), VarValue::Empty(b_ui)) => {
398 a_ui.min(b_ui) == b_ui
401 }
402 (VarValue::Value(a), VarValue::Empty(_)) => {
403 match a.kind() {
404 ReError(_) => false,
407
408 ReBound(..) | ReErased => {
409 ::rustc_middle::util::bug::bug_fmt(format_args!("cannot relate region: {0:?}",
a));bug!("cannot relate region: {:?}", a);
410 }
411
412 ReVar(v_id) => {
413 ::rustc_middle::util::bug::span_bug_fmt(self.var_infos[v_id].origin.span(),
format_args!("lub_concrete_regions invoked with non-concrete region: {0:?}",
a));span_bug!(
414 self.var_infos[v_id].origin.span(),
415 "lub_concrete_regions invoked with non-concrete region: {:?}",
416 a
417 );
418 }
419
420 ReStatic | ReEarlyParam(_) | ReLateParam(_) => {
421 false
427 }
428
429 RePlaceholder(_) => {
430 false
432 }
433 }
434 }
435 (VarValue::Empty(a_ui), VarValue::Value(b)) => {
436 match b.kind() {
437 ReError(_) => false,
440
441 ReBound(..) | ReErased => {
442 ::rustc_middle::util::bug::bug_fmt(format_args!("cannot relate region: {0:?}",
b));bug!("cannot relate region: {:?}", b);
443 }
444
445 ReVar(v_id) => {
446 ::rustc_middle::util::bug::span_bug_fmt(self.var_infos[v_id].origin.span(),
format_args!("lub_concrete_regions invoked with non-concrete regions: {0:?}",
b));span_bug!(
447 self.var_infos[v_id].origin.span(),
448 "lub_concrete_regions invoked with non-concrete regions: {:?}",
449 b
450 );
451 }
452
453 ReStatic | ReEarlyParam(_) | ReLateParam(_) => {
454 true
458 }
459
460 RePlaceholder(placeholder) => {
461 return a_ui.can_name(placeholder.universe);
465 }
466 }
467 }
468 (VarValue::Value(a), VarValue::Value(b)) => self.sub_concrete_regions(a, b),
469 }
470 }
471
472 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::TRACE <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("sub_concrete_regions",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::TRACE,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(473u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["a", "b"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::TRACE <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::TRACE <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
let mut iter = meta.fields().iter();
meta.fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&a)
as &dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&::tracing::field::debug(&b)
as &dyn Value))])
})
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: bool = loop {};
return __tracing_attr_fake_return;
}
{
let tcx = self.tcx();
let sub_free_regions =
|r1, r2|
self.region_rels.free_regions.sub_free_regions(tcx, r1, r2);
if b.is_free() && sub_free_regions(tcx.lifetimes.re_static, b) {
return true;
}
if a.is_free() && b.is_free() { return sub_free_regions(a, b); }
self.lub_concrete_regions(a, b) == b
}
}
}#[instrument(level = "trace", skip(self))]
474 fn sub_concrete_regions(&self, a: Region<'tcx>, b: Region<'tcx>) -> bool {
475 let tcx = self.tcx();
476 let sub_free_regions = |r1, r2| self.region_rels.free_regions.sub_free_regions(tcx, r1, r2);
477
478 if b.is_free() && sub_free_regions(tcx.lifetimes.re_static, b) {
481 return true;
482 }
483
484 if a.is_free() && b.is_free() {
490 return sub_free_regions(a, b);
491 }
492
493 self.lub_concrete_regions(a, b) == b
496 }
497
498 x;#[instrument(level = "trace", skip(self), ret)]
504 fn lub_concrete_regions(&self, a: Region<'tcx>, b: Region<'tcx>) -> Region<'tcx> {
505 match (a.kind(), b.kind()) {
506 (ReBound(..), _) | (_, ReBound(..)) | (ReErased, _) | (_, ReErased) => {
507 bug!("cannot relate region: LUB({:?}, {:?})", a, b);
508 }
509
510 (ReVar(v_id), _) | (_, ReVar(v_id)) => {
511 span_bug!(
512 self.var_infos[v_id].origin.span(),
513 "lub_concrete_regions invoked with non-concrete \
514 regions: {:?}, {:?}",
515 a,
516 b
517 );
518 }
519
520 (ReError(_), _) => a,
521
522 (_, ReError(_)) => b,
523
524 (ReStatic, _) | (_, ReStatic) => {
525 self.tcx().lifetimes.re_static
527 }
528
529 (ReEarlyParam(_) | ReLateParam(_), ReEarlyParam(_) | ReLateParam(_)) => {
530 self.region_rels.lub_param_regions(a, b)
531 }
532
533 (RePlaceholder(..), _) | (_, RePlaceholder(..)) => {
536 if a == b {
537 a
538 } else {
539 self.tcx().lifetimes.re_static
540 }
541 }
542 }
543 }
544
545 #[allow(clippy :: suspicious_else_formatting)]
{
let __tracing_attr_span;
let __tracing_attr_guard;
if ::tracing::Level::INFO <= ::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::INFO <=
::tracing::level_filters::LevelFilter::current() ||
{ false } {
__tracing_attr_span =
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("collect_errors",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::INFO,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(548u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&[],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::SPAN)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let mut interest = ::tracing::subscriber::Interest::never();
if ::tracing::Level::INFO <=
::tracing::level_filters::STATIC_MAX_LEVEL &&
::tracing::Level::INFO <=
::tracing::level_filters::LevelFilter::current() &&
{ interest = __CALLSITE.interest(); !interest.is_never() }
&&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest) {
let meta = __CALLSITE.metadata();
::tracing::Span::new(meta,
&{ meta.fields().value_set(&[]) })
} else {
let span =
::tracing::__macro_support::__disabled_span(__CALLSITE.metadata());
{};
span
}
};
__tracing_attr_guard = __tracing_attr_span.enter();
}
#[warn(clippy :: suspicious_else_formatting)]
{
#[allow(unknown_lints, unreachable_code, clippy ::
diverging_sub_expression, clippy :: empty_loop, clippy ::
let_unit_value, clippy :: let_with_type_underscore, clippy ::
needless_return, clippy :: unreachable)]
if false {
let __tracing_attr_fake_return: () = loop {};
return __tracing_attr_fake_return;
}
{
for (c, origin) in &self.data.constraints {
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:555",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(555u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["c", "origin"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&debug(&c) as
&dyn Value)),
(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&debug(&origin) as
&dyn Value))])
});
} else { ; }
};
match c.kind {
ConstraintKind::RegSubVar | ConstraintKind::VarSubVar => {}
ConstraintKind::RegSubReg => {
if self.sub_concrete_regions(c.sub, c.sup) { continue; }
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:566",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(566u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("region error at {0:?}: cannot verify that {1:?} <= {2:?}",
origin, c.sub, c.sup) as &dyn Value))])
});
} else { ; }
};
errors.push(RegionResolutionError::ConcreteFailure((*origin).clone(),
c.sub, c.sup));
}
ConstraintKind::VarSubReg => {
let sub_vid = c.sub.as_var();
let sub_data = var_data.value_mut(sub_vid);
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:581",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(581u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("contraction: {0:?} == {1:?}, {2:?}",
sub_vid, sub_data, c.sup) as &dyn Value))])
});
} else { ; }
};
let VarValue::Value(sub_region) =
*sub_data else { continue; };
if !self.sub_concrete_regions(sub_region, c.sup) {
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:591",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(591u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("region error at {0:?}: cannot verify that {1:?}={2:?} <= {3:?}",
origin, sub_vid, sub_region, c.sup) as &dyn Value))])
});
} else { ; }
};
*sub_data = VarValue::ErrorValue;
}
}
ConstraintKind::VarEqVar | ConstraintKind::VarEqReg |
ConstraintKind::RegEqReg => {
::core::panicking::panic("internal error: entered unreachable code")
}
}
}
for verify in &self.data.verifys {
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:606",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(606u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("collect_errors: verify={0:?}",
verify) as &dyn Value))])
});
} else { ; }
};
let sub = var_data.normalize(self.tcx(), verify.region);
let verify_kind_ty = verify.kind.to_ty(self.tcx());
let verify_kind_ty =
var_data.normalize(self.tcx(), verify_kind_ty);
if self.bound_is_met(&verify.bound, var_data, verify_kind_ty,
sub) {
continue;
}
{
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:615",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(615u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("collect_errors: region error at {0:?}: cannot verify that {1:?} <= {2:?}",
verify.origin, verify.region, verify.bound) as
&dyn Value))])
});
} else { ; }
};
errors.push(RegionResolutionError::GenericBoundFailure(verify.origin.clone(),
verify.kind, sub));
}
}
}
}#[instrument(skip(self, var_data, errors))]
549 fn collect_errors(
550 &self,
551 var_data: &mut LexicalRegionResolutions<'tcx>,
552 errors: &mut Vec<RegionResolutionError<'tcx>>,
553 ) {
554 for (c, origin) in &self.data.constraints {
555 debug!(?c, ?origin);
556 match c.kind {
557 ConstraintKind::RegSubVar | ConstraintKind::VarSubVar => {
558 }
560
561 ConstraintKind::RegSubReg => {
562 if self.sub_concrete_regions(c.sub, c.sup) {
563 continue;
564 }
565
566 debug!(
567 "region error at {:?}: cannot verify that {:?} <= {:?}",
568 origin, c.sub, c.sup
569 );
570
571 errors.push(RegionResolutionError::ConcreteFailure(
572 (*origin).clone(),
573 c.sub,
574 c.sup,
575 ));
576 }
577
578 ConstraintKind::VarSubReg => {
579 let sub_vid = c.sub.as_var();
580 let sub_data = var_data.value_mut(sub_vid);
581 debug!("contraction: {:?} == {:?}, {:?}", sub_vid, sub_data, c.sup);
582
583 let VarValue::Value(sub_region) = *sub_data else {
584 continue;
585 };
586
587 if !self.sub_concrete_regions(sub_region, c.sup) {
591 debug!(
592 "region error at {:?}: cannot verify that {:?}={:?} <= {:?}",
593 origin, sub_vid, sub_region, c.sup
594 );
595 *sub_data = VarValue::ErrorValue;
596 }
597 }
598
599 ConstraintKind::VarEqVar | ConstraintKind::VarEqReg | ConstraintKind::RegEqReg => {
600 unreachable!()
601 }
602 }
603 }
604
605 for verify in &self.data.verifys {
606 debug!("collect_errors: verify={:?}", verify);
607 let sub = var_data.normalize(self.tcx(), verify.region);
608
609 let verify_kind_ty = verify.kind.to_ty(self.tcx());
610 let verify_kind_ty = var_data.normalize(self.tcx(), verify_kind_ty);
611 if self.bound_is_met(&verify.bound, var_data, verify_kind_ty, sub) {
612 continue;
613 }
614
615 debug!(
616 "collect_errors: region error at {:?}: \
617 cannot verify that {:?} <= {:?}",
618 verify.origin, verify.region, verify.bound
619 );
620
621 errors.push(RegionResolutionError::GenericBoundFailure(
622 verify.origin.clone(),
623 verify.kind,
624 sub,
625 ));
626 }
627 }
628
629 fn collect_var_errors(
632 &self,
633 var_data: &LexicalRegionResolutions<'tcx>,
634 errors: &mut Vec<RegionResolutionError<'tcx>>,
635 ) {
636 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:636",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(636u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("collect_var_errors, var_data = {0:#?}",
var_data.values) as &dyn Value))])
});
} else { ; }
};debug!("collect_var_errors, var_data = {:#?}", var_data.values);
637
638 let mut dup_vec = IndexVec::from_elem_n(None, self.num_vars());
650
651 let mut edges: Option<IndexedConstraintEdges<'_, 'tcx>> = None;
653
654 for (node_vid, value) in var_data.values.iter_enumerated() {
655 match *value {
656 VarValue::Empty(_) | VarValue::Value(_) => { }
657 VarValue::ErrorValue => {
658 let e = edges.get_or_insert_with(|| {
687 IndexedConstraintEdges::build_index(self.num_vars(), &self.data)
688 });
689 self.collect_error_for_expanding_node(e, &mut dup_vec, node_vid, errors);
690 }
691 }
692 }
693 }
694
695 fn collect_error_for_expanding_node(
696 &self,
697 edges: &IndexedConstraintEdges<'_, 'tcx>,
698 dup_vec: &mut IndexSlice<RegionVid, Option<RegionVid>>,
699 node_idx: RegionVid,
700 errors: &mut Vec<RegionResolutionError<'tcx>>,
701 ) {
702 let (mut lower_bounds, lower_vid_bounds, lower_dup) =
705 self.collect_bounding_regions(edges, node_idx, EdgeDirection::In, Some(dup_vec));
706 let (mut upper_bounds, _, upper_dup) =
707 self.collect_bounding_regions(edges, node_idx, EdgeDirection::Out, Some(dup_vec));
708
709 if lower_dup || upper_dup {
710 return;
711 }
712
713 fn region_order_key(x: &RegionAndOrigin<'_>) -> u8 {
717 match x.region.kind() {
718 ReEarlyParam(_) => 0,
719 ReLateParam(_) => 1,
720 _ => 2,
721 }
722 }
723 lower_bounds.sort_by_key(region_order_key);
724 upper_bounds.sort_by_key(region_order_key);
725
726 let node_universe = self.var_infos[node_idx].universe;
727
728 for lower_bound in &lower_bounds {
729 let effective_lower_bound = if let ty::RePlaceholder(p) = lower_bound.region.kind() {
730 if node_universe.cannot_name(p.universe) {
731 self.tcx().lifetimes.re_static
732 } else {
733 lower_bound.region
734 }
735 } else {
736 lower_bound.region
737 };
738
739 for upper_bound in &upper_bounds {
740 if !self.sub_concrete_regions(effective_lower_bound, upper_bound.region) {
741 let origin = self.var_infos[node_idx].origin;
742 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:742",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(742u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("region inference error at {0:?} for {1:?}: SubSupConflict sub: {2:?} sup: {3:?}",
origin, node_idx, lower_bound.region, upper_bound.region) as
&dyn Value))])
});
} else { ; }
};debug!(
743 "region inference error at {:?} for {:?}: SubSupConflict sub: {:?} \
744 sup: {:?}",
745 origin, node_idx, lower_bound.region, upper_bound.region
746 );
747
748 errors.push(RegionResolutionError::SubSupConflict(
749 node_idx,
750 origin,
751 lower_bound.origin.clone(),
752 lower_bound.region,
753 upper_bound.origin.clone(),
754 upper_bound.region,
755 ::alloc::vec::Vec::new()vec![],
756 ));
757 return;
758 }
759 }
760 }
761
762 #[allow(rustc::potential_query_instability)]
770 let min_universe = lower_vid_bounds
771 .into_iter()
772 .map(|vid| self.var_infos[vid].universe)
773 .min()
774 .expect("lower_vid_bounds should at least include `node_idx`");
775
776 for upper_bound in &upper_bounds {
777 if let ty::RePlaceholder(p) = upper_bound.region.kind() {
778 if min_universe.cannot_name(p.universe) {
779 let origin = self.var_infos[node_idx].origin;
780 errors.push(RegionResolutionError::UpperBoundUniverseConflict(
781 node_idx,
782 origin,
783 min_universe,
784 upper_bound.origin.clone(),
785 upper_bound.region,
786 ));
787 return;
788 }
789 }
790 }
791
792 if !self.tcx().dcx().has_errors().is_some() {
{
::core::panicking::panic_fmt(format_args!("collect_error_for_expanding_node() could not find error for var {0:?} in universe {1:?}, lower_bounds={2:#?}, upper_bounds={3:#?}",
node_idx, node_universe, lower_bounds, upper_bounds));
}
};assert!(
795 self.tcx().dcx().has_errors().is_some(),
796 "collect_error_for_expanding_node() could not find error for var {node_idx:?} in \
797 universe {node_universe:?}, lower_bounds={lower_bounds:#?}, \
798 upper_bounds={upper_bounds:#?}",
799 );
800 }
801
802 fn collect_bounding_regions(
814 &self,
815 edges: &IndexedConstraintEdges<'_, 'tcx>,
816 orig_node_idx: RegionVid,
817 dir: EdgeDirection,
818 mut dup_vec: Option<&mut IndexSlice<RegionVid, Option<RegionVid>>>,
819 ) -> (Vec<RegionAndOrigin<'tcx>>, FxHashSet<RegionVid>, bool) {
820 struct WalkState<'tcx> {
821 set: FxHashSet<RegionVid>,
822 stack: Vec<RegionVid>,
823 result: Vec<RegionAndOrigin<'tcx>>,
824 dup_found: bool,
825 }
826 let mut state = WalkState {
827 set: Default::default(),
828 stack: ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[orig_node_idx]))vec![orig_node_idx],
829 result: Vec::new(),
830 dup_found: false,
831 };
832 state.set.insert(orig_node_idx);
833
834 process_edges(&mut state, edges, orig_node_idx, dir);
837
838 while let Some(node_idx) = state.stack.pop() {
839 if let Some(dup_vec) = &mut dup_vec {
841 if dup_vec[node_idx].is_none() {
842 dup_vec[node_idx] = Some(orig_node_idx);
843 } else if dup_vec[node_idx] != Some(orig_node_idx) {
844 state.dup_found = true;
845 }
846
847 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:847",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(847u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("collect_concrete_regions(orig_node_idx={0:?}, node_idx={1:?})",
orig_node_idx, node_idx) as &dyn Value))])
});
} else { ; }
};debug!(
848 "collect_concrete_regions(orig_node_idx={:?}, node_idx={:?})",
849 orig_node_idx, node_idx
850 );
851 }
852
853 process_edges(&mut state, edges, node_idx, dir);
854 }
855
856 let WalkState { result, dup_found, set, .. } = state;
857 return (result, set, dup_found);
858
859 fn process_edges<'tcx>(
860 state: &mut WalkState<'tcx>,
861 edges: &IndexedConstraintEdges<'_, 'tcx>,
862 source_vid: RegionVid,
863 dir: EdgeDirection,
864 ) {
865 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:865",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(865u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("process_edges(source_vid={0:?}, dir={1:?})",
source_vid, dir) as &dyn Value))])
});
} else { ; }
};debug!("process_edges(source_vid={:?}, dir={:?})", source_vid, dir);
866
867 for (c, origin) in edges.adjacent_edges(source_vid, dir) {
868 match c.kind {
869 ConstraintKind::VarSubVar => {
870 let from_vid = c.sub.as_var();
871 let to_vid = c.sup.as_var();
872 let opp_vid = if from_vid == source_vid { to_vid } else { from_vid };
873 if state.set.insert(opp_vid) {
874 state.stack.push(opp_vid);
875 }
876 }
877
878 ConstraintKind::RegSubVar => {
879 let origin = (*origin).clone();
880 state.result.push(RegionAndOrigin { region: c.sub, origin });
881 }
882
883 ConstraintKind::VarSubReg => {
884 let origin = (*origin).clone();
885 state.result.push(RegionAndOrigin { region: c.sup, origin });
886 }
887
888 ConstraintKind::RegSubReg => {
::core::panicking::panic_fmt(format_args!("cannot reach reg-sub-reg edge in region inference post-processing"));
}panic!(
889 "cannot reach reg-sub-reg edge in region inference \
890 post-processing"
891 ),
892
893 ConstraintKind::VarEqVar
894 | ConstraintKind::VarEqReg
895 | ConstraintKind::RegEqReg => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
896 }
897 }
898 }
899 }
900
901 fn bound_is_met(
902 &self,
903 bound: &VerifyBound<'tcx>,
904 var_values: &LexicalRegionResolutions<'tcx>,
905 generic_ty: Ty<'tcx>,
906 min: ty::Region<'tcx>,
907 ) -> bool {
908 if let ty::ReError(_) = min.kind() {
909 return true;
910 }
911
912 match bound {
913 VerifyBound::IfEq(verify_if_eq_b) => {
914 let verify_if_eq_b = var_values.normalize(self.region_rels.tcx, *verify_if_eq_b);
915 match test_type_match::extract_verify_if_eq(self.tcx(), &verify_if_eq_b, generic_ty)
916 {
917 Some(r) => {
918 self.bound_is_met(&VerifyBound::OutlivedBy(r), var_values, generic_ty, min)
919 }
920
921 None => false,
922 }
923 }
924
925 VerifyBound::OutlivedBy(r) => {
926 let a = match min.kind() {
927 ty::ReVar(rid) => var_values.values[rid],
928 _ => VarValue::Value(min),
929 };
930 let b = match r.kind() {
931 ty::ReVar(rid) => var_values.values[rid],
932 _ => VarValue::Value(*r),
933 };
934 self.sub_region_values(a, b)
935 }
936
937 VerifyBound::IsEmpty => match min.kind() {
938 ty::ReVar(rid) => match var_values.values[rid] {
939 VarValue::ErrorValue => false,
940 VarValue::Empty(_) => true,
941 VarValue::Value(_) => false,
942 },
943 _ => false,
944 },
945
946 VerifyBound::AnyBound(bs) => {
947 bs.iter().any(|b| self.bound_is_met(b, var_values, generic_ty, min))
948 }
949
950 VerifyBound::AllBounds(bs) => {
951 bs.iter().all(|b| self.bound_is_met(b, var_values, generic_ty, min))
952 }
953 }
954 }
955}
956
957impl<'tcx> fmt::Debug for RegionAndOrigin<'tcx> {
958 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
959 f.write_fmt(format_args!("RegionAndOrigin({0:?},{1:?})", self.region,
self.origin))write!(f, "RegionAndOrigin({:?},{:?})", self.region, self.origin)
960 }
961}
962
963impl<'tcx> LexicalRegionResolutions<'tcx> {
964 fn normalize<T>(&self, tcx: TyCtxt<'tcx>, value: T) -> T
965 where
966 T: TypeFoldable<TyCtxt<'tcx>>,
967 {
968 fold_regions(tcx, value, |r, _db| self.resolve_region(tcx, r))
969 }
970
971 fn value(&self, rid: RegionVid) -> &VarValue<'tcx> {
972 &self.values[rid]
973 }
974
975 fn value_mut(&mut self, rid: RegionVid) -> &mut VarValue<'tcx> {
976 &mut self.values[rid]
977 }
978
979 pub(crate) fn resolve_region(
980 &self,
981 tcx: TyCtxt<'tcx>,
982 r: ty::Region<'tcx>,
983 ) -> ty::Region<'tcx> {
984 let result = match r.kind() {
985 ty::ReVar(rid) => match self.values[rid] {
986 VarValue::Empty(_) => r,
987 VarValue::Value(r) => r,
988 VarValue::ErrorValue => tcx.lifetimes.re_static,
989 },
990 _ => r,
991 };
992 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs:992",
"rustc_infer::infer::lexical_region_resolve",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_infer/src/infer/lexical_region_resolve/mod.rs"),
::tracing_core::__macro_support::Option::Some(992u32),
::tracing_core::__macro_support::Option::Some("rustc_infer::infer::lexical_region_resolve"),
::tracing_core::field::FieldSet::new(&["message"],
::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};
let mut iter = __CALLSITE.metadata().fields().iter();
__CALLSITE.metadata().fields().value_set(&[(&::tracing::__macro_support::Iterator::next(&mut iter).expect("FieldSet corrupted (this is a bug)"),
::tracing::__macro_support::Option::Some(&format_args!("resolve_region({0:?}) = {1:?}",
r, result) as &dyn Value))])
});
} else { ; }
};debug!("resolve_region({:?}) = {:?}", r, result);
993 result
994 }
995}