diff options
| -rw-r--r-- | crates/hir_ty/src/tests/simple.rs | 14 | ||||
| -rw-r--r-- | crates/parser/src/grammar/types.rs | 6 |
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 df7b3df3d5b..baed34ce238 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 ff067f5293d..46db487d02c 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); } |
