@@ -192,8 +192,8 @@ class EssentialEqualityOperationExpr extends EssentialExpr, EqualityOperation {
192
192
override Type getEssentialType ( ) { result instanceof BoolType }
193
193
}
194
194
195
- class EssentialBinaryBitwiseOperationExpr extends EssentialExpr , BinaryBitwiseOperation {
196
- EssentialBinaryBitwiseOperationExpr ( ) {
195
+ class EssentialShiftOperationExpr extends EssentialExpr , BinaryBitwiseOperation {
196
+ EssentialShiftOperationExpr ( ) {
197
197
this instanceof LShiftExpr or
198
198
this instanceof RShiftExpr
199
199
}
@@ -353,6 +353,51 @@ class EssentialBinaryArithmeticExpr extends EssentialExpr, BinaryArithmeticOpera
353
353
}
354
354
}
355
355
356
+ class EssentialBinaryBitwiseExpr extends EssentialExpr , BinaryBitwiseOperation {
357
+ EssentialBinaryBitwiseExpr ( ) {
358
+ not this instanceof LShiftExpr and
359
+ not this instanceof RShiftExpr
360
+ }
361
+
362
+ override Type getEssentialType ( ) {
363
+ exists (
364
+ Type leftEssentialType , Type rightEssentialType ,
365
+ EssentialTypeCategory leftEssentialTypeCategory ,
366
+ EssentialTypeCategory rightEssentialTypeCategory
367
+ |
368
+ leftEssentialType = getEssentialType ( getLeftOperand ( ) ) and
369
+ rightEssentialType = getEssentialType ( getRightOperand ( ) ) and
370
+ leftEssentialTypeCategory = getEssentialTypeCategory ( leftEssentialType ) and
371
+ rightEssentialTypeCategory = getEssentialTypeCategory ( rightEssentialType )
372
+ |
373
+ if
374
+ leftEssentialTypeCategory = EssentiallySignedType ( ) and
375
+ rightEssentialTypeCategory = EssentiallySignedType ( )
376
+ then
377
+ if exists ( getValue ( ) )
378
+ then result = stlr ( this )
379
+ else (
380
+ if leftEssentialType .getSize ( ) > rightEssentialType .getSize ( )
381
+ then result = leftEssentialType
382
+ else result = rightEssentialType
383
+ )
384
+ else
385
+ if
386
+ leftEssentialTypeCategory = EssentiallyUnsignedType ( ) and
387
+ rightEssentialTypeCategory = EssentiallyUnsignedType ( )
388
+ then
389
+ if exists ( getValue ( ) )
390
+ then result = utlr ( this )
391
+ else (
392
+ if leftEssentialType .getSize ( ) > rightEssentialType .getSize ( )
393
+ then result = leftEssentialType
394
+ else result = rightEssentialType
395
+ )
396
+ else result = this .getStandardType ( )
397
+ )
398
+ }
399
+ }
400
+
356
401
/**
357
402
* A named Enum type, as per D.5.
358
403
*/
0 commit comments