summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@fb.com>2021-07-30 17:25:08 -0700
committerEmilio Cobos Álvarez <emilio@crisal.io>2021-08-24 11:50:55 +0200
commitb71e73bfb58a7c70d6e1561b258b4f648246a374 (patch)
treecf4036af894091891626668f883959ce2b01e7a3 /src
parentcf6edbd7b0dc59b82311b65dcb62d5993349f577 (diff)
Detect and avoid cycles when resolving items.
These can happen in certain cases involving incomplete qualified dependent types. To avoid looping forever, we need to check for them. Closes #2085.
Diffstat (limited to 'src')
-rw-r--r--src/ir/context.rs8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/ir/context.rs b/src/ir/context.rs
index bd21058c..44df063a 100644
--- a/src/ir/context.rs
+++ b/src/ir/context.rs
@@ -2723,8 +2723,16 @@ impl ItemResolver {
assert!(ctx.collected_typerefs());
let mut id = self.id;
+ let mut seen_ids = HashSet::default();
loop {
let item = ctx.resolve_item(id);
+
+ // Detect cycles and bail out. These can happen in certain cases
+ // involving incomplete qualified dependent types (#2085).
+ if !seen_ids.insert(id) {
+ return item;
+ }
+
let ty_kind = item.as_type().map(|t| t.kind());
match ty_kind {
Some(&TypeKind::ResolvedTypeRef(next_id))