Change:
I tried this code: I expected to see this happen: no warning Instead, this happened: if I follow the suggestion, then compilation fails: ( takes an optional expression, not wrapping it in parentheses means the block becomes that expression, and the is then missing a block). - `rustc 1.47.0-nightly (2020-07-27 )
The lint is a rustc lint, not a Clippy lint. This issue should probably be moved to the rust-lang/rust repo. can you move this issue, please?
Done, thanks

Discussion:
lhs_needs_parens || (followed_by_block && match inner.kind { <del> ExprKind::Ret(_) | ExprKind::Break(..) => true, </del> <ins> ExprKind::Ret(_) | ExprKind::Break(..) | ExprKind::Yield(..) => true, </ins> _ => parser::contains_exterior_struct_lit(&inner), }) }

<ins> #![feature(generator_trait)] #![feature(generators)] #![deny(unused_braces, unused_parens)] use std::ops::Generator; use std::pin::Pin; fn main() { let mut x = |_| { while let Some(_) = (yield) {} while let Some(_) = {yield} {} // Only warn these cases while let Some(_) = ({yield}) {} //~ ERROR: unnecessary parentheses while let Some(_) = ((yield)) {} //~ ERROR: unnecessary parentheses {{yield}}; //~ ERROR: unnecessary braces {( yield )}; //~ ERROR: unnecessary parentheses // FIXME: Reduce duplicate warnings. // Perhaps we should tweak checks in `BlockRetValue`? while let Some(_) = {(yield)} {} //~^ ERROR: unnecessary braces //~| ERROR: unnecessary parentheses while let Some(_) = {{yield}} {} //~^ ERROR: unnecessary braces //~| ERROR: unnecessary braces // FIXME: It'd be great if we could also warn them. ((yield)); ({ yield }); }; let _ = Pin::new(&mut x).resume(Some(5)); } </ins>

<ins> error: unnecessary parentheses around `let` scrutinee expression --> $DIR/issue-74883-unused-paren-baren-yield.rs:14:29 | LL |         while let Some(_) = ({yield}) {} |                             ^^^^^^^^^ help: remove these parentheses | note: the lint level is defined here --> $DIR/issue-74883-unused-paren-baren-yield.rs:3:24 | LL | #![deny(unused_braces, unused_parens)] |                        ^^^^^^^^^^^^^ error: unnecessary parentheses around `let` scrutinee expression --> $DIR/issue-74883-unused-paren-baren-yield.rs:15:29 | LL |         while let Some(_) = ((yield)) {} |                             ^^^^^^^^^ help: remove these parentheses error: unnecessary braces around block return value --> $DIR/issue-74883-unused-paren-baren-yield.rs:16:10 | LL |         {{yield}}; |          ^^^^^^^ help: remove these braces | note: the lint level is defined here --> $DIR/issue-74883-unused-paren-baren-yield.rs:3:9 | LL | #![deny(unused_braces, unused_parens)] |         ^^^^^^^^^^^^^ error: unnecessary parentheses around block return value --> $DIR/issue-74883-unused-paren-baren-yield.rs:17:10 | LL |         {( yield )}; |          ^^^^^^^^^ help: remove these parentheses error: unnecessary braces around `let` scrutinee expression --> $DIR/issue-74883-unused-paren-baren-yield.rs:21:29 | LL |         while let Some(_) = {(yield)} {} |                             ^^^^^^^^^ help: remove these braces error: unnecessary parentheses around block return value --> $DIR/issue-74883-unused-paren-baren-yield.rs:21:30 | LL |         while let Some(_) = {(yield)} {} |                              ^^^^^^^ help: remove these parentheses error: unnecessary braces around `let` scrutinee expression --> $DIR/issue-74883-unused-paren-baren-yield.rs:24:29 | LL |         while let Some(_) = {{yield}} {} |                             ^^^^^^^^^ help: remove these braces error: unnecessary braces around block return value --> $DIR/issue-74883-unused-paren-baren-yield.rs:24:30 | LL |         while let Some(_) = {{yield}} {} |                              ^^^^^^^ help: remove these braces error: aborting due to 8 previous errors </ins>