Skip to content

Commit

Permalink
Add tests of bailout involving ranges and dots, and fix for question
Browse files Browse the repository at this point in the history
  • Loading branch information
dtolnay committed Dec 30, 2024
1 parent ed4d144 commit 6b88946
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1673,7 +1673,12 @@ pub(crate) mod parsing {
bracket_token: bracketed!(content in input),
index: content.parse()?,
});
} else if input.peek(Token![?]) {
} else if input.peek(Token![?])
&& match e {
Expr::Range(_) => false,
_ => true,
}
{
e = Expr::Try(ExprTry {
attrs: Vec::new(),
expr: Box::new(e),
Expand Down Expand Up @@ -2867,6 +2872,7 @@ pub(crate) mod parsing {
|| input.peek(Token![,])
|| input.peek(Token![;])
|| input.peek(Token![.]) && !input.peek(Token![..])
|| input.peek(Token![?])
|| input.peek(Token![=>])
|| !allow_struct.0 && input.peek(token::Brace))
{
Expand Down
71 changes: 71 additions & 0 deletions tests/test_expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,77 @@ fn test_range_precedence() {
syn::parse_str::<Expr>("x .. x ..").unwrap_err();
}

#[test]
fn test_ranges_dots_bailout() {
syn::parse_str::<Expr>(".. ?").unwrap_err();
syn::parse_str::<Expr>(".. .field").unwrap_err();

snapshot!("return .. ?" as Expr, @r"
Expr::Try {
expr: Expr::Return {
expr: Some(Expr::Range {
limits: RangeLimits::HalfOpen,
}),
},
}
");

snapshot!("break .. ?" as Expr, @r"
Expr::Try {
expr: Expr::Break {
expr: Some(Expr::Range {
limits: RangeLimits::HalfOpen,
}),
},
}
");

snapshot!("|| .. ?" as Expr, @r"
Expr::Try {
expr: Expr::Closure {
output: ReturnType::Default,
body: Expr::Range {
limits: RangeLimits::HalfOpen,
},
},
}
");

snapshot!("return .. .field" as Expr, @r#"
Expr::Field {
base: Expr::Return {
expr: Some(Expr::Range {
limits: RangeLimits::HalfOpen,
}),
},
member: Member::Named("field"),
}
"#);

snapshot!("break .. .field" as Expr, @r#"
Expr::Field {
base: Expr::Break {
expr: Some(Expr::Range {
limits: RangeLimits::HalfOpen,
}),
},
member: Member::Named("field"),
}
"#);

snapshot!("|| .. .field" as Expr, @r#"
Expr::Field {
base: Expr::Closure {
output: ReturnType::Default,
body: Expr::Range {
limits: RangeLimits::HalfOpen,
},
},
member: Member::Named("field"),
}
"#);
}

#[test]
fn test_ambiguous_label() {
for stmt in [
Expand Down

0 comments on commit 6b88946

Please sign in to comment.