1use hir::def_id::{DefId, LocalDefId};
7use rustc_hir as hir;
8use rustc_hir::def::DefKind;
9use rustc_middle::ty::{self, GenericArgKind, GenericArgsRef, Ty, TyCtxt};
10use rustc_middle::{bug, span_bug};
11use tracing::{debug, instrument};
12
13use super::terms::VarianceTerm::*;
14use super::terms::*;
15
16pub(crate) struct ConstraintContext<'a, 'tcx> {
17 pub terms_cx: TermsContext<'a, 'tcx>,
18
19 covariant: VarianceTermPtr<'a>,
21 contravariant: VarianceTermPtr<'a>,
22 invariant: VarianceTermPtr<'a>,
23 bivariant: VarianceTermPtr<'a>,
24
25 pub constraints: Vec<Constraint<'a>>,
26}
27
28#[derive(#[automatically_derived]
impl<'a> ::core::marker::Copy for Constraint<'a> { }Copy, #[automatically_derived]
impl<'a> ::core::clone::Clone for Constraint<'a> {
#[inline]
fn clone(&self) -> Constraint<'a> {
let _: ::core::clone::AssertParamIsClone<InferredIndex>;
let _: ::core::clone::AssertParamIsClone<&'a VarianceTerm<'a>>;
*self
}
}Clone)]
31pub(crate) struct Constraint<'a> {
32 pub inferred: InferredIndex,
33 pub variance: &'a VarianceTerm<'a>,
34}
35
36struct CurrentItem {
46 inferred_start: InferredIndex,
47}
48
49pub(crate) fn add_constraints_from_crate<'a, 'tcx>(
50 terms_cx: TermsContext<'a, 'tcx>,
51) -> ConstraintContext<'a, 'tcx> {
52 let tcx = terms_cx.tcx;
53 let covariant = terms_cx.arena.alloc(ConstantTerm(ty::Covariant));
54 let contravariant = terms_cx.arena.alloc(ConstantTerm(ty::Contravariant));
55 let invariant = terms_cx.arena.alloc(ConstantTerm(ty::Invariant));
56 let bivariant = terms_cx.arena.alloc(ConstantTerm(ty::Bivariant));
57 let mut constraint_cx = ConstraintContext {
58 terms_cx,
59 covariant,
60 contravariant,
61 invariant,
62 bivariant,
63 constraints: Vec::new(),
64 };
65
66 let crate_items = tcx.hir_crate_items(());
67
68 for def_id in crate_items.definitions() {
69 let def_kind = tcx.def_kind(def_id);
70 match def_kind {
71 DefKind::Struct | DefKind::Union | DefKind::Enum => {
72 constraint_cx.build_constraints_for_item(def_id);
73
74 let adt = tcx.adt_def(def_id);
75 for variant in adt.variants() {
76 if let Some(ctor_def_id) = variant.ctor_def_id() {
77 constraint_cx.build_constraints_for_item(ctor_def_id.expect_local());
78 }
79 }
80 }
81 DefKind::Fn | DefKind::AssocFn => constraint_cx.build_constraints_for_item(def_id),
82 DefKind::TyAlias if tcx.type_alias_is_lazy(def_id) => {
83 constraint_cx.build_constraints_for_item(def_id)
84 }
85 _ => {}
86 }
87 }
88
89 constraint_cx
90}
91
92impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
93 fn tcx(&self) -> TyCtxt<'tcx> {
94 self.terms_cx.tcx
95 }
96
97 fn build_constraints_for_item(&mut self, def_id: LocalDefId) {
98 let tcx = self.tcx();
99 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_hir_analysis/src/variance/constraints.rs:99",
"rustc_hir_analysis::variance::constraints",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_analysis/src/variance/constraints.rs"),
::tracing_core::__macro_support::Option::Some(99u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_analysis::variance::constraints"),
::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!("build_constraints_for_item({0})",
tcx.def_path_str(def_id)) as &dyn Value))])
});
} else { ; }
};debug!("build_constraints_for_item({})", tcx.def_path_str(def_id));
100
101 if tcx.generics_of(def_id).is_empty() {
103 return;
104 }
105
106 let inferred_start = self.terms_cx.inferred_starts[&def_id];
107 let current_item = &CurrentItem { inferred_start };
108 let ty = tcx.type_of(def_id).instantiate_identity();
109
110 if let DefKind::TyAlias = tcx.def_kind(def_id)
113 && tcx.type_alias_is_lazy(def_id)
114 {
115 self.add_constraints_from_ty(current_item, ty, self.covariant);
116 return;
117 }
118
119 match ty.kind() {
120 ty::Adt(def, _) => {
121 for field in def.all_fields() {
128 self.add_constraints_from_ty(
129 current_item,
130 tcx.type_of(field.did).instantiate_identity(),
131 self.covariant,
132 );
133 }
134 }
135
136 ty::FnDef(..) => {
137 self.add_constraints_from_sig(
138 current_item,
139 tcx.fn_sig(def_id).instantiate_identity(),
140 self.covariant,
141 );
142 }
143
144 ty::Error(_) => {}
145
146 _ => {
147 ::rustc_middle::util::bug::span_bug_fmt(tcx.def_span(def_id),
format_args!("`build_constraints_for_item` unsupported for this item"));span_bug!(
148 tcx.def_span(def_id),
149 "`build_constraints_for_item` unsupported for this item"
150 );
151 }
152 }
153 }
154
155 fn add_constraint(&mut self, current: &CurrentItem, index: u32, variance: VarianceTermPtr<'a>) {
156 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_hir_analysis/src/variance/constraints.rs:156",
"rustc_hir_analysis::variance::constraints",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_analysis/src/variance/constraints.rs"),
::tracing_core::__macro_support::Option::Some(156u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_analysis::variance::constraints"),
::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!("add_constraint(index={0}, variance={1:?})",
index, variance) as &dyn Value))])
});
} else { ; }
};debug!("add_constraint(index={}, variance={:?})", index, variance);
157 self.constraints.push(Constraint {
158 inferred: InferredIndex(current.inferred_start.0 + index as usize),
159 variance,
160 });
161 }
162
163 fn contravariant(&mut self, variance: VarianceTermPtr<'a>) -> VarianceTermPtr<'a> {
164 self.xform(variance, self.contravariant)
165 }
166
167 fn invariant(&mut self, variance: VarianceTermPtr<'a>) -> VarianceTermPtr<'a> {
168 self.xform(variance, self.invariant)
169 }
170
171 fn constant_term(&self, v: ty::Variance) -> VarianceTermPtr<'a> {
172 match v {
173 ty::Covariant => self.covariant,
174 ty::Invariant => self.invariant,
175 ty::Contravariant => self.contravariant,
176 ty::Bivariant => self.bivariant,
177 }
178 }
179
180 fn xform(&mut self, v1: VarianceTermPtr<'a>, v2: VarianceTermPtr<'a>) -> VarianceTermPtr<'a> {
181 match (*v1, *v2) {
182 (_, ConstantTerm(ty::Covariant)) => {
183 v1
185 }
186
187 (ConstantTerm(c1), ConstantTerm(c2)) => self.constant_term(c1.xform(c2)),
188
189 _ => &*self.terms_cx.arena.alloc(TransformTerm(v1, v2)),
190 }
191 }
192
193 #[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("add_constraints_from_invariant_args",
"rustc_hir_analysis::variance::constraints",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_analysis/src/variance/constraints.rs"),
::tracing_core::__macro_support::Option::Some(193u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_analysis::variance::constraints"),
::tracing_core::field::FieldSet::new(&["args", "variance"],
::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,
&{
#[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(&args)
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(&variance)
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: () = loop {};
return __tracing_attr_fake_return;
}
{
let variance_i = self.invariant(variance);
for arg in args {
match arg.kind() {
GenericArgKind::Lifetime(lt) => {
self.add_constraints_from_region(current, lt, variance_i)
}
GenericArgKind::Type(ty) =>
self.add_constraints_from_ty(current, ty, variance_i),
GenericArgKind::Const(val) => {
self.add_constraints_from_const(current, val, variance_i)
}
}
}
}
}
}#[instrument(level = "debug", skip(self, current))]
194 fn add_constraints_from_invariant_args(
195 &mut self,
196 current: &CurrentItem,
197 args: GenericArgsRef<'tcx>,
198 variance: VarianceTermPtr<'a>,
199 ) {
200 let variance_i = self.invariant(variance);
202
203 for arg in args {
204 match arg.kind() {
205 GenericArgKind::Lifetime(lt) => {
206 self.add_constraints_from_region(current, lt, variance_i)
207 }
208 GenericArgKind::Type(ty) => self.add_constraints_from_ty(current, ty, variance_i),
209 GenericArgKind::Const(val) => {
210 self.add_constraints_from_const(current, val, variance_i)
211 }
212 }
213 }
214 }
215
216 fn add_constraints_from_ty(
220 &mut self,
221 current: &CurrentItem,
222 ty: Ty<'tcx>,
223 variance: VarianceTermPtr<'a>,
224 ) {
225 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_hir_analysis/src/variance/constraints.rs:225",
"rustc_hir_analysis::variance::constraints",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_analysis/src/variance/constraints.rs"),
::tracing_core::__macro_support::Option::Some(225u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_analysis::variance::constraints"),
::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!("add_constraints_from_ty(ty={0:?}, variance={1:?})",
ty, variance) as &dyn Value))])
});
} else { ; }
};debug!("add_constraints_from_ty(ty={:?}, variance={:?})", ty, variance);
226
227 match *ty.kind() {
228 ty::Bool
229 | ty::Char
230 | ty::Int(_)
231 | ty::Uint(_)
232 | ty::Float(_)
233 | ty::Str
234 | ty::Never
235 | ty::Foreign(..) => {
236 }
238
239 ty::FnDef(..) | ty::Coroutine(..) | ty::Closure(..) | ty::CoroutineClosure(..) => {
240 ::rustc_middle::util::bug::bug_fmt(format_args!("Unexpected unnameable type in variance computation: {0}",
ty));bug!("Unexpected unnameable type in variance computation: {ty}");
241 }
242
243 ty::Ref(region, ty, mutbl) => {
244 self.add_constraints_from_region(current, region, variance);
245 self.add_constraints_from_mt(current, &ty::TypeAndMut { ty, mutbl }, variance);
246 }
247
248 ty::Array(typ, len) => {
249 self.add_constraints_from_const(current, len, variance);
250 self.add_constraints_from_ty(current, typ, variance);
251 }
252
253 ty::Pat(typ, pat) => {
254 self.add_constraints_from_pat(current, variance, pat);
255 self.add_constraints_from_ty(current, typ, variance);
256 }
257
258 ty::Slice(typ) => {
259 self.add_constraints_from_ty(current, typ, variance);
260 }
261
262 ty::RawPtr(ty, mutbl) => {
263 self.add_constraints_from_mt(current, &ty::TypeAndMut { ty, mutbl }, variance);
264 }
265
266 ty::Tuple(subtys) => {
267 for subty in subtys {
268 self.add_constraints_from_ty(current, subty, variance);
269 }
270 }
271
272 ty::Adt(def, args) => {
273 self.add_constraints_from_args(current, def.did(), args, variance);
274 }
275
276 ty::Alias(ty::AliasTy {
277 kind: ty::Projection { .. } | ty::Inherent { .. } | ty::Opaque { .. },
278 args,
279 ..
280 }) => {
281 self.add_constraints_from_invariant_args(current, args, variance);
282 }
283
284 ty::Alias(ty::AliasTy { kind: ty::Free { def_id }, args, .. }) => {
285 self.add_constraints_from_args(current, def_id, args, variance);
286 }
287
288 ty::Dynamic(data, r) => {
289 self.add_constraints_from_region(current, r, variance);
291
292 if let Some(poly_trait_ref) = data.principal() {
293 self.add_constraints_from_invariant_args(
294 current,
295 poly_trait_ref.skip_binder().args,
296 variance,
297 );
298 }
299
300 for projection in data.projection_bounds() {
301 match projection.skip_binder().term.kind() {
302 ty::TermKind::Ty(ty) => {
303 self.add_constraints_from_ty(current, ty, self.invariant);
304 }
305 ty::TermKind::Const(c) => {
306 self.add_constraints_from_const(current, c, self.invariant)
307 }
308 }
309 }
310 }
311
312 ty::Param(ref data) => {
313 self.add_constraint(current, data.index, variance);
314 }
315
316 ty::FnPtr(sig_tys, hdr) => {
317 self.add_constraints_from_sig(current, sig_tys.with(hdr), variance);
318 }
319
320 ty::UnsafeBinder(ty) => {
321 self.add_constraints_from_ty(current, ty.skip_binder(), variance);
323 }
324
325 ty::Error(_) => {
326 }
329
330 ty::Placeholder(..) | ty::CoroutineWitness(..) | ty::Bound(..) | ty::Infer(..) => {
331 ::rustc_middle::util::bug::bug_fmt(format_args!("unexpected type encountered in variance inference: {0}",
ty));bug!("unexpected type encountered in variance inference: {}", ty);
332 }
333 }
334 }
335
336 fn add_constraints_from_pat(
337 &mut self,
338 current: &CurrentItem,
339 variance: VarianceTermPtr<'a>,
340 pat: ty::Pattern<'tcx>,
341 ) {
342 match *pat {
343 ty::PatternKind::Range { start, end } => {
344 self.add_constraints_from_const(current, start, variance);
345 self.add_constraints_from_const(current, end, variance);
346 }
347 ty::PatternKind::NotNull => {}
348 ty::PatternKind::Or(patterns) => {
349 for pat in patterns {
350 self.add_constraints_from_pat(current, variance, pat)
351 }
352 }
353 }
354 }
355
356 fn add_constraints_from_args(
359 &mut self,
360 current: &CurrentItem,
361 def_id: DefId,
362 args: GenericArgsRef<'tcx>,
363 variance: VarianceTermPtr<'a>,
364 ) {
365 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_hir_analysis/src/variance/constraints.rs:365",
"rustc_hir_analysis::variance::constraints",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_analysis/src/variance/constraints.rs"),
::tracing_core::__macro_support::Option::Some(365u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_analysis::variance::constraints"),
::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!("add_constraints_from_args(def_id={0:?}, args={1:?}, variance={2:?})",
def_id, args, variance) as &dyn Value))])
});
} else { ; }
};debug!(
366 "add_constraints_from_args(def_id={:?}, args={:?}, variance={:?})",
367 def_id, args, variance
368 );
369
370 if args.is_empty() {
372 return;
373 }
374
375 let (local, remote) = if let Some(def_id) = def_id.as_local() {
376 (Some(self.terms_cx.inferred_starts[&def_id]), None)
377 } else {
378 (None, Some(self.tcx().variances_of(def_id)))
379 };
380
381 for (i, arg) in args.iter().enumerate() {
382 let variance_decl = if let Some(InferredIndex(start)) = local {
383 self.terms_cx.inferred_terms[start + i]
387 } else {
388 self.constant_term(remote.as_ref().unwrap()[i])
391 };
392 let variance_i = self.xform(variance, variance_decl);
393 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_hir_analysis/src/variance/constraints.rs:393",
"rustc_hir_analysis::variance::constraints",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_analysis/src/variance/constraints.rs"),
::tracing_core::__macro_support::Option::Some(393u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_analysis::variance::constraints"),
::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!("add_constraints_from_args: variance_decl={0:?} variance_i={1:?}",
variance_decl, variance_i) as &dyn Value))])
});
} else { ; }
};debug!(
394 "add_constraints_from_args: variance_decl={:?} variance_i={:?}",
395 variance_decl, variance_i
396 );
397 match arg.kind() {
398 GenericArgKind::Lifetime(lt) => {
399 self.add_constraints_from_region(current, lt, variance_i)
400 }
401 GenericArgKind::Type(ty) => self.add_constraints_from_ty(current, ty, variance_i),
402 GenericArgKind::Const(val) => {
403 self.add_constraints_from_const(current, val, variance)
404 }
405 }
406 }
407 }
408
409 fn add_constraints_from_const(
412 &mut self,
413 current: &CurrentItem,
414 c: ty::Const<'tcx>,
415 variance: VarianceTermPtr<'a>,
416 ) {
417 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_hir_analysis/src/variance/constraints.rs:417",
"rustc_hir_analysis::variance::constraints",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_analysis/src/variance/constraints.rs"),
::tracing_core::__macro_support::Option::Some(417u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_analysis::variance::constraints"),
::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!("add_constraints_from_const(c={0:?}, variance={1:?})",
c, variance) as &dyn Value))])
});
} else { ; }
};debug!("add_constraints_from_const(c={:?}, variance={:?})", c, variance);
418
419 match &c.kind() {
420 ty::ConstKind::Unevaluated(uv) => {
421 self.add_constraints_from_invariant_args(current, uv.args, variance);
422 }
423 _ => {}
424 }
425 }
426
427 fn add_constraints_from_sig(
430 &mut self,
431 current: &CurrentItem,
432 sig: ty::PolyFnSig<'tcx>,
433 variance: VarianceTermPtr<'a>,
434 ) {
435 let contra = self.contravariant(variance);
436 for &input in sig.skip_binder().inputs() {
437 self.add_constraints_from_ty(current, input, contra);
438 }
439 self.add_constraints_from_ty(current, sig.skip_binder().output(), variance);
440 }
441
442 fn add_constraints_from_region(
445 &mut self,
446 current: &CurrentItem,
447 region: ty::Region<'tcx>,
448 variance: VarianceTermPtr<'a>,
449 ) {
450 match region.kind() {
451 ty::ReEarlyParam(ref data) => {
452 self.add_constraint(current, data.index, variance);
453 }
454
455 ty::ReStatic => {}
456
457 ty::ReBound(..) => {
458 }
463
464 ty::ReError(_) => {}
465
466 ty::ReLateParam(..) | ty::ReVar(..) | ty::RePlaceholder(..) | ty::ReErased => {
467 ::rustc_middle::util::bug::bug_fmt(format_args!("unexpected region encountered in variance inference: {0:?}",
region));bug!(
470 "unexpected region encountered in variance \
471 inference: {:?}",
472 region
473 );
474 }
475 }
476 }
477
478 fn add_constraints_from_mt(
481 &mut self,
482 current: &CurrentItem,
483 mt: &ty::TypeAndMut<'tcx>,
484 variance: VarianceTermPtr<'a>,
485 ) {
486 match mt.mutbl {
487 hir::Mutability::Mut => {
488 let invar = self.invariant(variance);
489 self.add_constraints_from_ty(current, mt.ty, invar);
490 }
491
492 hir::Mutability::Not => {
493 self.add_constraints_from_ty(current, mt.ty, variance);
494 }
495 }
496 }
497}