Auto merge of #101261 - TaKO8Ki:separate-receiver-from-arguments-in-hir, r=cjgillot
Separate the receiver from arguments in HIR Related to #100232 cc `@cjgillot`
This commit is contained in:
commit
b44197abb0
140 changed files with 815 additions and 720 deletions
|
@ -61,7 +61,7 @@ impl<'tcx> LateLintPass<'tcx> for ArrayIntoIter {
|
|||
}
|
||||
|
||||
// We only care about method call expressions.
|
||||
if let hir::ExprKind::MethodCall(call, args, _) = &expr.kind {
|
||||
if let hir::ExprKind::MethodCall(call, receiver_arg, ..) = &expr.kind {
|
||||
if call.ident.name != sym::into_iter {
|
||||
return;
|
||||
}
|
||||
|
@ -75,7 +75,6 @@ impl<'tcx> LateLintPass<'tcx> for ArrayIntoIter {
|
|||
};
|
||||
|
||||
// As this is a method call expression, we have at least one argument.
|
||||
let receiver_arg = &args[0];
|
||||
let receiver_ty = cx.typeck_results().expr_ty(receiver_arg);
|
||||
let adjustments = cx.typeck_results().expr_adjustments(receiver_arg);
|
||||
|
||||
|
|
|
@ -2412,13 +2412,13 @@ impl<'tcx> LateLintPass<'tcx> for InvalidValue {
|
|||
_ => {}
|
||||
}
|
||||
}
|
||||
} else if let hir::ExprKind::MethodCall(_, ref args, _) = expr.kind {
|
||||
} else if let hir::ExprKind::MethodCall(_, receiver, ..) = expr.kind {
|
||||
// Find problematic calls to `MaybeUninit::assume_init`.
|
||||
let def_id = cx.typeck_results().type_dependent_def_id(expr.hir_id)?;
|
||||
if cx.tcx.is_diagnostic_item(sym::assume_init, def_id) {
|
||||
// This is a call to *some* method named `assume_init`.
|
||||
// See if the `self` parameter is one of the dangerous constructors.
|
||||
if let hir::ExprKind::Call(ref path_expr, _) = args[0].kind {
|
||||
if let hir::ExprKind::Call(ref path_expr, _) = receiver.kind {
|
||||
if let hir::ExprKind::Path(ref qpath) = path_expr.kind {
|
||||
let def_id = cx.qpath_res(qpath, path_expr.hir_id).opt_def_id()?;
|
||||
match cx.tcx.get_diagnostic_name(def_id) {
|
||||
|
|
|
@ -51,7 +51,7 @@ fn typeck_results_of_method_fn<'tcx>(
|
|||
expr: &Expr<'_>,
|
||||
) -> Option<(Span, DefId, ty::subst::SubstsRef<'tcx>)> {
|
||||
match expr.kind {
|
||||
ExprKind::MethodCall(segment, _, _)
|
||||
ExprKind::MethodCall(segment, ..)
|
||||
if let Some(def_id) = cx.typeck_results().type_dependent_def_id(expr.hir_id) =>
|
||||
{
|
||||
Some((segment.ident.span, def_id, cx.typeck_results().node_substs(expr.hir_id)))
|
||||
|
|
|
@ -44,9 +44,13 @@ fn in_macro(span: Span) -> bool {
|
|||
|
||||
fn first_method_call<'tcx>(
|
||||
expr: &'tcx Expr<'tcx>,
|
||||
) -> Option<(&'tcx PathSegment<'tcx>, &'tcx [Expr<'tcx>])> {
|
||||
if let ExprKind::MethodCall(path, args, _) = &expr.kind {
|
||||
if args.iter().any(|e| e.span.from_expansion()) { None } else { Some((path, *args)) }
|
||||
) -> Option<(&'tcx PathSegment<'tcx>, &'tcx Expr<'tcx>)> {
|
||||
if let ExprKind::MethodCall(path, receiver, args, ..) = &expr.kind {
|
||||
if args.iter().any(|e| e.span.from_expansion()) || receiver.span.from_expansion() {
|
||||
None
|
||||
} else {
|
||||
Some((path, *receiver))
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
|
@ -59,15 +63,13 @@ impl<'tcx> LateLintPass<'tcx> for TemporaryCStringAsPtr {
|
|||
}
|
||||
|
||||
match first_method_call(expr) {
|
||||
Some((path, args)) if path.ident.name == sym::as_ptr => {
|
||||
let unwrap_arg = &args[0];
|
||||
Some((path, unwrap_arg)) if path.ident.name == sym::as_ptr => {
|
||||
let as_ptr_span = path.ident.span;
|
||||
match first_method_call(unwrap_arg) {
|
||||
Some((path, args))
|
||||
Some((path, receiver))
|
||||
if path.ident.name == sym::unwrap || path.ident.name == sym::expect =>
|
||||
{
|
||||
let source_arg = &args[0];
|
||||
lint_cstring_as_ptr(cx, as_ptr_span, source_arg, unwrap_arg);
|
||||
lint_cstring_as_ptr(cx, as_ptr_span, receiver, unwrap_arg);
|
||||
}
|
||||
_ => return,
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ declare_lint_pass!(NoopMethodCall => [NOOP_METHOD_CALL]);
|
|||
impl<'tcx> LateLintPass<'tcx> for NoopMethodCall {
|
||||
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
|
||||
// We only care about method calls.
|
||||
let ExprKind::MethodCall(call, elements, _) = &expr.kind else {
|
||||
let ExprKind::MethodCall(call, receiver, ..) = &expr.kind else {
|
||||
return
|
||||
};
|
||||
// We only care about method calls corresponding to the `Clone`, `Deref` and `Borrow`
|
||||
|
@ -81,7 +81,6 @@ impl<'tcx> LateLintPass<'tcx> for NoopMethodCall {
|
|||
) {
|
||||
return;
|
||||
}
|
||||
let receiver = &elements[0];
|
||||
let receiver_ty = cx.typeck_results().expr_ty(receiver);
|
||||
let expr_ty = cx.typeck_results().expr_ty_adjusted(expr);
|
||||
if receiver_ty != expr_ty {
|
||||
|
|
|
@ -1458,7 +1458,7 @@ impl InvalidAtomicOrdering {
|
|||
sym::AtomicI64,
|
||||
sym::AtomicI128,
|
||||
];
|
||||
if let ExprKind::MethodCall(ref method_path, args, _) = &expr.kind
|
||||
if let ExprKind::MethodCall(ref method_path, _, args, _) = &expr.kind
|
||||
&& recognized_names.contains(&method_path.ident.name)
|
||||
&& let Some(m_def_id) = cx.typeck_results().type_dependent_def_id(expr.hir_id)
|
||||
&& let Some(impl_did) = cx.tcx.impl_of_method(m_def_id)
|
||||
|
@ -1494,8 +1494,8 @@ impl InvalidAtomicOrdering {
|
|||
fn check_atomic_load_store(cx: &LateContext<'_>, expr: &Expr<'_>) {
|
||||
if let Some((method, args)) = Self::inherent_atomic_method_call(cx, expr, &[sym::load, sym::store])
|
||||
&& let Some((ordering_arg, invalid_ordering)) = match method {
|
||||
sym::load => Some((&args[1], sym::Release)),
|
||||
sym::store => Some((&args[2], sym::Acquire)),
|
||||
sym::load => Some((&args[0], sym::Release)),
|
||||
sym::store => Some((&args[1], sym::Acquire)),
|
||||
_ => None,
|
||||
}
|
||||
&& let Some(ordering) = Self::match_ordering(cx, ordering_arg)
|
||||
|
@ -1536,8 +1536,8 @@ impl InvalidAtomicOrdering {
|
|||
else {return };
|
||||
|
||||
let fail_order_arg = match method {
|
||||
sym::fetch_update => &args[2],
|
||||
sym::compare_exchange | sym::compare_exchange_weak => &args[4],
|
||||
sym::fetch_update => &args[1],
|
||||
sym::compare_exchange | sym::compare_exchange_weak => &args[3],
|
||||
_ => return,
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue