1
Fork 0

Rollup merge of #70657 - lcnr:unused_delims_try, r=Centril

Allow `try`-blocks in places where an open delim is expected

Closes #70490
Closes #56828

r? @Centril
This commit is contained in:
Dylan DPC 2020-04-14 23:29:50 +02:00 committed by GitHub
commit 15ab586b49
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 89 additions and 21 deletions

View file

@ -384,7 +384,7 @@ trait UnusedDelimLint {
fn is_expr_delims_necessary(inner: &ast::Expr, followed_by_block: bool) -> bool {
followed_by_block
&& match inner.kind {
ast::ExprKind::Ret(_) | ast::ExprKind::Break(..) => true,
ExprKind::Ret(_) | ExprKind::Break(..) => true,
_ => parser::contains_exterior_struct_lit(&inner),
}
}

View file

@ -1846,11 +1846,9 @@ impl<'a> Parser<'a> {
}
fn is_try_block(&self) -> bool {
self.token.is_keyword(kw::Try) &&
self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace)) &&
self.token.uninterpolated_span().rust_2018() &&
// Prevent `while try {} {}`, `if try {} {} else {}`, etc.
!self.restrictions.contains(Restrictions::NO_STRUCT_LITERAL)
self.token.is_keyword(kw::Try)
&& self.look_ahead(1, |t| *t == token::OpenDelim(token::Brace))
&& self.token.uninterpolated_span().rust_2018()
}
/// Parses an `async move? {...}` expression.

View file

@ -1,7 +1,11 @@
// run-pass
// compile-flags: --edition 2018
#![feature(try_blocks)]
fn main() {
match try { false } { _ => {} } //~ ERROR expected expression, found reserved keyword `try`
match try { } {
Err(()) => (),
Ok(()) => (),
}
}

View file

@ -1,10 +0,0 @@
error: expected expression, found reserved keyword `try`
--> $DIR/try-block-in-match.rs:6:11
|
LL | match try { false } { _ => {} }
| ----- ^^^ expected expression
| |
| while parsing this match expression
error: aborting due to previous error

View file

@ -3,5 +3,6 @@
#![feature(try_blocks)]
fn main() {
while try { false } {} //~ ERROR expected expression, found reserved keyword `try`
while try { false } {}
//~^ ERROR the trait bound `bool: std::ops::Try` is not satisfied
}

View file

@ -1,8 +1,11 @@
error: expected expression, found reserved keyword `try`
--> $DIR/try-block-in-while.rs:6:11
error[E0277]: the trait bound `bool: std::ops::Try` is not satisfied
--> $DIR/try-block-in-while.rs:6:15
|
LL | while try { false } {}
| ^^^ expected expression
| ^^^^^^^^^ the trait `std::ops::Try` is not implemented for `bool`
|
= note: required by `std::ops::Try::from_ok`
error: aborting due to previous error
For more information about this error, try `rustc --explain E0277`.

View file

@ -0,0 +1,28 @@
// check-pass
// compile-flags: --edition 2018
#![feature(try_blocks)]
#![warn(unused_parens, unused_braces)]
fn consume<T>(_: Result<T, T>) -> T { todo!() }
fn main() {
consume((try {}));
//~^ WARN unnecessary parentheses
consume({ try {} });
//~^ WARN unnecessary braces
match (try {}) {
//~^ WARN unnecessary parentheses
Ok(()) | Err(()) => (),
}
if let Err(()) = (try {}) {}
//~^ WARN unnecessary parentheses
match (try {}) {
//~^ WARN unnecessary parentheses
Ok(()) | Err(()) => (),
}
}

View file

@ -0,0 +1,44 @@
warning: unnecessary parentheses around function argument
--> $DIR/try-block-unused-delims.rs:10:13
|
LL | consume((try {}));
| ^^^^^^^^ help: remove these parentheses
|
note: the lint level is defined here
--> $DIR/try-block-unused-delims.rs:5:9
|
LL | #![warn(unused_parens, unused_braces)]
| ^^^^^^^^^^^^^
warning: unnecessary braces around function argument
--> $DIR/try-block-unused-delims.rs:13:13
|
LL | consume({ try {} });
| ^^^^^^^^^^ help: remove these braces
|
note: the lint level is defined here
--> $DIR/try-block-unused-delims.rs:5:24
|
LL | #![warn(unused_parens, unused_braces)]
| ^^^^^^^^^^^^^
warning: unnecessary parentheses around `match` scrutinee expression
--> $DIR/try-block-unused-delims.rs:16:11
|
LL | match (try {}) {
| ^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `let` scrutinee expression
--> $DIR/try-block-unused-delims.rs:21:22
|
LL | if let Err(()) = (try {}) {}
| ^^^^^^^^ help: remove these parentheses
warning: unnecessary parentheses around `match` scrutinee expression
--> $DIR/try-block-unused-delims.rs:24:11
|
LL | match (try {}) {
| ^^^^^^^^ help: remove these parentheses
warning: 5 warnings emitted