1use std::ops::Deref;
2
3use rustc_hir as hir;
4use rustc_hir::GenericArg;
5use rustc_hir::def_id::DefId;
6use rustc_hir_analysis::hir_ty_lowering::generics::{
7 check_generic_arg_count_for_call, lower_generic_args,
8};
9use rustc_hir_analysis::hir_ty_lowering::{
10 GenericArgsLowerer, HirTyLowerer, IsMethodCall, RegionInferReason,
11};
12use rustc_infer::infer::{
13 BoundRegionConversionTime, DefineOpaqueTypes, InferOk, RegionVariableOrigin,
14};
15use rustc_lint::builtin::RESOLVING_TO_ITEMS_SHADOWING_SUPERTRAIT_ITEMS;
16use rustc_middle::traits::ObligationCauseCode;
17use rustc_middle::ty::adjustment::{
18 Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, PointerCoercion,
19};
20use rustc_middle::ty::{
21 self, AssocContainer, GenericArgs, GenericArgsRef, GenericParamDefKind, Ty, TyCtxt,
22 TypeFoldable, TypeVisitableExt, UserArgs,
23};
24use rustc_middle::{bug, span_bug};
25use rustc_span::{DUMMY_SP, Span};
26use rustc_trait_selection::traits;
27use tracing::debug;
28
29use super::{MethodCallee, probe};
30use crate::errors::{SupertraitItemShadowee, SupertraitItemShadower, SupertraitItemShadowing};
31use crate::{FnCtxt, callee};
32
33struct ConfirmContext<'a, 'tcx> {
34 fcx: &'a FnCtxt<'a, 'tcx>,
35 span: Span,
36 self_expr: &'tcx hir::Expr<'tcx>,
37 call_expr: &'tcx hir::Expr<'tcx>,
38 skip_record_for_diagnostics: bool,
39}
40
41impl<'a, 'tcx> Deref for ConfirmContext<'a, 'tcx> {
42 type Target = FnCtxt<'a, 'tcx>;
43 fn deref(&self) -> &Self::Target {
44 self.fcx
45 }
46}
47
48#[derive(#[automatically_derived]
impl<'tcx> ::core::fmt::Debug for ConfirmResult<'tcx> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "ConfirmResult",
"callee", &self.callee, "illegal_sized_bound",
&&self.illegal_sized_bound)
}
}Debug)]
49pub(crate) struct ConfirmResult<'tcx> {
50 pub callee: MethodCallee<'tcx>,
51 pub illegal_sized_bound: Option<Span>,
52}
53
54impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
55 pub(crate) fn confirm_method(
56 &self,
57 span: Span,
58 self_expr: &'tcx hir::Expr<'tcx>,
59 call_expr: &'tcx hir::Expr<'tcx>,
60 unadjusted_self_ty: Ty<'tcx>,
61 pick: &probe::Pick<'tcx>,
62 segment: &'tcx hir::PathSegment<'tcx>,
63 ) -> ConfirmResult<'tcx> {
64 {
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_typeck/src/method/confirm.rs:64",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(64u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("confirm(unadjusted_self_ty={0:?}, pick={1:?}, generic_args={2:?})",
unadjusted_self_ty, pick, segment.args) as &dyn Value))])
});
} else { ; }
};debug!(
65 "confirm(unadjusted_self_ty={:?}, pick={:?}, generic_args={:?})",
66 unadjusted_self_ty, pick, segment.args,
67 );
68
69 let mut confirm_cx = ConfirmContext::new(self, span, self_expr, call_expr);
70 confirm_cx.confirm(unadjusted_self_ty, pick, segment)
71 }
72
73 pub(crate) fn confirm_method_for_diagnostic(
74 &self,
75 span: Span,
76 self_expr: &'tcx hir::Expr<'tcx>,
77 call_expr: &'tcx hir::Expr<'tcx>,
78 unadjusted_self_ty: Ty<'tcx>,
79 pick: &probe::Pick<'tcx>,
80 segment: &hir::PathSegment<'tcx>,
81 ) -> ConfirmResult<'tcx> {
82 let mut confirm_cx = ConfirmContext::new(self, span, self_expr, call_expr);
83 confirm_cx.skip_record_for_diagnostics = true;
84 confirm_cx.confirm(unadjusted_self_ty, pick, segment)
85 }
86}
87
88impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
89 fn new(
90 fcx: &'a FnCtxt<'a, 'tcx>,
91 span: Span,
92 self_expr: &'tcx hir::Expr<'tcx>,
93 call_expr: &'tcx hir::Expr<'tcx>,
94 ) -> ConfirmContext<'a, 'tcx> {
95 ConfirmContext { fcx, span, self_expr, call_expr, skip_record_for_diagnostics: false }
96 }
97
98 fn confirm(
99 &mut self,
100 unadjusted_self_ty: Ty<'tcx>,
101 pick: &probe::Pick<'tcx>,
102 segment: &hir::PathSegment<'tcx>,
103 ) -> ConfirmResult<'tcx> {
104 let self_ty = self.adjust_self_ty(unadjusted_self_ty, pick);
106
107 let rcvr_args = self.fresh_receiver_args(self_ty, pick);
109 let all_args = self.instantiate_method_args(pick, segment, rcvr_args);
110
111 {
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_typeck/src/method/confirm.rs:111",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(111u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("rcvr_args={0:?}, all_args={1:?}",
rcvr_args, all_args) as &dyn Value))])
});
} else { ; }
};debug!("rcvr_args={rcvr_args:?}, all_args={all_args:?}");
112
113 let (method_sig, method_predicates) = self.instantiate_method_sig(pick, all_args);
115
116 let filler_args = rcvr_args
125 .extend_to(self.tcx, pick.item.def_id, |def, _| self.tcx.mk_param_from_def(def));
126 let illegal_sized_bound = self.predicates_require_illegal_sized_bound(
127 self.tcx.predicates_of(pick.item.def_id).instantiate(self.tcx, filler_args),
128 );
129
130 let method_sig_rcvr = self.normalize(self.span, method_sig.inputs()[0]);
137 {
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_typeck/src/method/confirm.rs:137",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(137u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("confirm: self_ty={0:?} method_sig_rcvr={1:?} method_sig={2:?} method_predicates={3:?}",
self_ty, method_sig_rcvr, method_sig, method_predicates) as
&dyn Value))])
});
} else { ; }
};debug!(
138 "confirm: self_ty={:?} method_sig_rcvr={:?} method_sig={:?} method_predicates={:?}",
139 self_ty, method_sig_rcvr, method_sig, method_predicates
140 );
141 self.unify_receivers(self_ty, method_sig_rcvr, pick);
142
143 let (method_sig, method_predicates) =
144 self.normalize(self.span, (method_sig, method_predicates));
145
146 self.check_for_illegal_method_calls(pick);
148
149 self.lint_shadowed_supertrait_items(pick, segment);
151
152 if illegal_sized_bound.is_none() {
156 self.add_obligations(method_sig, all_args, method_predicates, pick.item.def_id);
157 }
158
159 let callee = MethodCallee { def_id: pick.item.def_id, args: all_args, sig: method_sig };
161 ConfirmResult { callee, illegal_sized_bound }
162 }
163
164 fn adjust_self_ty(
168 &mut self,
169 unadjusted_self_ty: Ty<'tcx>,
170 pick: &probe::Pick<'tcx>,
171 ) -> Ty<'tcx> {
172 let mut autoderef = self.autoderef(self.call_expr.span, unadjusted_self_ty);
175 let Some((mut target, n)) = autoderef.nth(pick.autoderefs) else {
176 return Ty::new_error_with_message(
177 self.tcx,
178 DUMMY_SP,
179 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("failed autoderef {0}",
pick.autoderefs))
})format!("failed autoderef {}", pick.autoderefs),
180 );
181 };
182 match (&n, &pick.autoderefs) {
(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);
}
}
};assert_eq!(n, pick.autoderefs);
183
184 let mut adjustments = self.adjust_steps(&autoderef);
185 match pick.autoref_or_ptr_adjustment {
186 Some(probe::AutorefOrPtrAdjustment::Autoref { mutbl, unsize }) => {
187 let region = self.next_region_var(RegionVariableOrigin::Autoref(self.span));
188 let base_ty = target;
190
191 target = Ty::new_ref(self.tcx, region, target, mutbl);
192
193 let mutbl = AutoBorrowMutability::new(mutbl, AllowTwoPhase::Yes);
196
197 adjustments
198 .push(Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(mutbl)), target });
199
200 if unsize {
201 let unsized_ty = if let ty::Array(elem_ty, _) = base_ty.kind() {
202 Ty::new_slice(self.tcx, *elem_ty)
203 } else {
204 ::rustc_middle::util::bug::bug_fmt(format_args!("AutorefOrPtrAdjustment\'s unsize flag should only be set for array ty, found {0}",
base_ty))bug!(
205 "AutorefOrPtrAdjustment's unsize flag should only be set for array ty, found {}",
206 base_ty
207 )
208 };
209 target = Ty::new_ref(self.tcx, region, unsized_ty, mutbl.into());
210 adjustments.push(Adjustment {
211 kind: Adjust::Pointer(PointerCoercion::Unsize),
212 target,
213 });
214 }
215 }
216 Some(probe::AutorefOrPtrAdjustment::ToConstPtr) => {
217 target = match target.kind() {
218 &ty::RawPtr(ty, mutbl) => {
219 if !mutbl.is_mut() {
::core::panicking::panic("assertion failed: mutbl.is_mut()")
};assert!(mutbl.is_mut());
220 Ty::new_imm_ptr(self.tcx, ty)
221 }
222 other => {
::core::panicking::panic_fmt(format_args!("Cannot adjust receiver type {0:?} to const ptr",
other));
}panic!("Cannot adjust receiver type {other:?} to const ptr"),
223 };
224
225 adjustments.push(Adjustment {
226 kind: Adjust::Pointer(PointerCoercion::MutToConstPointer),
227 target,
228 });
229 }
230
231 Some(probe::AutorefOrPtrAdjustment::ReborrowPin(mutbl)) => {
232 let region = self.next_region_var(RegionVariableOrigin::Autoref(self.span));
233
234 target = match target.kind() {
235 ty::Adt(pin, args) if self.tcx.is_lang_item(pin.did(), hir::LangItem::Pin) => {
236 let inner_ty = match args[0].expect_ty().kind() {
237 ty::Ref(_, ty, _) => *ty,
238 _ => ::rustc_middle::util::bug::bug_fmt(format_args!("Expected a reference type for argument to Pin"))bug!("Expected a reference type for argument to Pin"),
239 };
240 Ty::new_pinned_ref(self.tcx, region, inner_ty, mutbl)
241 }
242 _ => ::rustc_middle::util::bug::bug_fmt(format_args!("Cannot adjust receiver type for reborrowing pin of {0:?}",
target))bug!("Cannot adjust receiver type for reborrowing pin of {target:?}"),
243 };
244
245 adjustments.push(Adjustment { kind: Adjust::ReborrowPin(mutbl), target });
246 }
247 None => {}
248 }
249
250 self.register_predicates(autoderef.into_obligations());
251
252 if !self.skip_record_for_diagnostics {
254 self.apply_adjustments(self.self_expr, adjustments);
255 }
256
257 target
258 }
259
260 fn fresh_receiver_args(
267 &mut self,
268 self_ty: Ty<'tcx>,
269 pick: &probe::Pick<'tcx>,
270 ) -> GenericArgsRef<'tcx> {
271 match pick.kind {
272 probe::InherentImplPick => {
273 let impl_def_id = pick.item.container_id(self.tcx);
274 if !#[allow(non_exhaustive_omitted_patterns)] match pick.item.container {
AssocContainer::InherentImpl => true,
_ => false,
} {
{
::core::panicking::panic_fmt(format_args!("impl {0:?} is not an inherent impl",
impl_def_id));
}
};assert!(
275 matches!(pick.item.container, AssocContainer::InherentImpl),
276 "impl {impl_def_id:?} is not an inherent impl"
277 );
278 self.fresh_args_for_item(self.span, impl_def_id)
279 }
280
281 probe::ObjectPick => {
282 let trait_def_id = pick.item.container_id(self.tcx);
283
284 if !self.tcx.is_dyn_compatible(trait_def_id) {
289 return ty::GenericArgs::extend_with_error(self.tcx, trait_def_id, &[]);
290 }
291
292 if self_ty.references_error() {
299 return ty::GenericArgs::extend_with_error(self.tcx, trait_def_id, &[]);
300 }
301
302 self.extract_existential_trait_ref(self_ty, |this, object_ty, principal| {
303 let original_poly_trait_ref = principal.with_self_ty(this.tcx, object_ty);
314 let upcast_poly_trait_ref = this.upcast(original_poly_trait_ref, trait_def_id);
315 let upcast_trait_ref =
316 this.instantiate_binder_with_fresh_vars(upcast_poly_trait_ref);
317 {
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_typeck/src/method/confirm.rs:317",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(317u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("original_poly_trait_ref={0:?} upcast_trait_ref={1:?} target_trait={2:?}",
original_poly_trait_ref, upcast_trait_ref, trait_def_id) as
&dyn Value))])
});
} else { ; }
};debug!(
318 "original_poly_trait_ref={:?} upcast_trait_ref={:?} target_trait={:?}",
319 original_poly_trait_ref, upcast_trait_ref, trait_def_id
320 );
321 upcast_trait_ref.args
322 })
323 }
324
325 probe::TraitPick => {
326 let trait_def_id = pick.item.container_id(self.tcx);
327
328 self.fresh_args_for_item(self.span, trait_def_id)
334 }
335
336 probe::WhereClausePick(poly_trait_ref) => {
337 self.instantiate_binder_with_fresh_vars(poly_trait_ref).args
340 }
341 }
342 }
343
344 fn extract_existential_trait_ref<R, F>(&mut self, self_ty: Ty<'tcx>, mut closure: F) -> R
345 where
346 F: FnMut(&mut ConfirmContext<'a, 'tcx>, Ty<'tcx>, ty::PolyExistentialTraitRef<'tcx>) -> R,
347 {
348 let mut autoderef = self.fcx.autoderef(self.span, self_ty);
354
355 if self.tcx.features().arbitrary_self_types()
358 || self.tcx.features().arbitrary_self_types_pointers()
359 {
360 autoderef = autoderef.use_receiver_trait();
361 }
362
363 autoderef
364 .include_raw_pointers()
365 .find_map(|(ty, _)| match ty.kind() {
366 ty::Dynamic(data, ..) => Some(closure(
367 self,
368 ty,
369 data.principal().unwrap_or_else(|| {
370 ::rustc_middle::util::bug::span_bug_fmt(self.span,
format_args!("calling trait method on empty object?"))span_bug!(self.span, "calling trait method on empty object?")
371 }),
372 )),
373 _ => None,
374 })
375 .unwrap_or_else(|| {
376 ::rustc_middle::util::bug::span_bug_fmt(self.span,
format_args!("self-type `{0}` for ObjectPick never dereferenced to an object",
self_ty))span_bug!(
377 self.span,
378 "self-type `{}` for ObjectPick never dereferenced to an object",
379 self_ty
380 )
381 })
382 }
383
384 fn instantiate_method_args(
385 &mut self,
386 pick: &probe::Pick<'tcx>,
387 seg: &hir::PathSegment<'tcx>,
388 parent_args: GenericArgsRef<'tcx>,
389 ) -> GenericArgsRef<'tcx> {
390 let generics = self.tcx.generics_of(pick.item.def_id);
394
395 let arg_count_correct = check_generic_arg_count_for_call(
396 self.fcx,
397 pick.item.def_id,
398 generics,
399 seg,
400 IsMethodCall::Yes,
401 );
402
403 match (&generics.parent_count, &parent_args.len()) {
(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);
}
}
};assert_eq!(generics.parent_count, parent_args.len());
406
407 struct GenericArgsCtxt<'a, 'tcx> {
408 cfcx: &'a ConfirmContext<'a, 'tcx>,
409 pick: &'a probe::Pick<'tcx>,
410 seg: &'a hir::PathSegment<'tcx>,
411 }
412 impl<'a, 'tcx> GenericArgsLowerer<'a, 'tcx> for GenericArgsCtxt<'a, 'tcx> {
413 fn args_for_def_id(
414 &mut self,
415 def_id: DefId,
416 ) -> (Option<&'a hir::GenericArgs<'tcx>>, bool) {
417 if def_id == self.pick.item.def_id {
418 if let Some(data) = self.seg.args {
419 return (Some(data), false);
420 }
421 }
422 (None, false)
423 }
424
425 fn provided_kind(
426 &mut self,
427 preceding_args: &[ty::GenericArg<'tcx>],
428 param: &ty::GenericParamDef,
429 arg: &GenericArg<'tcx>,
430 ) -> ty::GenericArg<'tcx> {
431 match (¶m.kind, arg) {
432 (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => self
433 .cfcx
434 .fcx
435 .lowerer()
436 .lower_lifetime(lt, RegionInferReason::Param(param))
437 .into(),
438 (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => {
439 self.cfcx.lower_ty(ty.as_unambig_ty()).raw.into()
441 }
442 (GenericParamDefKind::Type { .. }, GenericArg::Infer(inf)) => {
443 self.cfcx.lower_ty(&inf.to_ty()).raw.into()
444 }
445 (GenericParamDefKind::Const { .. }, GenericArg::Const(ct)) => self
446 .cfcx
447 .lower_const_arg(
449 ct.as_unambig_ct(),
450 self.cfcx
451 .tcx
452 .type_of(param.def_id)
453 .instantiate(self.cfcx.tcx, preceding_args),
454 )
455 .into(),
456 (GenericParamDefKind::Const { .. }, GenericArg::Infer(inf)) => {
457 self.cfcx.ct_infer(Some(param), inf.span).into()
458 }
459 (kind, arg) => {
460 ::rustc_middle::util::bug::bug_fmt(format_args!("mismatched method arg kind {0:?} in turbofish: {1:?}",
kind, arg))bug!("mismatched method arg kind {kind:?} in turbofish: {arg:?}")
461 }
462 }
463 }
464
465 fn inferred_kind(
466 &mut self,
467 _preceding_args: &[ty::GenericArg<'tcx>],
468 param: &ty::GenericParamDef,
469 _infer_args: bool,
470 ) -> ty::GenericArg<'tcx> {
471 self.cfcx.var_for_def(self.cfcx.span, param)
472 }
473 }
474
475 let args = lower_generic_args(
476 self.fcx,
477 pick.item.def_id,
478 parent_args,
479 false,
480 None,
481 &arg_count_correct,
482 &mut GenericArgsCtxt { cfcx: self, pick, seg },
483 );
484
485 if !args.is_empty() && !generics.is_own_empty() {
500 let user_type_annotation = self.probe(|_| {
501 let user_args = UserArgs {
502 args: GenericArgs::for_item(self.tcx, pick.item.def_id, |param, _| {
503 let i = param.index as usize;
504 if i < generics.parent_count {
505 self.fcx.var_for_def(DUMMY_SP, param)
506 } else {
507 args[i]
508 }
509 }),
510 user_self_ty: None, };
512
513 self.fcx.canonicalize_user_type_annotation(ty::UserType::new(
514 ty::UserTypeKind::TypeOf(pick.item.def_id, user_args),
515 ))
516 });
517
518 {
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_typeck/src/method/confirm.rs:518",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(518u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("instantiate_method_args: user_type_annotation={0:?}",
user_type_annotation) as &dyn Value))])
});
} else { ; }
};debug!("instantiate_method_args: user_type_annotation={:?}", user_type_annotation);
519
520 if !self.skip_record_for_diagnostics {
521 self.fcx.write_user_type_annotation(self.call_expr.hir_id, user_type_annotation);
522 }
523 }
524
525 self.normalize(self.span, args)
526 }
527
528 fn unify_receivers(
529 &mut self,
530 self_ty: Ty<'tcx>,
531 method_self_ty: Ty<'tcx>,
532 pick: &probe::Pick<'tcx>,
533 ) {
534 {
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_typeck/src/method/confirm.rs:534",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(534u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("unify_receivers: self_ty={0:?} method_self_ty={1:?} span={2:?} pick={3:?}",
self_ty, method_self_ty, self.span, pick) as &dyn Value))])
});
} else { ; }
};debug!(
535 "unify_receivers: self_ty={:?} method_self_ty={:?} span={:?} pick={:?}",
536 self_ty, method_self_ty, self.span, pick
537 );
538 let cause = self.cause(self.self_expr.span, ObligationCauseCode::Misc);
539 match self.at(&cause, self.param_env).sup(DefineOpaqueTypes::Yes, method_self_ty, self_ty) {
540 Ok(InferOk { obligations, value: () }) => {
541 self.register_predicates(obligations);
542 }
543 Err(terr) => {
544 if self.tcx.features().arbitrary_self_types() {
545 self.err_ctxt()
546 .report_mismatched_types(
547 &cause,
548 self.param_env,
549 method_self_ty,
550 self_ty,
551 terr,
552 )
553 .emit();
554 } else {
555 self.dcx().span_delayed_bug(
558 cause.span,
559 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0} was a subtype of {1} but now is not?",
self_ty, method_self_ty))
})format!("{self_ty} was a subtype of {method_self_ty} but now is not?"),
560 );
561 }
562 }
563 }
564 }
565
566 fn instantiate_method_sig(
570 &mut self,
571 pick: &probe::Pick<'tcx>,
572 all_args: GenericArgsRef<'tcx>,
573 ) -> (ty::FnSig<'tcx>, ty::InstantiatedPredicates<'tcx>) {
574 {
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_typeck/src/method/confirm.rs:574",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(574u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("instantiate_method_sig(pick={0:?}, all_args={1:?})",
pick, all_args) as &dyn Value))])
});
} else { ; }
};debug!("instantiate_method_sig(pick={:?}, all_args={:?})", pick, all_args);
575
576 let def_id = pick.item.def_id;
580 let method_predicates = self.tcx.predicates_of(def_id).instantiate(self.tcx, all_args);
581
582 {
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_typeck/src/method/confirm.rs:582",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(582u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("method_predicates after instantiation = {0:?}",
method_predicates) as &dyn Value))])
});
} else { ; }
};debug!("method_predicates after instantiation = {:?}", method_predicates);
583
584 let sig = self.tcx.fn_sig(def_id).instantiate(self.tcx, all_args);
585 {
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_typeck/src/method/confirm.rs:585",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(585u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("type scheme instantiated, sig={0:?}",
sig) as &dyn Value))])
});
} else { ; }
};debug!("type scheme instantiated, sig={:?}", sig);
586
587 let sig = self.instantiate_binder_with_fresh_vars(sig);
588 {
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_typeck/src/method/confirm.rs:588",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(588u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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!("late-bound lifetimes from method instantiated, sig={0:?}",
sig) as &dyn Value))])
});
} else { ; }
};debug!("late-bound lifetimes from method instantiated, sig={:?}", sig);
589
590 (sig, method_predicates)
591 }
592
593 fn add_obligations(
594 &mut self,
595 sig: ty::FnSig<'tcx>,
596 all_args: GenericArgsRef<'tcx>,
597 method_predicates: ty::InstantiatedPredicates<'tcx>,
598 def_id: DefId,
599 ) {
600 {
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_typeck/src/method/confirm.rs:600",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(600u32),
::tracing_core::__macro_support::Option::Some("rustc_hir_typeck::method::confirm"),
::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_obligations: sig={0:?} all_args={1:?} method_predicates={2:?} def_id={3:?}",
sig, all_args, method_predicates, def_id) as &dyn Value))])
});
} else { ; }
};debug!(
601 "add_obligations: sig={:?} all_args={:?} method_predicates={:?} def_id={:?}",
602 sig, all_args, method_predicates, def_id
603 );
604
605 for obligation in traits::predicates_for_generics(
609 |idx, span| {
610 let code = ObligationCauseCode::WhereClauseInExpr(
611 def_id,
612 span,
613 self.call_expr.hir_id,
614 idx,
615 );
616 self.cause(self.span, code)
617 },
618 self.param_env,
619 method_predicates,
620 ) {
621 self.register_predicate(obligation);
622 }
623
624 self.add_wf_bounds(all_args, self.call_expr.span);
627
628 for ty in sig.inputs_and_output {
632 self.register_wf_obligation(
633 ty.into(),
634 self.span,
635 ObligationCauseCode::WellFormed(None),
636 );
637 }
638 }
639
640 fn predicates_require_illegal_sized_bound(
644 &self,
645 predicates: ty::InstantiatedPredicates<'tcx>,
646 ) -> Option<Span> {
647 let sized_def_id = self.tcx.lang_items().sized_trait()?;
648
649 traits::elaborate(self.tcx, predicates.predicates.iter().copied())
650 .filter_map(|pred| match pred.kind().skip_binder() {
652 ty::ClauseKind::Trait(trait_pred) if trait_pred.def_id() == sized_def_id => {
653 let span = predicates
654 .iter()
655 .find_map(|(p, span)| if p == pred { Some(span) } else { None })
656 .unwrap_or(DUMMY_SP);
657 Some((trait_pred, span))
658 }
659 _ => None,
660 })
661 .find_map(|(trait_pred, span)| match trait_pred.self_ty().kind() {
662 ty::Dynamic(..) => Some(span),
663 _ => None,
664 })
665 }
666
667 fn check_for_illegal_method_calls(&self, pick: &probe::Pick<'_>) {
668 if let Some(trait_def_id) = pick.item.trait_container(self.tcx)
670 && let Err(e) = callee::check_legal_trait_for_method_call(
671 self.tcx,
672 self.span,
673 Some(self.self_expr.span),
674 self.call_expr.span,
675 trait_def_id,
676 self.body_id.to_def_id(),
677 )
678 {
679 self.set_tainted_by_errors(e);
680 }
681 }
682
683 fn lint_shadowed_supertrait_items(
684 &self,
685 pick: &probe::Pick<'_>,
686 segment: &hir::PathSegment<'tcx>,
687 ) {
688 if pick.shadowed_candidates.is_empty() {
689 return;
690 }
691
692 let shadower_span = self.tcx.def_span(pick.item.def_id);
693 let subtrait = self.tcx.item_name(pick.item.trait_container(self.tcx).unwrap());
694 let shadower = SupertraitItemShadower { span: shadower_span, subtrait };
695
696 let shadowee = if let [shadowee] = &pick.shadowed_candidates[..] {
697 let shadowee_span = self.tcx.def_span(shadowee.def_id);
698 let supertrait = self.tcx.item_name(shadowee.trait_container(self.tcx).unwrap());
699 SupertraitItemShadowee::Labeled { span: shadowee_span, supertrait }
700 } else {
701 let (traits, spans): (Vec<_>, Vec<_>) = pick
702 .shadowed_candidates
703 .iter()
704 .map(|item| {
705 (
706 self.tcx.item_name(item.trait_container(self.tcx).unwrap()),
707 self.tcx.def_span(item.def_id),
708 )
709 })
710 .unzip();
711 SupertraitItemShadowee::Several { traits: traits.into(), spans: spans.into() }
712 };
713
714 self.tcx.emit_node_span_lint(
715 RESOLVING_TO_ITEMS_SHADOWING_SUPERTRAIT_ITEMS,
716 segment.hir_id,
717 segment.ident.span,
718 SupertraitItemShadowing { shadower, shadowee, item: segment.ident.name, subtrait },
719 );
720 }
721
722 fn upcast(
723 &mut self,
724 source_trait_ref: ty::PolyTraitRef<'tcx>,
725 target_trait_def_id: DefId,
726 ) -> ty::PolyTraitRef<'tcx> {
727 let upcast_trait_refs =
728 traits::upcast_choices(self.tcx, source_trait_ref, target_trait_def_id);
729
730 if let &[upcast_trait_ref] = upcast_trait_refs.as_slice() {
732 upcast_trait_ref
733 } else {
734 self.dcx().span_delayed_bug(
735 self.span,
736 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("cannot uniquely upcast `{0:?}` to `{1:?}`: `{2:?}`",
source_trait_ref, target_trait_def_id, upcast_trait_refs))
})format!(
737 "cannot uniquely upcast `{:?}` to `{:?}`: `{:?}`",
738 source_trait_ref, target_trait_def_id, upcast_trait_refs
739 ),
740 );
741
742 ty::Binder::dummy(ty::TraitRef::new_from_args(
743 self.tcx,
744 target_trait_def_id,
745 ty::GenericArgs::extend_with_error(self.tcx, target_trait_def_id, &[]),
746 ))
747 }
748 }
749
750 fn instantiate_binder_with_fresh_vars<T>(&self, value: ty::Binder<'tcx, T>) -> T
751 where
752 T: TypeFoldable<TyCtxt<'tcx>> + Copy,
753 {
754 self.fcx.instantiate_binder_with_fresh_vars(
755 self.span,
756 BoundRegionConversionTime::FnCall,
757 value,
758 )
759 }
760}