@@ -4282,7 +4282,52 @@ impl MutVisitor for CondChecker<'_> {
42824282 mut_visit:: walk_expr ( self , e) ;
42834283 self . forbid_let_reason = forbid_let_reason;
42844284 }
4285- ExprKind :: Assign ( ref lhs, _, span) => {
4285+ ExprKind :: Assign ( ref lhs, ref rhs, span) => {
4286+ if let ExprKind :: Call ( _, _) = & lhs. kind {
4287+ fn get_path_from_rhs ( e : & Expr ) -> Option < ( u32 , & Path ) > {
4288+ fn inner ( e : & Expr , depth : u32 ) -> Option < ( u32 , & Path ) > {
4289+ match & e. kind {
4290+ ExprKind :: Binary ( _, lhs, _) => inner ( lhs, depth + 1 ) ,
4291+ ExprKind :: Path ( _, path) => Some ( ( depth, path) ) ,
4292+ _ => None ,
4293+ }
4294+ }
4295+
4296+ inner ( e, 0 )
4297+ }
4298+
4299+ if let Some ( ( depth, path) ) = get_path_from_rhs ( rhs) {
4300+ // For cases like if Some(_) = x && let Some(_) = y && let Some(_) = z
4301+ // This return let Some(_) = y expression
4302+ fn find_let_some ( expr : & Expr ) -> Option < & Expr > {
4303+ match & expr. kind {
4304+ ExprKind :: Let ( ..) => Some ( expr) ,
4305+
4306+ ExprKind :: Binary ( op, lhs, rhs) if op. node == BinOpKind :: And => {
4307+ find_let_some ( lhs) . or_else ( || find_let_some ( rhs) )
4308+ }
4309+
4310+ _ => None ,
4311+ }
4312+ }
4313+
4314+ let expr_span = lhs. span . to ( path. span ) ;
4315+
4316+ if let Some ( later_rhs) = find_let_some ( rhs)
4317+ && depth > 0
4318+ {
4319+ let guar = self . parser . dcx ( ) . emit_err ( errors:: LetChainMissingLet {
4320+ span : lhs. span ,
4321+ label_span : expr_span,
4322+ rhs_span : later_rhs. span ,
4323+ sug_span : lhs. span . shrink_to_lo ( ) ,
4324+ } ) ;
4325+
4326+ self . found_incorrect_let_chain = Some ( guar) ;
4327+ }
4328+ }
4329+ }
4330+
42864331 let forbid_let_reason = self . forbid_let_reason ;
42874332 self . forbid_let_reason = Some ( errors:: ForbiddenLetReason :: OtherForbidden ) ;
42884333 let missing_let = self . missing_let ;
0 commit comments