Auto merge of #11215 - MrNossiom:master, r=Jarcho

ptr_arg should ignore extern functions

Fixes: #11181

changelog: [`ptr_arg`]: ignore extern functions that are not

I am not sure whether we should ignore other Rust calling conventions like `rust-intrinsic`, `rust-call` or `rust-cold`.
This commit is contained in:
bors 2023-07-24 00:01:48 +00:00
commit a447725394
2 changed files with 26 additions and 0 deletions

View file

@ -26,6 +26,7 @@ use rustc_session::{declare_lint_pass, declare_tool_lint};
use rustc_span::source_map::Span;
use rustc_span::sym;
use rustc_span::symbol::Symbol;
use rustc_target::spec::abi::Abi;
use rustc_trait_selection::infer::InferCtxtExt as _;
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
use std::{fmt, iter};
@ -163,6 +164,12 @@ impl<'tcx> LateLintPass<'tcx> for Ptr {
}
check_mut_from_ref(cx, sig, None);
if !matches!(sig.header.abi, Abi::Rust) {
// Ignore `extern` functions with non-Rust calling conventions
return;
}
for arg in check_fn_args(
cx,
cx.tcx.fn_sig(item.owner_id).subst_identity().skip_binder().inputs(),
@ -218,6 +225,12 @@ impl<'tcx> LateLintPass<'tcx> for Ptr {
};
check_mut_from_ref(cx, sig, Some(body));
if !matches!(sig.header.abi, Abi::Rust) {
// Ignore `extern` functions with non-Rust calling conventions
return;
}
let decl = sig.decl;
let sig = cx.tcx.fn_sig(item_id).subst_identity().skip_binder();
let lint_args: Vec<_> = check_fn_args(cx, sig.inputs(), decl.inputs, &decl.output, body.params)

View file

@ -267,3 +267,16 @@ mod issue_9218 {
todo!()
}
}
mod issue_11181 {
extern "C" fn allowed(_v: &Vec<u32>) {}
struct S;
impl S {
extern "C" fn allowed(_v: &Vec<u32>) {}
}
trait T {
extern "C" fn allowed(_v: &Vec<u32>) {}
}
}