diff options
| author | Ryo Yoshida <low.ryoshida@gmail.com> | 2022-12-07 23:22:37 +0900 |
|---|---|---|
| committer | Ryo Yoshida <low.ryoshida@gmail.com> | 2022-12-08 20:52:03 +0900 |
| commit | 46e1486a90d76c6ff15a7a2baed7b15f54a2e42c (patch) | |
| tree | 4925b4e5445481c312b1fdfa9d147e5a0d6106eb | |
| parent | f9bd48770832a8556ccd1b8e9f147d3f16bcc44a (diff) | |
| download | rust-46e1486a90d76c6ff15a7a2baed7b15f54a2e42c.tar.gz rust-46e1486a90d76c6ff15a7a2baed7b15f54a2e42c.zip | |
Disallow access to free `BoundVar`s outside `TyLoweringContext`
| -rw-r--r-- | crates/hir-ty/src/lower.rs | 7 | ||||
| -rw-r--r-- | crates/hir/src/semantics.rs | 2 | ||||
| -rw-r--r-- | crates/hir/src/source_analyzer.rs | 2 |
3 files changed, 7 insertions, 4 deletions
diff --git a/crates/hir-ty/src/lower.rs b/crates/hir-ty/src/lower.rs index baf9842d5fb..5b0c1a63752 100644 --- a/crates/hir-ty/src/lower.rs +++ b/crates/hir-ty/src/lower.rs @@ -1190,9 +1190,9 @@ pub fn associated_type_shorthand_candidates<R>( db: &dyn HirDatabase, def: GenericDefId, res: TypeNs, - cb: impl FnMut(&Name, &TraitRef, TypeAliasId) -> Option<R>, + mut cb: impl FnMut(&Name, TypeAliasId) -> Option<R>, ) -> Option<R> { - named_associated_type_shorthand_candidates(db, def, res, None, cb) + named_associated_type_shorthand_candidates(db, def, res, None, |name, _, id| cb(name, id)) } fn named_associated_type_shorthand_candidates<R>( @@ -1202,6 +1202,9 @@ fn named_associated_type_shorthand_candidates<R>( def: GenericDefId, res: TypeNs, assoc_name: Option<Name>, + // Do NOT let `cb` touch `TraitRef` outside of `TyLoweringContext`. Its substitution contains + // free `BoundVar`s that need to be shifted and only `TyLoweringContext` knows how to do that + // properly (see `TyLoweringContext::select_associated_type()`). mut cb: impl FnMut(&Name, &TraitRef, TypeAliasId) -> Option<R>, ) -> Option<R> { let mut search = |t| { diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 2e1f88ba090..f887c759849 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -1600,7 +1600,7 @@ impl<'a> SemanticsScope<'a> { self.db, def, resolution.in_type_ns()?, - |name, _, id| cb(name, id.into()), + |name, id| cb(name, id.into()), ) } } diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 91ea1c24d14..38950b12a11 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -967,7 +967,7 @@ fn resolve_hir_path_( db, def, res.in_type_ns()?, - |name, _, id| (name == unresolved.name).then(|| id), + |name, id| (name == unresolved.name).then(|| id), ) }) .map(TypeAlias::from) |
