@@ -342,28 +342,50 @@ class EssentialBinaryOperationSubjectToUsualConversions extends EssentialExpr, B
342
342
then result = leftEssentialType
343
343
else result = rightEssentialType
344
344
)
345
- else
346
- if
347
- this instanceof AddExpr and
348
- (
349
- leftEssentialTypeCategory = EssentiallyCharacterType ( )
350
- or
351
- rightEssentialTypeCategory = EssentiallyCharacterType ( )
352
- ) and
353
- (
354
- leftEssentialTypeCategory =
355
- [ EssentiallySignedType ( ) , EssentiallyUnsignedType ( ) .( TEssentialTypeCategory ) ]
356
- or
357
- rightEssentialTypeCategory =
358
- [ EssentiallySignedType ( ) , EssentiallyUnsignedType ( ) .( TEssentialTypeCategory ) ]
359
- )
360
- or
361
- this instanceof SubExpr and
362
- leftEssentialTypeCategory = EssentiallyCharacterType ( ) and
363
- rightEssentialTypeCategory =
364
- [ EssentiallySignedType ( ) , EssentiallyUnsignedType ( ) .( TEssentialTypeCategory ) ]
365
- then result instanceof PlainCharType
366
- else result = this .getStandardType ( )
345
+ else result = this .getStandardType ( )
346
+ )
347
+ }
348
+ }
349
+
350
+ /**
351
+ * An add expression, with essential type behaviour as specified by D.7.9.
352
+ */
353
+ class EssentialAddExpr extends EssentialBinaryOperationSubjectToUsualConversions , AddExpr {
354
+ override Type getEssentialType ( ) {
355
+ exists (
356
+ EssentialTypeCategory operandTypeCategory , EssentialTypeCategory otherOperandTypeCategory
357
+ |
358
+ operandTypeCategory = getEssentialTypeCategory ( getEssentialType ( getAnOperand ( ) ) ) and
359
+ otherOperandTypeCategory = getEssentialTypeCategory ( getEssentialType ( getAnOperand ( ) ) )
360
+ |
361
+ if
362
+ operandTypeCategory = EssentiallyCharacterType ( ) and
363
+ otherOperandTypeCategory =
364
+ [ EssentiallySignedType ( ) , EssentiallyUnsignedType ( ) .( TEssentialTypeCategory ) ]
365
+ then result instanceof PlainCharType
366
+ else result = super .getEssentialType ( )
367
+ )
368
+ }
369
+ }
370
+
371
+ /**
372
+ * A sub expression, with essential type behaviour as specified by D.7.9.
373
+ */
374
+ class EssentialSubExpr extends EssentialBinaryOperationSubjectToUsualConversions , SubExpr {
375
+ override Type getEssentialType ( ) {
376
+ exists (
377
+ EssentialTypeCategory leftEssentialTypeCategory ,
378
+ EssentialTypeCategory rightEssentialTypeCategory
379
+ |
380
+ leftEssentialTypeCategory = getEssentialTypeCategory ( getEssentialType ( getLeftOperand ( ) ) ) and
381
+ rightEssentialTypeCategory = getEssentialTypeCategory ( getEssentialType ( getRightOperand ( ) ) )
382
+ |
383
+ if
384
+ leftEssentialTypeCategory = EssentiallyCharacterType ( ) and
385
+ rightEssentialTypeCategory =
386
+ [ EssentiallySignedType ( ) , EssentiallyUnsignedType ( ) .( TEssentialTypeCategory ) ]
387
+ then result instanceof PlainCharType
388
+ else result = super .getEssentialType ( )
367
389
)
368
390
}
369
391
}
0 commit comments