@@ -9,21 +9,55 @@ pub(super) fn binary_op_return_ty(op: BinaryOp, lhs_ty: Ty, rhs_ty: Ty) -> Ty {
99 BinaryOp :: LogicOp ( _) | BinaryOp :: CmpOp ( _) => TyKind :: Scalar ( Scalar :: Bool ) . intern ( & Interner ) ,
1010 BinaryOp :: Assignment { .. } => TyBuilder :: unit ( ) ,
1111 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 ) ,
1315 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 )
1927 }
2028 }
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,
2761 _ => TyKind :: Error . intern ( & Interner ) ,
2862 } ,
2963 }
0 commit comments