|
4 | 4 | and mypyc.irbuild.builder.
|
5 | 5 | """
|
6 | 6 |
|
7 |
| -from typing import List, Optional, Union |
| 7 | +from typing import List, Optional, Union, cast |
8 | 8 |
|
9 | 9 | from mypy.nodes import (
|
10 | 10 | Expression, NameExpr, MemberExpr, SuperExpr, CallExpr, UnaryExpr, OpExpr, IndexExpr,
|
|
13 | 13 | SetComprehension, DictionaryComprehension, SliceExpr, GeneratorExpr, CastExpr, StarExpr,
|
14 | 14 | Var, RefExpr, MypyFile, TypeInfo, TypeApplication, LDEF, ARG_POS
|
15 | 15 | )
|
16 |
| -from mypy.types import TupleType, get_proper_type |
| 16 | +from mypy.types import TupleType, get_proper_type, Instance |
17 | 17 |
|
18 | 18 | from mypyc.ir.ops import (
|
19 | 19 | Value, TupleGet, TupleSet, PrimitiveOp, BasicBlock, OpDescription, Assign
|
20 | 20 | )
|
21 |
| -from mypyc.ir.rtypes import RTuple, object_rprimitive, is_none_rprimitive |
| 21 | +from mypyc.ir.rtypes import RTuple, object_rprimitive, is_none_rprimitive, \ |
| 22 | + bool_rprimitive |
22 | 23 | from mypyc.ir.func_ir import FUNC_CLASSMETHOD, FUNC_STATICMETHOD
|
23 | 24 | from mypyc.primitives.registry import name_ref_ops
|
24 | 25 | from mypyc.primitives.generic_ops import iter_op
|
@@ -368,10 +369,19 @@ def transform_comparison_expr(builder: IRBuilder, e: ComparisonExpr) -> Value:
|
368 | 369 | bin_op = 'and'
|
369 | 370 | cmp_op = '!='
|
370 | 371 | lhs = e.operands[0]
|
371 |
| - exprs = (ComparisonExpr([cmp_op], [lhs, item]) for item in items) |
372 |
| - or_expr = next(exprs) # type: Expression |
| 372 | + mypy_file = builder.graph['builtins'].tree |
| 373 | + assert mypy_file is not None |
| 374 | + bool_type = Instance(cast(TypeInfo, mypy_file.names['bool'].node), []) |
| 375 | + exprs = [] |
| 376 | + for item in items: |
| 377 | + expr = ComparisonExpr([cmp_op], [lhs, item]) |
| 378 | + builder.types[expr] = bool_type |
| 379 | + exprs.append(expr) |
| 380 | + |
| 381 | + or_expr = exprs.pop(0) # type: Expression |
373 | 382 | for expr in exprs:
|
374 | 383 | or_expr = OpExpr(bin_op, or_expr, expr)
|
| 384 | + builder.types[or_expr] = bool_type |
375 | 385 | return builder.accept(or_expr)
|
376 | 386 | # x in [y]/(y) -> x == y
|
377 | 387 | # x not in [y]/(y) -> x != y
|
|
0 commit comments