@@ -9,21 +9,55 @@ pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty {
9
9
BinaryOp :: LogicOp ( _) | BinaryOp :: CmpOp ( _) => TyKind :: Scalar ( Scalar :: Bool ) . intern ( & Interner ) ,
10
10
BinaryOp :: Assignment { .. } => TyBuilder :: unit ( ) ,
11
11
BinaryOp :: ArithOp ( ArithOp :: Shl ) | BinaryOp :: ArithOp ( ArithOp :: Shr ) => {
12
- match lhs_ty. kind ( & Interner ) {
12
+ // all integer combinations are valid here
13
+ if matches ! (
14
+ lhs_ty. kind( & Interner ) ,
13
15
TyKind :: Scalar ( Scalar :: Int ( _) )
14
- | TyKind :: Scalar ( Scalar :: Uint ( _) )
15
- | TyKind :: Scalar ( Scalar :: Float ( _) ) => lhs_ty,
16
- TyKind :: InferenceVar ( _, TyVariableKind :: Integer )
17
- | TyKind :: InferenceVar ( _, TyVariableKind :: Float ) => lhs_ty,
18
- _ => TyKind :: Error . intern ( & Interner ) ,
16
+ | TyKind :: Scalar ( Scalar :: Uint ( _) )
17
+ | TyKind :: InferenceVar ( _, TyVariableKind :: Integer )
18
+ ) && matches ! (
19
+ rhs_ty. kind( & Interner ) ,
20
+ TyKind :: Scalar ( Scalar :: Int ( _) )
21
+ | TyKind :: Scalar ( Scalar :: Uint ( _) )
22
+ | TyKind :: InferenceVar ( _, TyVariableKind :: Integer )
23
+ ) {
24
+ lhs_ty
25
+ } else {
26
+ TyKind :: Error . intern ( & Interner )
19
27
}
20
28
}
21
- BinaryOp :: ArithOp ( _) => match rhs_ty. kind ( & Interner ) {
22
- TyKind :: Scalar ( Scalar :: Int ( _) )
23
- | TyKind :: Scalar ( Scalar :: Uint ( _) )
24
- | TyKind :: Scalar ( Scalar :: Float ( _) ) => rhs_ty,
25
- TyKind :: InferenceVar ( _, TyVariableKind :: Integer )
26
- | TyKind :: InferenceVar ( _, TyVariableKind :: Float ) => rhs_ty,
29
+ BinaryOp :: ArithOp ( _) => match ( lhs_ty. kind ( & Interner ) , rhs_ty. kind ( & Interner ) ) {
30
+ // (int, int) | (uint, uint) | (float, float)
31
+ ( TyKind :: Scalar ( Scalar :: Int ( _) ) , TyKind :: Scalar ( Scalar :: Int ( _) ) )
32
+ | ( TyKind :: Scalar ( Scalar :: Uint ( _) ) , TyKind :: Scalar ( Scalar :: Uint ( _) ) )
33
+ | ( TyKind :: Scalar ( Scalar :: Float ( _) ) , TyKind :: Scalar ( Scalar :: Float ( _) ) ) => rhs_ty,
34
+ // ({int}, int) | ({int}, uint)
35
+ ( TyKind :: InferenceVar ( _, TyVariableKind :: Integer ) , TyKind :: Scalar ( Scalar :: Int ( _) ) )
36
+ | ( TyKind :: InferenceVar ( _, TyVariableKind :: Integer ) , TyKind :: Scalar ( Scalar :: Uint ( _) ) ) => {
37
+ rhs_ty
38
+ }
39
+ // (int, {int}) | (uint, {int})
40
+ ( TyKind :: Scalar ( Scalar :: Int ( _) ) , TyKind :: InferenceVar ( _, TyVariableKind :: Integer ) )
41
+ | ( TyKind :: Scalar ( Scalar :: Uint ( _) ) , TyKind :: InferenceVar ( _, TyVariableKind :: Integer ) ) => {
42
+ lhs_ty
43
+ }
44
+ // ({float} | float)
45
+ ( TyKind :: InferenceVar ( _, TyVariableKind :: Float ) , TyKind :: Scalar ( Scalar :: Float ( _) ) ) => {
46
+ rhs_ty
47
+ }
48
+ // (float, {float})
49
+ ( TyKind :: Scalar ( Scalar :: Float ( _) ) , TyKind :: InferenceVar ( _, TyVariableKind :: Float ) ) => {
50
+ lhs_ty
51
+ }
52
+ // ({int}, {int}) | ({float}, {float})
53
+ (
54
+ TyKind :: InferenceVar ( _, TyVariableKind :: Integer ) ,
55
+ TyKind :: InferenceVar ( _, TyVariableKind :: Integer ) ,
56
+ )
57
+ | (
58
+ TyKind :: InferenceVar ( _, TyVariableKind :: Float ) ,
59
+ TyKind :: InferenceVar ( _, TyVariableKind :: Float ) ,
60
+ ) => rhs_ty,
27
61
_ => TyKind :: Error . intern ( & Interner ) ,
28
62
} ,
29
63
}
0 commit comments