Skip to content

Commit e322c77

Browse files
committed
use TyS::walk
1 parent b27cbda commit e322c77

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

clippy_utils/src/lib.rs

+8-11
Original file line numberDiff line numberDiff line change
@@ -1504,26 +1504,23 @@ fn is_normalizable_helper<'tcx>(
15041504
cache.insert(ty, false); // prevent recursive loops
15051505
let result = cx.tcx.infer_ctxt().enter(|infcx| {
15061506
let cause = rustc_middle::traits::ObligationCause::dummy();
1507-
if infcx.at(&cause, param_env).normalize(ty).is_err() {
1508-
false
1509-
} else {
1507+
if infcx.at(&cause, param_env).normalize(ty).is_ok() {
15101508
match ty.kind() {
15111509
ty::Adt(def, substs) => !def.variants.iter().any(|variant| {
15121510
variant
15131511
.fields
15141512
.iter()
15151513
.any(|field| !is_normalizable_helper(cx, param_env, field.ty(cx.tcx, substs), cache))
15161514
}),
1517-
ty::Ref(_, pointee, _) | ty::RawPtr(ty::TypeAndMut { ty: pointee, .. }) => {
1518-
is_normalizable_helper(cx, param_env, pointee, cache)
1519-
},
1520-
ty::Array(inner_ty, _) | ty::Slice(inner_ty) => is_normalizable_helper(cx, param_env, inner_ty, cache),
1521-
ty::Tuple(tys) => !tys.iter().any(|inner| match inner.unpack() {
1522-
GenericArgKind::Type(inner_ty) => !is_normalizable_helper(cx, param_env, inner_ty, cache),
1523-
_ => false,
1515+
_ => !ty.walk().any(|generic_arg| !match generic_arg.unpack() {
1516+
GenericArgKind::Type(inner_ty) if inner_ty != ty => {
1517+
is_normalizable_helper(cx, param_env, inner_ty, cache)
1518+
},
1519+
_ => true, // if inner_ty == ty, we've already checked it
15241520
}),
1525-
_ => true,
15261521
}
1522+
} else {
1523+
false
15271524
}
15281525
});
15291526
cache.insert(ty, result);

tests/ui/crashes/ice-6840.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,19 @@ pub struct RuleEdges<R: Rule> {
1313

1414
type RuleDependencyEdges<R> = HashMap<u32, RuleEdges<R>>;
1515

16-
// and additional potential variants
16+
// reproducer from the GitHub issue ends here
17+
// but check some additional variants
1718
type RuleDependencyEdgesArray<R> = HashMap<u32, [RuleEdges<R>; 8]>;
1819
type RuleDependencyEdgesSlice<R> = HashMap<u32, &'static [RuleEdges<R>]>;
1920
type RuleDependencyEdgesRef<R> = HashMap<u32, &'static RuleEdges<R>>;
2021
type RuleDependencyEdgesRaw<R> = HashMap<u32, *const RuleEdges<R>>;
2122
type RuleDependencyEdgesTuple<R> = HashMap<u32, (RuleEdges<R>, RuleEdges<R>)>;
2223

24+
// and an additional checks to make sure fix doesn't have stack-overflow issue
25+
// on self-containing types
26+
pub struct SelfContaining {
27+
inner: Box<SelfContaining>,
28+
}
29+
type SelfContainingEdges = HashMap<u32, SelfContaining>;
30+
2331
fn main() {}

0 commit comments

Comments
 (0)