Skip to content

Commit 8cfc1cd

Browse files
bors[bot]GrayJack
andauthored
Merge #6376
6376: Avoid impls_fnonce to return true when the trait solving is ambiguous r=flodiebold a=GrayJack This PR should fix #6375 This adds a variation of `method_resolution::implements_trait` called `method_resolution::implements_trait_unique`, that only returns true when the trait solving is unique, and also change `impls_fnonce` to use the later instead. I also added a test just to be sure. Co-authored-by: GrayJack <[email protected]>
2 parents 7f346f9 + ae6376d commit 8cfc1cd

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

crates/hir/src/code_model.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1398,7 +1398,7 @@ impl Type {
13981398
};
13991399

14001400
let canonical_ty = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) };
1401-
method_resolution::implements_trait(
1401+
method_resolution::implements_trait_unique(
14021402
&canonical_ty,
14031403
db,
14041404
self.ty.environment.clone(),

crates/hir_ty/src/method_resolution.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,19 @@ pub fn implements_trait(
740740
solution.is_some()
741741
}
742742

743+
pub fn implements_trait_unique(
744+
ty: &Canonical<Ty>,
745+
db: &dyn HirDatabase,
746+
env: Arc<TraitEnvironment>,
747+
krate: CrateId,
748+
trait_: TraitId,
749+
) -> bool {
750+
let goal = generic_implements_goal(db, env, trait_, ty.clone());
751+
let solution = db.trait_solve(krate, goal);
752+
753+
matches!(solution, Some(crate::traits::Solution::Unique(_)))
754+
}
755+
743756
/// This creates Substs for a trait with the given Self type and type variables
744757
/// for all other parameters, to query Chalk with it.
745758
fn generic_implements_goal(

crates/ide/src/syntax_highlighting/test_data/highlighting.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@
115115
<span class="value_param callable">f</span><span class="punctuation">(</span><span class="punctuation">)</span>
116116
<span class="punctuation">}</span>
117117

118+
<span class="keyword">fn</span> <span class="function declaration">foobar</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="operator">-&gt;</span> <span class="keyword">impl</span> <span class="unresolved_reference">Copy</span> <span class="punctuation">{</span><span class="punctuation">}</span>
119+
120+
<span class="keyword">fn</span> <span class="function declaration">foo</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span>
121+
<span class="keyword">let</span> <span class="variable declaration">bar</span> <span class="operator">=</span> <span class="function">foobar</span><span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">;</span>
122+
<span class="punctuation">}</span>
123+
118124
<span class="macro">macro_rules!</span> <span class="macro declaration">def_fn</span> <span class="punctuation">{</span>
119125
<span class="punctuation">(</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>tt<span class="punctuation">:</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">)</span> <span class="operator">=</span><span class="punctuation">&gt;</span> <span class="punctuation">{</span><span class="punctuation">$</span><span class="punctuation">(</span><span class="punctuation">$</span>tt<span class="punctuation">)</span><span class="punctuation">*</span><span class="punctuation">}</span>
120126
<span class="punctuation">}</span>

crates/ide/src/syntax_highlighting/tests.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ fn baz<F: Fn() -> ()>(f: F) {
8989
f()
9090
}
9191
92+
fn foobar() -> impl Copy {}
93+
94+
fn foo() {
95+
let bar = foobar();
96+
}
97+
9298
macro_rules! def_fn {
9399
($($tt:tt)*) => {$($tt)*}
94100
}

0 commit comments

Comments
 (0)