Skip to content

Commit 6b6c7c0

Browse files
authored
Merge pull request #22486 from ada4a/22478-spurious-await
fix: don't complete `.await` on receivers of unknown type
2 parents 731198b + 6037856 commit 6b6c7c0

5 files changed

Lines changed: 40 additions & 9 deletions

File tree

crates/hir-ty/src/next_solver/infer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,7 +843,7 @@ impl<'db> InferCtxt<'db> {
843843
GenericArgs::for_item(self.interner, def_id, |_index, kind, _| self.var_for_def(kind, span))
844844
}
845845

846-
/// Like `fresh_args_for_item()`, but first uses the args from `first`.
846+
/// Like [`Self::fresh_args_for_item`], but first uses the args from `first`.
847847
pub fn fill_rest_fresh_args(
848848
&self,
849849
span: Span,

crates/hir-ty/src/traits.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use hir_expand::name::Name;
2020
use intern::sym;
2121
use rustc_type_ir::{
2222
TypeVisitableExt, TypingMode,
23-
inherent::{BoundExistentialPredicates, IntoKind},
23+
inherent::{BoundExistentialPredicates, GenericArg as _, IntoKind, Ty as _},
2424
};
2525

2626
use crate::{
@@ -153,6 +153,9 @@ pub fn implements_trait_unique_with_infcx<'db>(
153153
let infcx = interner.infer_ctxt().build(TypingMode::non_body_analysis());
154154

155155
let args = create_args(&infcx);
156+
if args.iter().filter_map(|it| it.as_type()).any(|ty| ty.is_ty_error()) {
157+
return false;
158+
}
156159
let trait_ref = rustc_type_ir::TraitRef::new_from_args(interner, trait_.into(), args);
157160

158161
let obligation = Obligation::new(interner, ObligationCause::dummy(), env.param_env, trait_ref);

crates/ide-completion/src/render.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2372,7 +2372,7 @@ impl S {
23722372
}
23732373
fn foo(s: S) { s.$0 }
23742374
"#,
2375-
CompletionItemKind::SymbolKind(SymbolKind::Method),
2375+
SymbolKind::Method,
23762376
expect![[r#"
23772377
[
23782378
CompletionItem {

crates/ide-completion/src/tests/expression.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4179,3 +4179,31 @@ fn main() {
41794179
"#]],
41804180
);
41814181
}
4182+
4183+
#[test]
4184+
fn no_await_on_error_type() {
4185+
check(
4186+
r#"
4187+
//- minicore: future
4188+
fn foo(t: T) {
4189+
let _ = t.$0;
4190+
}
4191+
"#,
4192+
expect![[r#"
4193+
sn box Box::new(expr)
4194+
sn call function(expr)
4195+
sn const const {}
4196+
sn dbg dbg!(expr)
4197+
sn dbgr dbg!(&expr)
4198+
sn deref *expr
4199+
sn if if expr {}
4200+
sn match match expr {}
4201+
sn not !expr
4202+
sn ref &expr
4203+
sn refm &mut expr
4204+
sn return return expr
4205+
sn unsafe unsafe {}
4206+
sn while while expr {}
4207+
"#]],
4208+
);
4209+
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@
128128
<span class="keyword">let</span> <span class="variable declaration mutable reference">y</span> <span class="operator">=</span> <span class="operator">&</span><span class="keyword">mut</span> <span class="variable mutable">x</span><span class="semicolon">;</span>
129129
<span class="keyword">let</span> <span class="variable declaration reference">z</span> <span class="operator">=</span> <span class="operator">&</span><span class="variable mutable reference">y</span><span class="semicolon">;</span>
130130

131-
<span class="keyword">let</span> <span class="struct">Foo</span> <span class="brace">{</span> <span class="field">x</span><span class="colon">:</span> <span class="variable declaration">z</span><span class="comma">,</span> <span class="variable callable declaration">y</span> <span class="brace">}</span> <span class="operator">=</span> <span class="struct">Foo</span> <span class="brace">{</span> <span class="field">x</span><span class="colon">:</span> <span class="variable reference">z</span><span class="comma">,</span> <span class="variable mutable reference">y</span> <span class="brace">}</span><span class="semicolon">;</span>
131+
<span class="keyword">let</span> <span class="struct">Foo</span> <span class="brace">{</span> <span class="field">x</span><span class="colon">:</span> <span class="variable declaration">z</span><span class="comma">,</span> <span class="variable declaration">y</span> <span class="brace">}</span> <span class="operator">=</span> <span class="struct">Foo</span> <span class="brace">{</span> <span class="field">x</span><span class="colon">:</span> <span class="variable reference">z</span><span class="comma">,</span> <span class="variable mutable reference">y</span> <span class="brace">}</span><span class="semicolon">;</span>
132132

133-
<span class="variable callable">y</span><span class="semicolon">;</span>
133+
<span class="variable">y</span><span class="semicolon">;</span>
134134

135135
<span class="keyword">let</span> <span class="keyword">mut</span> <span class="variable declaration mutable">foo</span> <span class="operator">=</span> <span class="struct">Foo</span> <span class="brace">{</span> <span class="field">x</span><span class="comma">,</span> <span class="unresolved_reference">y</span><span class="colon">:</span> <span class="variable mutable">x</span> <span class="brace">}</span><span class="semicolon">;</span>
136136
<span class="keyword">let</span> <span class="variable declaration">foo2</span> <span class="operator">=</span> <span class="struct">Foo</span> <span class="brace">{</span> <span class="field">x</span><span class="comma">,</span> <span class="unresolved_reference">y</span><span class="colon">:</span> <span class="variable mutable">x</span> <span class="brace">}</span><span class="semicolon">;</span>
@@ -143,7 +143,7 @@
143143
<span class="variable mutable">copy</span><span class="operator">.</span><span class="method mutable reference">qux</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
144144
<span class="variable mutable">copy</span><span class="operator">.</span><span class="method">baz</span><span class="parenthesis">(</span><span class="variable mutable">copy</span><span class="parenthesis">)</span><span class="semicolon">;</span>
145145

146-
<span class="keyword">let</span> <span class="variable callable declaration">a</span> <span class="operator">=</span> <span class="punctuation">|</span><span class="value_param callable declaration">x</span><span class="punctuation">|</span> <span class="value_param callable">x</span><span class="semicolon">;</span>
146+
<span class="keyword">let</span> <span class="variable callable declaration">a</span> <span class="operator">=</span> <span class="punctuation">|</span><span class="value_param declaration">x</span><span class="punctuation">|</span> <span class="value_param">x</span><span class="semicolon">;</span>
147147
<span class="keyword">let</span> <span class="variable callable declaration">bar</span> <span class="operator">=</span> <span class="struct">Foo</span><span class="operator">::</span><span class="method associated consuming">baz</span><span class="semicolon">;</span>
148148

149149
<span class="keyword">let</span> <span class="variable declaration">baz</span> <span class="operator">=</span> <span class="parenthesis">(</span><span class="numeric_literal">-</span><span class="numeric_literal">42</span><span class="comma">,</span><span class="parenthesis">)</span><span class="semicolon">;</span>
@@ -173,13 +173,13 @@
173173
<span class="brace">}</span>
174174

175175
<span class="keyword async">async</span> <span class="keyword">fn</span> <span class="function async declaration">learn_and_sing</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
176-
<span class="keyword">let</span> <span class="variable callable declaration">song</span> <span class="operator">=</span> <span class="unresolved_reference">learn_song</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="operator">.</span><span class="keyword async control">await</span><span class="semicolon">;</span>
177-
<span class="unresolved_reference">sing_song</span><span class="parenthesis">(</span><span class="variable callable">song</span><span class="parenthesis">)</span><span class="operator">.</span><span class="keyword async control">await</span><span class="semicolon">;</span>
176+
<span class="keyword">let</span> <span class="variable declaration">song</span> <span class="operator">=</span> <span class="unresolved_reference">learn_song</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="operator">.</span><span class="keyword async control">await</span><span class="semicolon">;</span>
177+
<span class="unresolved_reference">sing_song</span><span class="parenthesis">(</span><span class="variable consuming">song</span><span class="parenthesis">)</span><span class="operator">.</span><span class="keyword async control">await</span><span class="semicolon">;</span>
178178
<span class="brace">}</span>
179179

180180
<span class="keyword async">async</span> <span class="keyword">fn</span> <span class="function async declaration">async_main</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
181181
<span class="keyword">let</span> <span class="variable declaration">f1</span> <span class="operator">=</span> <span class="function async">learn_and_sing</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
182-
<span class="keyword">let</span> <span class="variable callable declaration">f2</span> <span class="operator">=</span> <span class="unresolved_reference">dance</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
182+
<span class="keyword">let</span> <span class="variable declaration">f2</span> <span class="operator">=</span> <span class="unresolved_reference">dance</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
183183
<span class="unresolved_reference">futures</span><span class="operator">::</span><span class="unresolved_reference">join</span><span class="macro_bang">!</span><span class="parenthesis">(</span>f1<span class="comma">,</span> f2<span class="parenthesis">)</span><span class="semicolon">;</span>
184184
<span class="brace">}</span>
185185

0 commit comments

Comments
 (0)