@@ -3903,7 +3903,7 @@ export class Compiler extends DiagnosticEmitter {
3903
3903
if ( classReference ) {
3904
3904
let overload = classReference . lookupOverload ( OperatorKind . LT ) ;
3905
3905
if ( overload ) {
3906
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
3906
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
3907
3907
break ;
3908
3908
}
3909
3909
}
@@ -3938,7 +3938,7 @@ export class Compiler extends DiagnosticEmitter {
3938
3938
if ( classReference ) {
3939
3939
let overload = classReference . lookupOverload ( OperatorKind . GT ) ;
3940
3940
if ( overload ) {
3941
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
3941
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
3942
3942
break ;
3943
3943
}
3944
3944
}
@@ -3973,7 +3973,7 @@ export class Compiler extends DiagnosticEmitter {
3973
3973
if ( classReference ) {
3974
3974
let overload = classReference . lookupOverload ( OperatorKind . LE ) ;
3975
3975
if ( overload ) {
3976
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
3976
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
3977
3977
break ;
3978
3978
}
3979
3979
}
@@ -4008,7 +4008,7 @@ export class Compiler extends DiagnosticEmitter {
4008
4008
if ( classReference ) {
4009
4009
let overload = classReference . lookupOverload ( OperatorKind . GE ) ;
4010
4010
if ( overload ) {
4011
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4011
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4012
4012
break ;
4013
4013
}
4014
4014
}
@@ -4046,7 +4046,7 @@ export class Compiler extends DiagnosticEmitter {
4046
4046
if ( classReference ) {
4047
4047
let overload = classReference . lookupOverload ( OperatorKind . EQ ) ;
4048
4048
if ( overload ) {
4049
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4049
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4050
4050
break ;
4051
4051
}
4052
4052
}
@@ -4085,7 +4085,7 @@ export class Compiler extends DiagnosticEmitter {
4085
4085
if ( classReference ) {
4086
4086
let overload = classReference . lookupOverload ( OperatorKind . NE ) ;
4087
4087
if ( overload ) {
4088
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4088
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4089
4089
break ;
4090
4090
}
4091
4091
}
@@ -4126,7 +4126,7 @@ export class Compiler extends DiagnosticEmitter {
4126
4126
if ( classReference ) {
4127
4127
let overload = classReference . lookupOverload ( OperatorKind . ADD ) ;
4128
4128
if ( overload ) {
4129
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4129
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4130
4130
break ;
4131
4131
}
4132
4132
}
@@ -4170,7 +4170,7 @@ export class Compiler extends DiagnosticEmitter {
4170
4170
if ( classReference ) {
4171
4171
let overload = classReference . lookupOverload ( OperatorKind . SUB ) ;
4172
4172
if ( overload ) {
4173
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4173
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4174
4174
break ;
4175
4175
}
4176
4176
}
@@ -4215,7 +4215,7 @@ export class Compiler extends DiagnosticEmitter {
4215
4215
if ( classReference ) {
4216
4216
let overload = classReference . lookupOverload ( OperatorKind . MUL ) ;
4217
4217
if ( overload ) {
4218
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4218
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4219
4219
break ;
4220
4220
}
4221
4221
}
@@ -4260,7 +4260,7 @@ export class Compiler extends DiagnosticEmitter {
4260
4260
if ( classReference ) {
4261
4261
let overload = classReference . lookupOverload ( OperatorKind . POW ) ;
4262
4262
if ( overload ) {
4263
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4263
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4264
4264
break ;
4265
4265
}
4266
4266
}
@@ -4305,7 +4305,7 @@ export class Compiler extends DiagnosticEmitter {
4305
4305
if ( classReference ) {
4306
4306
let overload = classReference . lookupOverload ( OperatorKind . DIV ) ;
4307
4307
if ( overload ) {
4308
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4308
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4309
4309
break ;
4310
4310
}
4311
4311
}
@@ -4350,7 +4350,7 @@ export class Compiler extends DiagnosticEmitter {
4350
4350
if ( classReference ) {
4351
4351
let overload = classReference . lookupOverload ( OperatorKind . REM ) ;
4352
4352
if ( overload ) {
4353
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4353
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4354
4354
break ;
4355
4355
}
4356
4356
}
@@ -4395,7 +4395,7 @@ export class Compiler extends DiagnosticEmitter {
4395
4395
if ( classReference ) {
4396
4396
let overload = classReference . lookupOverload ( OperatorKind . BITWISE_SHL ) ;
4397
4397
if ( overload ) {
4398
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4398
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4399
4399
break ;
4400
4400
}
4401
4401
}
@@ -4422,7 +4422,7 @@ export class Compiler extends DiagnosticEmitter {
4422
4422
if ( classReference ) {
4423
4423
let overload = classReference . lookupOverload ( OperatorKind . BITWISE_SHR ) ;
4424
4424
if ( overload ) {
4425
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4425
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4426
4426
break ;
4427
4427
}
4428
4428
}
@@ -4450,7 +4450,7 @@ export class Compiler extends DiagnosticEmitter {
4450
4450
if ( classReference ) {
4451
4451
let overload = classReference . lookupOverload ( OperatorKind . BITWISE_SHR_U ) ;
4452
4452
if ( overload ) {
4453
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4453
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4454
4454
break ;
4455
4455
}
4456
4456
}
@@ -4477,7 +4477,7 @@ export class Compiler extends DiagnosticEmitter {
4477
4477
if ( classReference ) {
4478
4478
let overload = classReference . lookupOverload ( OperatorKind . BITWISE_AND ) ;
4479
4479
if ( overload ) {
4480
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4480
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4481
4481
break ;
4482
4482
}
4483
4483
}
@@ -4522,7 +4522,7 @@ export class Compiler extends DiagnosticEmitter {
4522
4522
if ( classReference ) {
4523
4523
let overload = classReference . lookupOverload ( OperatorKind . BITWISE_OR ) ;
4524
4524
if ( overload ) {
4525
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4525
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4526
4526
break ;
4527
4527
}
4528
4528
}
@@ -4567,7 +4567,7 @@ export class Compiler extends DiagnosticEmitter {
4567
4567
if ( classReference ) {
4568
4568
let overload = classReference . lookupOverload ( OperatorKind . BITWISE_XOR ) ;
4569
4569
if ( overload ) {
4570
- expr = this . compileBinaryOverload ( overload , left , leftExpr , right , expression ) ;
4570
+ expr = this . compileBinaryOverload ( overload , left , leftExpr , leftType , right , expression ) ;
4571
4571
break ;
4572
4572
}
4573
4573
}
@@ -5808,24 +5808,19 @@ export class Compiler extends DiagnosticEmitter {
5808
5808
operatorInstance : Function ,
5809
5809
left : Expression ,
5810
5810
leftExpr : ExpressionRef ,
5811
+ leftType : Type ,
5811
5812
right : Expression ,
5812
5813
reportNode : Node
5813
5814
) : ExpressionRef {
5814
5815
var rightType : Type ;
5815
5816
if ( operatorInstance . is ( CommonFlags . INSTANCE ) ) {
5817
+ assert ( leftType . isStrictlyAssignableTo ( operatorInstance . signature . parameterTypes [ 0 ] ) ) ;
5816
5818
let classInstance = assert ( operatorInstance . parent ) ; assert ( classInstance . kind == ElementKind . CLASS ) ;
5817
5819
rightType = operatorInstance . signature . parameterTypes [ 0 ] ;
5818
5820
} else {
5819
- // FIXME: if LHS type differs we can't recompile left because that'd completely confuse
5820
- // local states, like having local flags that actually do not even exist, possibly
5821
- // releasing something random in that local before and evil things like that. Hence this
5822
- // assumes that LHS type matches, which in turn means that static overloads must be
5823
- // guaranteed to never mismatch LHS type, which in turn means that we can't have shiny
5824
- // things like multiple static overloads for different combinations of LHS/RHS types.
5825
- // We might want that at some point of course, but requires to complete the resolver so
5826
- // it can actually resolve every kind of expression without ever having to recompile.
5827
5821
rightType = operatorInstance . signature . parameterTypes [ 1 ] ;
5828
5822
}
5823
+ leftExpr = this . convertExpression ( leftExpr , leftType , operatorInstance . signature . parameterTypes [ 0 ] , false , left ) ;
5829
5824
var rightExpr = this . compileExpression ( right , rightType , Constraints . CONV_IMPLICIT ) ;
5830
5825
return this . makeCallDirect ( operatorInstance , [ leftExpr , rightExpr ] , reportNode ) ;
5831
5826
}
0 commit comments