@@ -5309,10 +5309,16 @@ def get_types_from_except_handler(self, typ: Type, n: Expression) -> list[Type]:
53095309
53105310 def visit_for_stmt (self , s : ForStmt ) -> None :
53115311 """Type check a for statement."""
5312+ lvalue_type , b , c = self .check_lvalue (s .index )
5313+ if lvalue_type is not None :
5314+ context : Type | None = self .named_generic_type ("typing.Iterable" , [lvalue_type ])
5315+ else :
5316+ context = None
5317+
53125318 if s .is_async :
5313- iterator_type , item_type = self .analyze_async_iterable_item_type (s .expr )
5319+ iterator_type , item_type = self .analyze_async_iterable_item_type (s .expr , context )
53145320 else :
5315- iterator_type , item_type = self .analyze_iterable_item_type (s .expr )
5321+ iterator_type , item_type = self .analyze_iterable_item_type (s .expr , context )
53165322 s .inferred_item_type = item_type
53175323 s .inferred_iterator_type = iterator_type
53185324
@@ -5324,21 +5330,25 @@ def visit_for_stmt(self, s: ForStmt) -> None:
53245330 ),
53255331 )
53265332
5327- def analyze_async_iterable_item_type (self , expr : Expression ) -> tuple [Type , Type ]:
5333+ def analyze_async_iterable_item_type (
5334+ self , expr : Expression , context : Type | None = None
5335+ ) -> tuple [Type , Type ]:
53285336 """Analyse async iterable expression and return iterator and iterator item types."""
53295337 echk = self .expr_checker
5330- iterable = echk .accept (expr )
5338+ iterable = echk .accept (expr , context )
53315339 iterator = echk .check_method_call_by_name ("__aiter__" , iterable , [], [], expr )[0 ]
53325340 awaitable = echk .check_method_call_by_name ("__anext__" , iterator , [], [], expr )[0 ]
53335341 item_type = echk .check_awaitable_expr (
53345342 awaitable , expr , message_registry .INCOMPATIBLE_TYPES_IN_ASYNC_FOR
53355343 )
53365344 return iterator , item_type
53375345
5338- def analyze_iterable_item_type (self , expr : Expression ) -> tuple [Type , Type ]:
5346+ def analyze_iterable_item_type (
5347+ self , expr : Expression , context : Type | None = None
5348+ ) -> tuple [Type , Type ]:
53395349 """Analyse iterable expression and return iterator and iterator item types."""
53405350 iterator , iterable = self .analyze_iterable_item_type_without_expression (
5341- self .expr_checker .accept (expr ), context = expr
5351+ self .expr_checker .accept (expr , context ), context = expr
53425352 )
53435353 int_type = self .analyze_range_native_int_type (expr )
53445354 if int_type :
0 commit comments