effects: Run enforce_context_effects
for all method calls
This commit is contained in:
parent
fad6bb80fa
commit
d5ebdfc2c5
11 changed files with 96 additions and 48 deletions
|
@ -845,7 +845,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
expected,
|
||||
);
|
||||
|
||||
self.write_method_call(call_expr.hir_id, method_callee);
|
||||
self.write_method_call(call_expr.hir_id, call_expr.span, method_callee);
|
||||
output_type
|
||||
}
|
||||
}
|
||||
|
@ -895,7 +895,7 @@ impl<'a, 'tcx> DeferredCallResolution<'tcx> {
|
|||
adjustments.extend(autoref);
|
||||
fcx.apply_adjustments(self.callee_expr, adjustments);
|
||||
|
||||
fcx.write_method_call(self.call_expr.hir_id, method_callee);
|
||||
fcx.write_method_call(self.call_expr.hir_id, self.call_expr.span, method_callee);
|
||||
}
|
||||
None => {
|
||||
// This can happen if `#![no_core]` is used and the `fn/fn_mut/fn_once`
|
||||
|
|
|
@ -1313,9 +1313,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
Ok(method) => {
|
||||
// We could add a "consider `foo::<params>`" suggestion here, but I wasn't able to
|
||||
// trigger this codepath causing `structurally_resolve_type` to emit an error.
|
||||
|
||||
self.enforce_context_effects(expr.hir_id, expr.span, method.def_id, method.args);
|
||||
self.write_method_call(expr.hir_id, method);
|
||||
self.write_method_call(expr.hir_id, expr.span, method);
|
||||
Ok(method)
|
||||
}
|
||||
Err(error) => {
|
||||
|
|
|
@ -159,7 +159,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
|
||||
#[instrument(level = "debug", skip(self))]
|
||||
pub fn write_method_call(&self, hir_id: hir::HirId, method: MethodCallee<'tcx>) {
|
||||
pub fn write_method_call(&self, hir_id: hir::HirId, span: Span, method: MethodCallee<'tcx>) {
|
||||
self.enforce_context_effects(hir_id, span, method.def_id, method.args);
|
||||
self.write_resolution(hir_id, Ok((DefKind::AssocFn, method.def_id)));
|
||||
self.write_args(hir_id, method.args);
|
||||
}
|
||||
|
|
|
@ -442,9 +442,13 @@ fn fatally_break_rust(tcx: TyCtxt<'_>) {
|
|||
}
|
||||
}
|
||||
|
||||
/// `expected` here is the expected number of explicit generic arguments on the trait.
|
||||
fn has_expected_num_generic_args(tcx: TyCtxt<'_>, trait_did: DefId, expected: usize) -> bool {
|
||||
let generics = tcx.generics_of(trait_did);
|
||||
generics.count() == expected + if generics.has_self { 1 } else { 0 }
|
||||
generics.count()
|
||||
== expected
|
||||
+ if generics.has_self { 1 } else { 0 }
|
||||
+ if generics.host_effect_index.is_some() { 1 } else { 0 }
|
||||
}
|
||||
|
||||
pub fn provide(providers: &mut Providers) {
|
||||
|
|
|
@ -291,7 +291,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
.push(autoref);
|
||||
}
|
||||
}
|
||||
self.write_method_call(expr.hir_id, method);
|
||||
self.write_method_call(expr.hir_id, expr.span, method);
|
||||
|
||||
method.sig.output()
|
||||
}
|
||||
|
@ -781,7 +781,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
assert!(op.is_by_value());
|
||||
match self.lookup_op_method(operand_ty, None, Op::Unary(op, ex.span), expected) {
|
||||
Ok(method) => {
|
||||
self.write_method_call(ex.hir_id, method);
|
||||
self.write_method_call(ex.hir_id, ex.span, method);
|
||||
method.sig.output()
|
||||
}
|
||||
Err(errors) => {
|
||||
|
|
|
@ -38,7 +38,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
span_bug!(expr.span, "input to deref is not a ref?");
|
||||
}
|
||||
let ty = self.make_overloaded_place_return_type(method).ty;
|
||||
self.write_method_call(expr.hir_id, method);
|
||||
self.write_method_call(expr.hir_id, expr.span, method);
|
||||
Some(ty)
|
||||
}
|
||||
|
||||
|
@ -179,7 +179,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
}
|
||||
self.apply_adjustments(base_expr, adjustments);
|
||||
|
||||
self.write_method_call(expr.hir_id, method);
|
||||
self.write_method_call(expr.hir_id, expr.span, method);
|
||||
|
||||
return Some((input_ty, self.make_overloaded_place_return_type(method).ty));
|
||||
}
|
||||
|
@ -404,7 +404,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
None => return,
|
||||
};
|
||||
debug!("convert_place_op_to_mutable: method={:?}", method);
|
||||
self.write_method_call(expr.hir_id, method);
|
||||
self.write_method_call(expr.hir_id, expr.span, method);
|
||||
|
||||
let ty::Ref(region, _, hir::Mutability::Mut) = method.sig.inputs()[0].kind() else {
|
||||
span_bug!(expr.span, "input to mutable place op is not a mut ref?");
|
||||
|
|
|
@ -263,13 +263,13 @@ impl<'tcx> ConstToPat<'tcx> {
|
|||
// (If there isn't, then we can safely issue a hard
|
||||
// error, because that's never worked, due to compiler
|
||||
// using `PartialEq::eq` in this scenario in the past.)
|
||||
let partial_eq_trait_id =
|
||||
self.tcx().require_lang_item(hir::LangItem::PartialEq, Some(self.span));
|
||||
let tcx = self.tcx();
|
||||
let partial_eq_trait_id = tcx.require_lang_item(hir::LangItem::PartialEq, Some(self.span));
|
||||
let partial_eq_obligation = Obligation::new(
|
||||
self.tcx(),
|
||||
tcx,
|
||||
ObligationCause::dummy(),
|
||||
self.param_env,
|
||||
ty::TraitRef::new(self.tcx(), partial_eq_trait_id, [ty, ty]),
|
||||
ty::TraitRef::new(tcx, partial_eq_trait_id, [ty, ty]),
|
||||
);
|
||||
|
||||
// This *could* accept a type that isn't actually `PartialEq`, because region bounds get
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue