Skip to content

Commit

Permalink
Bail on any found recursion when expanding opaque types
Browse files Browse the repository at this point in the history
Fixes #87450. More of a bandaid because it does not fix the exponential complexity of the type folding used for opaque type expansion.
  • Loading branch information
hkratz committed Jul 28, 2021
1 parent eba3228 commit aa465a5
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion compiler/rustc_middle/src/ty/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,7 @@ impl<'tcx> TyCtxt<'tcx> {
expanded_cache: FxHashMap::default(),
primary_def_id: Some(def_id),
found_recursion: false,
found_any_recursion: false,
check_recursion: true,
tcx: self,
};
Expand All @@ -560,6 +561,7 @@ struct OpaqueTypeExpander<'tcx> {
expanded_cache: FxHashMap<(DefId, SubstsRef<'tcx>), Ty<'tcx>>,
primary_def_id: Option<DefId>,
found_recursion: bool,
found_any_recursion: bool,
/// Whether or not to check for recursive opaque types.
/// This is `true` when we're explicitly checking for opaque type
/// recursion, and 'false' otherwise to avoid unnecessary work.
Expand All @@ -569,7 +571,7 @@ struct OpaqueTypeExpander<'tcx> {

impl<'tcx> OpaqueTypeExpander<'tcx> {
fn expand_opaque_ty(&mut self, def_id: DefId, substs: SubstsRef<'tcx>) -> Option<Ty<'tcx>> {
if self.found_recursion {
if self.found_any_recursion {
return None;
}
let substs = substs.fold_with(self);
Expand All @@ -591,6 +593,7 @@ impl<'tcx> OpaqueTypeExpander<'tcx> {
} else {
// If another opaque type that we contain is recursive, then it
// will report the error, so we don't have to.
self.found_any_recursion = true;
self.found_recursion = def_id == *self.primary_def_id.as_ref().unwrap();
None
}
Expand Down Expand Up @@ -1078,6 +1081,7 @@ pub fn normalize_opaque_types(
expanded_cache: FxHashMap::default(),
primary_def_id: None,
found_recursion: false,
found_any_recursion: false,
check_recursion: false,
tcx,
};
Expand Down

0 comments on commit aa465a5

Please sign in to comment.