about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-09-13 14:52:58 +0000
committerbors <bors@rust-lang.org>2022-09-13 14:52:58 +0000
commitba15f75c39acf488d1fc4cc11cfc1cbb3dda0f7a (patch)
tree291121349b3bb6fe7c9090304326d0d779bd9a4c
parent125d43cb2c1107e081d1c8816faf4437bd911da1 (diff)
parentd223c28c7d89de5a6f040e254c8a602ae7d48814 (diff)
downloadrust-ba15f75c39acf488d1fc4cc11cfc1cbb3dda0f7a.tar.gz
rust-ba15f75c39acf488d1fc4cc11cfc1cbb3dda0f7a.zip
Auto merge of #13225 - lowr:fix/hir-proj-normalization, r=Veykril
fixup: remove unnecessary `Option`

Fixup for #13223, two things:

- `normalize_projection_query()` (and consequently `HirDatabase::normalize_projection()`) never returns `None` (well, it used to when I first wrote it...), so just return `Ty` instead of `Option<Ty>`
- When chalk cannot normalize projection uniquely, `normalize_trait_assoc_type()` used to return `None` before #13223, but not anymore because of the first point. I restored the behavior so its callers work as before.
-rw-r--r--crates/hir-ty/src/db.rs2
-rw-r--r--crates/hir-ty/src/traits.rs6
-rw-r--r--crates/hir/src/lib.rs7
3 files changed, 10 insertions, 5 deletions
diff --git a/crates/hir-ty/src/db.rs b/crates/hir-ty/src/db.rs
index dd5639f00d2..69283e55a4c 100644
--- a/crates/hir-ty/src/db.rs
+++ b/crates/hir-ty/src/db.rs
@@ -156,7 +156,7 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
         &self,
         projection: crate::ProjectionTy,
         env: Arc<crate::TraitEnvironment>,
-    ) -> Option<crate::Ty>;
+    ) -> Ty;
 
     #[salsa::invoke(trait_solve_wait)]
     #[salsa::transparent]
diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs
index aaff894b34f..372c3a3cca6 100644
--- a/crates/hir-ty/src/traits.rs
+++ b/crates/hir-ty/src/traits.rs
@@ -69,10 +69,10 @@ pub(crate) fn normalize_projection_query(
     db: &dyn HirDatabase,
     projection: ProjectionTy,
     env: Arc<TraitEnvironment>,
-) -> Option<Ty> {
-    let mut table = InferenceTable::new(db, env.clone());
+) -> Ty {
+    let mut table = InferenceTable::new(db, env);
     let ty = table.normalize_projection_ty(projection);
-    Some(table.resolve_completely(ty))
+    table.resolve_completely(ty)
 }
 
 /// Solve a trait goal using Chalk.
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs
index b5974a0cfc9..d2717c56654 100644
--- a/crates/hir/src/lib.rs
+++ b/crates/hir/src/lib.rs
@@ -2892,7 +2892,12 @@ impl Type {
             })
             .build();
 
-        db.normalize_projection(projection, self.env.clone()).map(|ty| self.derived(ty))
+        let ty = db.normalize_projection(projection, self.env.clone());
+        if ty.is_unknown() {
+            None
+        } else {
+            Some(self.derived(ty))
+        }
     }
 
     pub fn is_copy(&self, db: &dyn HirDatabase) -> bool {