Rollup merge of #130758 - compiler-errors:ctype-recursion-limit, r=jieyouxu
Revert "Add recursion limit to FFI safety lint" It's not necessarily clear if warning when we hit the recursion limit is the right thing to do, first of all. **More importantly**, this PR was implemented incorrectly in the first place; it was not decrementing the recursion limit when stepping out of a type, so it would trigger when a ctype has more than RECURSION_LIMIT fields *anywhere* in the type's set of recursively reachable fields. Reverts #130598 Reopens #130310 Fixes #130757
This commit is contained in:
commit
fa1bd9b06a
6 changed files with 50 additions and 50 deletions
|
@ -592,8 +592,6 @@ struct CTypesVisitorState<'tcx> {
|
|||
/// The original type being checked, before we recursed
|
||||
/// to any other types it contains.
|
||||
base_ty: Ty<'tcx>,
|
||||
/// Number of times we recursed while checking the type
|
||||
recursion_depth: usize,
|
||||
}
|
||||
|
||||
enum FfiResult<'tcx> {
|
||||
|
@ -899,23 +897,12 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
|||
|
||||
// Protect against infinite recursion, for example
|
||||
// `struct S(*mut S);`.
|
||||
// FIXME: A recursion limit is necessary as well, for irregular
|
||||
// recursive types.
|
||||
if !acc.cache.insert(ty) {
|
||||
return FfiSafe;
|
||||
}
|
||||
|
||||
// Additional recursion check for more complex types like
|
||||
// `struct A<T> { v: *const A<A<T>>, ... }` for which the
|
||||
// cache check above won't be enough (fixes #130310)
|
||||
if !tcx.recursion_limit().value_within_limit(acc.recursion_depth) {
|
||||
return FfiUnsafe {
|
||||
ty: acc.base_ty,
|
||||
reason: fluent::lint_improper_ctypes_recursion_limit_reached,
|
||||
help: None,
|
||||
};
|
||||
}
|
||||
|
||||
acc.recursion_depth += 1;
|
||||
|
||||
match *ty.kind() {
|
||||
ty::Adt(def, args) => {
|
||||
if let Some(boxed) = ty.boxed_ty()
|
||||
|
@ -1261,8 +1248,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
|
|||
return;
|
||||
}
|
||||
|
||||
let mut acc =
|
||||
CTypesVisitorState { cache: FxHashSet::default(), base_ty: ty, recursion_depth: 0 };
|
||||
let mut acc = CTypesVisitorState { cache: FxHashSet::default(), base_ty: ty };
|
||||
match self.check_type_for_ffi(&mut acc, ty) {
|
||||
FfiResult::FfiSafe => {}
|
||||
FfiResult::FfiPhantom(ty) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue