Unnamed repository; edit this file 'description' to name the repository.
Merge #11870
11870: Recover from missing type annotation r=Veykril a=HKalbasi We were missing the init expression in case of `let x: = 2`, which breaks type inference of that variable (previously x were `{unknown}`, now it is `i32`). Co-authored-by: hkalbasi <[email protected]>
bors[bot] 2022-04-01
parent b337a49 · parent 049f0a6 · commit f8a21e4
-rw-r--r--crates/hir_ty/src/tests/simple.rs14
-rw-r--r--crates/parser/src/grammar/types.rs6
2 files changed, 20 insertions, 0 deletions
diff --git a/crates/hir_ty/src/tests/simple.rs b/crates/hir_ty/src/tests/simple.rs
index df7b3df3d5..baed34ce23 100644
--- a/crates/hir_ty/src/tests/simple.rs
+++ b/crates/hir_ty/src/tests/simple.rs
@@ -2557,6 +2557,20 @@ fn f() {
}
#[test]
+fn infer_missing_type() {
+ check_types(
+ r#"
+struct S;
+
+fn f() {
+ let s: = S;
+ //^ S
+}
+ "#,
+ );
+}
+
+#[test]
fn infer_type_alias_variant() {
check_infer(
r#"
diff --git a/crates/parser/src/grammar/types.rs b/crates/parser/src/grammar/types.rs
index ff067f5293..46db487d02 100644
--- a/crates/parser/src/grammar/types.rs
+++ b/crates/parser/src/grammar/types.rs
@@ -57,6 +57,12 @@ fn type_with_bounds_cond(p: &mut Parser, allow_bounds: bool) {
pub(super) fn ascription(p: &mut Parser) {
assert!(p.at(T![:]));
p.bump(T![:]);
+ if p.at(T![=]) {
+ // recover from `let x: = expr;`, `const X: = expr;` and similars
+ // hopefully no type starts with `=`
+ p.error("missing type");
+ return;
+ }
type_(p);
}