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 <hamidrezakalbasi@protonmail.com>
This commit is contained in:
bors[bot] 2022-04-01 15:33:01 +00:00 committed by GitHub
commit f8a21e4c70
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 0 deletions

View file

@ -2556,6 +2556,20 @@ fn f() {
) )
} }
#[test]
fn infer_missing_type() {
check_types(
r#"
struct S;
fn f() {
let s: = S;
//^ S
}
"#,
);
}
#[test] #[test]
fn infer_type_alias_variant() { fn infer_type_alias_variant() {
check_infer( check_infer(

View file

@ -57,6 +57,12 @@ fn type_with_bounds_cond(p: &mut Parser, allow_bounds: bool) {
pub(super) fn ascription(p: &mut Parser) { pub(super) fn ascription(p: &mut Parser) {
assert!(p.at(T![:])); assert!(p.at(T![:]));
p.bump(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); type_(p);
} }