1use std::fmt::Debug;
2use std::ops::Deref;
3
4use rustc_attr_ir::lang_items::LangItem;
5use rustc_hir as hir;
6use rustc_hir::def_id::DefId;
7use rustc_hir_analysis::hir_ty_lowering::generics::{
8 check_generic_arg_count_for_value_path, lower_generic_args,
9};
10use rustc_hir_analysis::hir_ty_lowering::{
11 GenericArgsLowerer, HirTyLowerer, IsMethodCall, RegionInferReason,
12};
13use rustc_infer::infer::{
14 BoundRegionConversionTime, DefineOpaqueTypes, InferOk, RegionVariableOrigin,
15};
16use rustc_lint_defs::builtin::{
17 AMBIGUOUS_GLOB_IMPORTED_TRAITS, RESOLVING_TO_ITEMS_SHADOWING_SUPERTRAIT_ITEMS,
18};
19use rustc_middle::traits::ObligationCauseCode;
20use rustc_middle::ty::adjustment::{
21 Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, DerefAdjustKind,
22 PointerCoercion,
23};
24use rustc_middle::ty::{
25 self, AssocContainer, GenericArgs, GenericArgsRef, GenericParamDefKind, Ty, TyCtxt,
26 TypeFoldable, TypeVisitableExt, Unnormalized, UserArgs,
27};
28use rustc_span::{DUMMY_SP, Span, bug, span_bug};
29use rustc_trait_selection::traits;
30use tracing::debug;
31
32use super::{MethodCallee, probe};
33use crate::diagnostics::{SupertraitItemShadowee, SupertraitItemShadower, SupertraitItemShadowing};
34use crate::{FnCtxt, callee};
35
36pub(crate) struct ConfirmContext<'a, 'tcx> {
37 fcx: &'a FnCtxt<'a, 'tcx>,
38 span: Span,
39 self_expr: &'tcx hir::Expr<'tcx>,
40 call_expr: &'tcx hir::Expr<'tcx>,
41 skip_record_for_diagnostics: bool,
42}
43
44impl<'a, 'tcx> Deref for ConfirmContext<'a, 'tcx> {
45 type Target = FnCtxt<'a, 'tcx>;
46 fn deref(&self) -> &Self::Target {
47 self.fcx
48 }
49}
50
51#[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)]
52pub(crate) struct ConfirmResult<'tcx> {
53 pub callee: MethodCallee<'tcx>,
54 pub illegal_sized_bound: Option<Span>,
55}
56
57impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
58 pub(crate) fn confirm_method(
59 &self,
60 span: Span,
61 self_expr: &'tcx hir::Expr<'tcx>,
62 call_expr: &'tcx hir::Expr<'tcx>,
63 unadjusted_self_ty: Ty<'tcx>,
64 pick: &probe::Pick<'tcx>,
65 segment: &'tcx hir::PathSegment<'tcx>,
66 ) -> ConfirmResult<'tcx> {
67 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:67",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(67u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::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 ::tracing::field::Value))])
});
} else { ; }
};debug!(
68 "confirm(unadjusted_self_ty={:?}, pick={:?}, generic_args={:?})",
69 unadjusted_self_ty, pick, segment.args,
70 );
71
72 let mut confirm_cx = ConfirmContext::new(self, span, self_expr, call_expr);
73 confirm_cx.confirm(unadjusted_self_ty, pick, segment)
74 }
75
76 pub(crate) fn confirm_method_for_diagnostic(
77 &self,
78 span: Span,
79 self_expr: &'tcx hir::Expr<'tcx>,
80 call_expr: &'tcx hir::Expr<'tcx>,
81 unadjusted_self_ty: Ty<'tcx>,
82 pick: &probe::Pick<'tcx>,
83 segment: &hir::PathSegment<'tcx>,
84 ) -> ConfirmResult<'tcx> {
85 let mut confirm_cx = ConfirmContext::new(self, span, self_expr, call_expr);
86 confirm_cx.skip_record_for_diagnostics = true;
87 confirm_cx.confirm(unadjusted_self_ty, pick, segment)
88 }
89}
90
91impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
92 pub(crate) fn new(
93 fcx: &'a FnCtxt<'a, 'tcx>,
94 span: Span,
95 self_expr: &'tcx hir::Expr<'tcx>,
96 call_expr: &'tcx hir::Expr<'tcx>,
97 ) -> ConfirmContext<'a, 'tcx> {
98 ConfirmContext { fcx, span, self_expr, call_expr, skip_record_for_diagnostics: false }
99 }
100
101 fn confirm(
102 &mut self,
103 unadjusted_self_ty: Ty<'tcx>,
104 pick: &probe::Pick<'tcx>,
105 segment: &hir::PathSegment<'tcx>,
106 ) -> ConfirmResult<'tcx> {
107 let self_ty = self.adjust_self_ty(unadjusted_self_ty, pick);
109
110 let rcvr_args = self.fresh_receiver_args(self_ty, pick);
112 let all_args = self.instantiate_method_args(pick, segment, rcvr_args);
113
114 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:114",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(114u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("rcvr_args={0:?}, all_args={1:?}",
rcvr_args, all_args) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("rcvr_args={rcvr_args:?}, all_args={all_args:?}");
115
116 let (method_sig, method_clauses) = self.instantiate_method_sig(pick, all_args);
118
119 let filler_args = rcvr_args
128 .extend_to(self.tcx, pick.item.def_id, |def, _| self.tcx.mk_param_from_def(def));
129 let illegal_sized_bound = self.clauses_require_illegal_sized_bound(
130 self.tcx.clauses_of(pick.item.def_id).instantiate(self.tcx, filler_args),
131 );
132
133 let method_sig_rcvr =
140 self.normalize(self.span, Unnormalized::new_wip(method_sig.inputs()[0]));
141 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:141",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(141u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("confirm: self_ty={0:?} method_sig_rcvr={1:?} method_sig={2:?} method_clauses={3:?}",
self_ty, method_sig_rcvr, method_sig, method_clauses) as
&dyn ::tracing::field::Value))])
});
} else { ; }
};debug!(
142 "confirm: self_ty={:?} method_sig_rcvr={:?} method_sig={:?} method_clauses={:?}",
143 self_ty, method_sig_rcvr, method_sig, method_clauses
144 );
145 self.unify_receivers(self_ty, method_sig_rcvr, pick);
146
147 let method_sig = self.normalize(self.span, Unnormalized::new_wip(method_sig));
148
149 self.check_for_illegal_method_calls(pick);
151
152 self.lint_shadowed_supertrait_items(pick, segment);
154
155 self.lint_ambiguously_glob_imported_traits(pick, segment);
157
158 if illegal_sized_bound.is_none() {
162 self.add_obligations(method_sig, all_args, method_clauses, pick.item.def_id);
163 }
164
165 let callee = MethodCallee { def_id: pick.item.def_id, args: all_args, sig: method_sig };
167 ConfirmResult { callee, illegal_sized_bound }
168 }
169
170 fn adjust_self_ty(
174 &mut self,
175 unadjusted_self_ty: Ty<'tcx>,
176 pick: &probe::Pick<'tcx>,
177 ) -> Ty<'tcx> {
178 let (target, adjustments) = self.create_ty_adjustments_from_pick(unadjusted_self_ty, pick);
181
182 if !self.skip_record_for_diagnostics {
184 self.apply_adjustments(self.self_expr, adjustments);
185 }
186
187 target
188 }
189
190 pub(crate) fn create_ty_adjustments_from_pick(
191 &mut self,
192 unadjusted_self_ty: Ty<'tcx>,
193 pick: &probe::Pick<'tcx>,
194 ) -> (Ty<'tcx>, Vec<Adjustment<'tcx>>) {
195 let mut autoderef = self.autoderef(self.call_expr.span, unadjusted_self_ty);
196 let Some((mut target, n)) = autoderef.nth(pick.autoderefs) else {
197 let error_ty = Ty::new_error_with_message(
198 self.tcx,
199 DUMMY_SP,
200 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("failed autoderef {0}",
pick.autoderefs))
})format!("failed autoderef {}", pick.autoderefs),
201 );
202
203 return (error_ty, ::alloc::vec::Vec::new()vec![]);
204 };
205
206 {
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);
207
208 let mut adjustments = self.adjust_steps(&autoderef);
209 match pick.autoref_or_ptr_adjustment {
210 Some(probe::AutorefOrPtrAdjustment::Autoref { mutbl, unsize }) => {
211 let region = self.next_region_var(RegionVariableOrigin::Autoref(self.span));
212 let base_ty = target;
214
215 target = Ty::new_ref(self.tcx, region, target, mutbl);
216
217 let mutbl = AutoBorrowMutability::new(mutbl, AllowTwoPhase::Yes);
220
221 adjustments
222 .push(Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(mutbl)), target });
223
224 if unsize {
225 let unsized_ty = if let ty::Array(elem_ty, _) = base_ty.kind() {
226 Ty::new_slice(self.tcx, *elem_ty)
227 } else {
228 ::rustc_span::macros::bug_impl(None,
format_args!("AutorefOrPtrAdjustment\'s unsize flag should only be set for array ty, found {0}",
base_ty), Location::caller())bug!(
229 "AutorefOrPtrAdjustment's unsize flag should only be set for array ty, found {}",
230 base_ty
231 )
232 };
233 target = Ty::new_ref(self.tcx, region, unsized_ty, mutbl.into());
234 adjustments.push(Adjustment {
235 kind: Adjust::Pointer(PointerCoercion::Unsize),
236 target,
237 });
238 }
239 }
240 Some(probe::AutorefOrPtrAdjustment::ToConstPtr) => {
241 target = match target.kind() {
242 &ty::RawPtr(ty, mutbl) => {
243 if !mutbl.is_mut() {
::core::panicking::panic("assertion failed: mutbl.is_mut()")
};assert!(mutbl.is_mut());
244 Ty::new_imm_ptr(self.tcx, ty)
245 }
246 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"),
247 };
248
249 adjustments.push(Adjustment {
250 kind: Adjust::Pointer(PointerCoercion::MutToConstPointer),
251 target,
252 });
253 }
254
255 Some(probe::AutorefOrPtrAdjustment::ReborrowPin(mutbl)) => {
256 let region = self.next_region_var(RegionVariableOrigin::Autoref(self.span));
257
258 target = match target.kind() {
259 ty::Adt(pin, args) if self.tcx.is_lang_item(pin.did(), LangItem::Pin) => {
260 let inner_ty = match args[0].expect_ty().kind() {
261 ty::Ref(_, ty, _) => *ty,
262 _ => ::rustc_span::macros::bug_impl(None,
format_args!("Expected a reference type for argument to Pin"),
Location::caller())bug!("Expected a reference type for argument to Pin"),
263 };
264 adjustments.push(Adjustment {
265 kind: Adjust::Deref(DerefAdjustKind::Pin),
266 target: inner_ty,
267 });
268 Ty::new_pinned_ref(self.tcx, region, inner_ty, mutbl)
269 }
270 _ => ::rustc_span::macros::bug_impl(None,
format_args!("Cannot adjust receiver type for reborrowing pin of {0:?}",
target), Location::caller())bug!("Cannot adjust receiver type for reborrowing pin of {target:?}"),
271 };
272 adjustments
273 .push(Adjustment { kind: Adjust::Borrow(AutoBorrow::Pin(mutbl)), target });
274 }
275 None => {}
276 }
277
278 self.register_predicates(autoderef.into_obligations());
279
280 (target, adjustments)
281 }
282
283 fn fresh_receiver_args(
290 &mut self,
291 self_ty: Ty<'tcx>,
292 pick: &probe::Pick<'tcx>,
293 ) -> GenericArgsRef<'tcx> {
294 match pick.kind {
295 probe::InherentImplPick => {
296 let impl_def_id = pick.item.container_id(self.tcx);
297 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!(
298 matches!(pick.item.container, AssocContainer::InherentImpl),
299 "impl {impl_def_id:?} is not an inherent impl"
300 );
301 self.fresh_args_for_item(self.span, impl_def_id)
302 }
303
304 probe::ObjectPick => {
305 let trait_def_id = pick.item.container_id(self.tcx);
306
307 if !self.tcx.is_dyn_compatible(trait_def_id) {
312 return ty::GenericArgs::extend_with_error(self.tcx, trait_def_id, &[]);
313 }
314
315 if self_ty.references_error() {
322 return ty::GenericArgs::extend_with_error(self.tcx, trait_def_id, &[]);
323 }
324
325 self.extract_existential_trait_ref(self_ty, |this, object_ty, principal| {
326 let original_poly_trait_ref = principal.with_self_ty(this.tcx, object_ty);
337 let upcast_poly_trait_ref = this.upcast(original_poly_trait_ref, trait_def_id);
338 let upcast_trait_ref =
339 this.instantiate_binder_with_fresh_vars(upcast_poly_trait_ref);
340 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:340",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(340u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::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 ::tracing::field::Value))])
});
} else { ; }
};debug!(
341 "original_poly_trait_ref={:?} upcast_trait_ref={:?} target_trait={:?}",
342 original_poly_trait_ref, upcast_trait_ref, trait_def_id
343 );
344 upcast_trait_ref.args
345 })
346 }
347
348 probe::TraitPick { .. } => {
349 let trait_def_id = pick.item.container_id(self.tcx);
350
351 self.fresh_args_for_item(self.span, trait_def_id)
357 }
358
359 probe::WhereClausePick(poly_trait_ref) => {
360 self.instantiate_binder_with_fresh_vars(poly_trait_ref).args
363 }
364 }
365 }
366
367 fn extract_existential_trait_ref<R, F>(&mut self, self_ty: Ty<'tcx>, mut closure: F) -> R
368 where
369 F: FnMut(&mut ConfirmContext<'a, 'tcx>, Ty<'tcx>, ty::PolyExistentialTraitRef<'tcx>) -> R,
370 {
371 let mut autoderef = self.fcx.autoderef(self.span, self_ty);
377
378 if self.tcx.features().arbitrary_self_types()
381 || self.tcx.features().arbitrary_self_types_pointers()
382 {
383 autoderef = autoderef.use_receiver_trait();
384 }
385
386 autoderef
387 .include_raw_pointers()
388 .find_map(|(ty, _)| match ty.kind() {
389 ty::Dynamic(data, ..) => Some(closure(
390 self,
391 ty,
392 data.principal().unwrap_or_else(|| {
393 ::rustc_span::macros::bug_impl(Some(self.span),
format_args!("calling trait method on empty object?"), Location::caller())span_bug!(self.span, "calling trait method on empty object?")
394 }),
395 )),
396 _ => None,
397 })
398 .unwrap_or_else(|| {
399 ::rustc_span::macros::bug_impl(Some(self.span),
format_args!("self-type `{0}` for ObjectPick never dereferenced to an object",
self_ty), Location::caller())span_bug!(
400 self.span,
401 "self-type `{}` for ObjectPick never dereferenced to an object",
402 self_ty
403 )
404 })
405 }
406
407 fn instantiate_method_args(
408 &mut self,
409 pick: &probe::Pick<'tcx>,
410 seg: &hir::PathSegment<'tcx>,
411 parent_args: GenericArgsRef<'tcx>,
412 ) -> GenericArgsRef<'tcx> {
413 let generics = self.tcx.generics_of(pick.item.def_id);
417
418 let arg_count_correct = check_generic_arg_count_for_value_path(
419 self.fcx,
420 pick.item.def_id,
421 generics,
422 seg,
423 IsMethodCall::Yes,
424 );
425
426 {
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());
429
430 struct GenericArgsCtxt<'a, 'tcx> {
431 cfcx: &'a ConfirmContext<'a, 'tcx>,
432 pick: &'a probe::Pick<'tcx>,
433 seg: &'a hir::PathSegment<'tcx>,
434 }
435 impl<'a, 'tcx> GenericArgsLowerer<'a, 'tcx> for GenericArgsCtxt<'a, 'tcx> {
436 fn args_for_def_id(
437 &mut self,
438 def_id: DefId,
439 ) -> (Option<&'a hir::GenericArgs<'tcx>>, bool) {
440 if def_id == self.pick.item.def_id {
441 if let Some(data) = self.seg.args {
442 return (Some(data), false);
443 }
444 }
445 (None, false)
446 }
447
448 fn provided_kind(
449 &mut self,
450 preceding_args: &[ty::GenericArg<'tcx>],
451 param: &ty::GenericParamDef,
452 arg: &hir::GenericArg<'_>,
453 ) -> ty::GenericArg<'tcx> {
454 match (¶m.kind, arg) {
455 (GenericParamDefKind::Lifetime, hir::GenericArg::Lifetime(lt)) => self
456 .cfcx
457 .fcx
458 .lowerer()
459 .lower_lifetime(lt, RegionInferReason::Param(param))
460 .into(),
461 (GenericParamDefKind::Type { .. }, hir::GenericArg::Type(ty)) => {
462 self.cfcx.lower_ty(ty.as_unambig_ty()).raw.into()
464 }
465 (GenericParamDefKind::Type { .. }, hir::GenericArg::Infer(inf)) => {
466 self.cfcx.lower_ty(&inf.to_ty()).raw.into()
467 }
468 (GenericParamDefKind::Const { .. }, hir::GenericArg::Const(ct)) => self
469 .cfcx
470 .lower_const_arg(
472 ct.as_unambig_ct(),
473 self.cfcx
474 .tcx
475 .type_of(param.def_id)
476 .instantiate(self.cfcx.tcx, preceding_args)
477 .skip_norm_wip(),
478 )
479 .into(),
480 (GenericParamDefKind::Const { .. }, hir::GenericArg::Infer(inf)) => {
481 self.cfcx.ct_infer(Some(param), inf.span).into()
482 }
483 (kind, arg) => {
484 ::rustc_span::macros::bug_impl(None,
format_args!("mismatched method arg kind {0:?} in turbofish: {1:?}", kind,
arg), Location::caller())bug!("mismatched method arg kind {kind:?} in turbofish: {arg:?}")
485 }
486 }
487 }
488
489 fn inferred_kind(
490 &mut self,
491 _preceding_args: &[ty::GenericArg<'tcx>],
492 param: &ty::GenericParamDef,
493 _infer_args: bool,
494 ) -> ty::GenericArg<'tcx> {
495 self.cfcx.var_for_def(self.cfcx.span, param)
496 }
497 }
498
499 let args = lower_generic_args(
500 self.fcx,
501 pick.item.def_id,
502 parent_args,
503 false,
504 None,
505 &arg_count_correct,
506 &mut GenericArgsCtxt { cfcx: self, pick, seg },
507 );
508
509 if !args.is_empty() && !generics.is_own_empty() {
524 let user_type_annotation = self.probe(|_| {
525 let user_args = UserArgs {
526 args: GenericArgs::for_item(self.tcx, pick.item.def_id, |param, _| {
527 let i = param.index as usize;
528 if i < generics.parent_count {
529 self.fcx.var_for_def(DUMMY_SP, param)
530 } else {
531 args[i]
532 }
533 }),
534 user_self_ty: None, };
536
537 self.fcx.canonicalize_user_type_annotation(ty::UserType::new(
538 ty::UserTypeKind::TypeOf(pick.item.def_id, user_args),
539 ))
540 });
541
542 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:542",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(542u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("instantiate_method_args: user_type_annotation={0:?}",
user_type_annotation) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("instantiate_method_args: user_type_annotation={:?}", user_type_annotation);
543
544 if !self.skip_record_for_diagnostics {
545 self.fcx.write_user_type_annotation(self.call_expr.hir_id, user_type_annotation);
546 }
547 }
548
549 self.normalize(self.span, Unnormalized::new_wip(args))
550 }
551
552 fn unify_receivers(
553 &mut self,
554 self_ty: Ty<'tcx>,
555 method_self_ty: Ty<'tcx>,
556 pick: &probe::Pick<'tcx>,
557 ) {
558 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:558",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(558u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::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 ::tracing::field::Value))])
});
} else { ; }
};debug!(
559 "unify_receivers: self_ty={:?} method_self_ty={:?} span={:?} pick={:?}",
560 self_ty, method_self_ty, self.span, pick
561 );
562 let cause = self.cause(self.self_expr.span, ObligationCauseCode::Misc);
563 match self.at(&cause, self.param_env).sup(DefineOpaqueTypes::Yes, method_self_ty, self_ty) {
564 Ok(InferOk { obligations, value: () }) => {
565 self.register_predicates(obligations);
566 }
567 Err(terr) => {
568 if self.tcx.features().arbitrary_self_types() {
569 self.err_ctxt()
570 .report_mismatched_types(
571 &cause,
572 self.param_env,
573 method_self_ty,
574 self_ty,
575 terr,
576 )
577 .emit();
578 } else {
579 self.dcx().span_delayed_bug(
582 cause.span,
583 ::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?"),
584 );
585 }
586 }
587 }
588 }
589
590 fn instantiate_method_sig(
594 &mut self,
595 pick: &probe::Pick<'tcx>,
596 all_args: GenericArgsRef<'tcx>,
597 ) -> (ty::FnSig<'tcx>, ty::InstantiatedClauses<'tcx>) {
598 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:598",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(598u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("instantiate_method_sig(pick={0:?}, all_args={1:?})",
pick, all_args) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("instantiate_method_sig(pick={:?}, all_args={:?})", pick, all_args);
599
600 let def_id = pick.item.def_id;
604 let method_clauses = self.tcx.clauses_of(def_id).instantiate(self.tcx, all_args);
605
606 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:606",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(606u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("method_clauses after instantiation = {0:?}",
method_clauses) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("method_clauses after instantiation = {:?}", method_clauses);
607
608 let sig = self.tcx.fn_sig(def_id).instantiate(self.tcx, all_args).skip_norm_wip();
609 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:609",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(609u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("type scheme instantiated, sig={0:?}",
sig) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("type scheme instantiated, sig={:?}", sig);
610
611 let sig = self.instantiate_binder_with_fresh_vars(sig);
612 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:612",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(612u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("late-bound lifetimes from method instantiated, sig={0:?}",
sig) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("late-bound lifetimes from method instantiated, sig={:?}", sig);
613
614 (sig, method_clauses)
615 }
616
617 fn add_obligations(
618 &mut self,
619 sig: ty::FnSig<'tcx>,
620 all_args: GenericArgsRef<'tcx>,
621 method_clauses: ty::InstantiatedClauses<'tcx>,
622 def_id: DefId,
623 ) {
624 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event /rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs:624",
"rustc_hir_typeck::method::confirm",
::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("/rustc-dev/28221559263a3976766cf305940e80e30cf9ba8a/compiler/rustc_hir_typeck/src/method/confirm.rs"),
::tracing_core::__macro_support::Option::Some(624u32),
::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};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("add_obligations: sig={0:?} all_args={1:?} method_clauses={2:?} def_id={3:?}",
sig, all_args, method_clauses, def_id) as
&dyn ::tracing::field::Value))])
});
} else { ; }
};debug!(
625 "add_obligations: sig={:?} all_args={:?} method_clauses={:?} def_id={:?}",
626 sig, all_args, method_clauses, def_id
627 );
628
629 for obligation in traits::predicates_for_generics(
633 |idx, span| {
634 let code = ObligationCauseCode::WhereClauseInExpr(
635 def_id,
636 span,
637 self.call_expr.hir_id,
638 idx,
639 );
640 self.cause(self.span, code)
641 },
642 |clause| self.normalize(self.call_expr.span, clause),
643 self.param_env,
644 method_clauses,
645 ) {
646 self.register_predicate(obligation);
647 }
648
649 self.add_wf_bounds(all_args, self.call_expr.span);
652
653 for ty in sig.inputs_and_output {
657 self.register_wf_obligation(
658 ty.into(),
659 self.span,
660 ObligationCauseCode::WellFormed(None),
661 );
662 }
663 }
664
665 fn clauses_require_illegal_sized_bound(
669 &self,
670 inst_clauses: ty::InstantiatedClauses<'tcx>,
671 ) -> Option<Span> {
672 let sized_def_id = self.tcx.lang_items().sized_trait()?;
673
674 traits::elaborate(
675 self.tcx,
676 inst_clauses.clauses.iter().copied().map(Unnormalized::skip_norm_wip),
677 )
678 .filter_map(|clause| match clause.kind().skip_binder() {
680 ty::ClauseKind::Trait(trait_pred) if trait_pred.def_id() == sized_def_id => {
681 let span = inst_clauses
682 .iter()
683 .find_map(
684 |(c, span)| if c.skip_norm_wip() == clause { Some(span) } else { None },
685 )
686 .unwrap_or(DUMMY_SP);
687 Some((trait_pred, span))
688 }
689 _ => None,
690 })
691 .find_map(|(trait_pred, span)| match trait_pred.self_ty().kind() {
692 ty::Dynamic(..) => Some(span),
693 _ => None,
694 })
695 }
696
697 fn check_for_illegal_method_calls(&self, pick: &probe::Pick<'_>) {
698 if let Some(trait_def_id) = pick.item.trait_container(self.tcx)
700 && let Err(e) = callee::check_legal_trait_for_method_call(
701 self.tcx,
702 self.span,
703 Some(self.self_expr.span),
704 self.call_expr.span,
705 trait_def_id,
706 self.body_def_id.to_def_id(),
707 )
708 {
709 self.set_tainted_by_errors(e);
710 }
711 }
712
713 fn lint_shadowed_supertrait_items(
714 &self,
715 pick: &probe::Pick<'_>,
716 segment: &hir::PathSegment<'tcx>,
717 ) {
718 if pick.shadowed_candidates.is_empty() {
719 return;
720 }
721
722 let shadower_span = self.tcx.def_span(pick.item.def_id);
723 let subtrait = self.tcx.item_name(pick.item.trait_container(self.tcx).unwrap());
724 let shadower = SupertraitItemShadower { span: shadower_span, subtrait };
725
726 let shadowee = if let [shadowee] = &pick.shadowed_candidates[..] {
727 let shadowee_span = self.tcx.def_span(shadowee.def_id);
728 let supertrait = self.tcx.item_name(shadowee.trait_container(self.tcx).unwrap());
729 SupertraitItemShadowee::Labeled { span: shadowee_span, supertrait }
730 } else {
731 let (traits, spans): (Vec<_>, Vec<_>) = pick
732 .shadowed_candidates
733 .iter()
734 .map(|item| {
735 (
736 self.tcx.item_name(item.trait_container(self.tcx).unwrap()),
737 self.tcx.def_span(item.def_id),
738 )
739 })
740 .unzip();
741 SupertraitItemShadowee::Several { traits: traits.into(), spans: spans.into() }
742 };
743
744 self.tcx.emit_node_span_lint(
745 RESOLVING_TO_ITEMS_SHADOWING_SUPERTRAIT_ITEMS,
746 segment.hir_id,
747 segment.ident.span,
748 SupertraitItemShadowing { shadower, shadowee, item: segment.ident.name, subtrait },
749 );
750 }
751
752 fn lint_ambiguously_glob_imported_traits(
753 &self,
754 pick: &probe::Pick<'_>,
755 segment: &hir::PathSegment<'tcx>,
756 ) {
757 if pick.kind != (probe::PickKind::TraitPick { is_ambiguously_imported: true }) {
758 return;
759 }
760 let trait_name = self.tcx.item_name(pick.item.container_id(self.tcx));
761 let import_span = self.tcx.hir_span_if_local(pick.import_ids[0].to_def_id()).unwrap();
762
763 self.tcx.emit_node_lint(
764 AMBIGUOUS_GLOB_IMPORTED_TRAITS,
765 segment.hir_id,
766 rustc_errors::DiagDecorator(|diag| {
767 diag.primary_message(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("use of ambiguously glob imported trait `{0}`",
trait_name))
})format!(
768 "use of ambiguously glob imported trait `{trait_name}`"
769 ))
770 .span(segment.ident.span)
771 .span_label(import_span, ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}` imported ambiguously here",
trait_name))
})format!("`{trait_name}` imported ambiguously here"))
772 .help(::alloc::__export::must_use({
::alloc::fmt::format(format_args!("import `{0}` explicitly",
trait_name))
})format!("import `{trait_name}` explicitly"));
773 }),
774 );
775 }
776
777 fn upcast(
778 &mut self,
779 source_trait_ref: ty::PolyTraitRef<'tcx>,
780 target_trait_def_id: DefId,
781 ) -> ty::PolyTraitRef<'tcx> {
782 let upcast_trait_refs =
783 traits::upcast_choices(self.tcx, source_trait_ref, target_trait_def_id);
784
785 if let &[upcast_trait_ref] = upcast_trait_refs.as_slice() {
787 upcast_trait_ref
788 } else {
789 self.dcx().span_delayed_bug(
790 self.span,
791 ::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!(
792 "cannot uniquely upcast `{:?}` to `{:?}`: `{:?}`",
793 source_trait_ref, target_trait_def_id, upcast_trait_refs
794 ),
795 );
796
797 ty::Binder::dummy(ty::TraitRef::new_from_args(
798 self.tcx,
799 target_trait_def_id,
800 ty::GenericArgs::extend_with_error(self.tcx, target_trait_def_id, &[]),
801 ))
802 }
803 }
804
805 fn instantiate_binder_with_fresh_vars<T>(&self, value: ty::Binder<'tcx, T>) -> T
806 where
807 T: TypeFoldable<TyCtxt<'tcx>> + Copy,
808 {
809 self.fcx.instantiate_binder_with_fresh_vars(
810 self.span,
811 BoundRegionConversionTime::FnCall,
812 value,
813 )
814 }
815}