@@ -10,6 +10,7 @@ private import SideEffects
1010private import TranslatedElement
1111private import TranslatedExpr
1212private import TranslatedFunction
13+ private import TranslatedInitialization
1314private import DefaultOptions as DefaultOptions
1415
1516/**
@@ -429,6 +430,9 @@ class TranslatedCallSideEffects extends TranslatedSideEffects, TTranslatedCallSi
429430 or
430431 expr instanceof DeleteOrDeleteArrayExpr and
431432 result = getTranslatedDeleteOrDeleteArray ( expr ) .getInstruction ( CallTag ( ) )
433+ or
434+ expr instanceof ConstructorDefaultFieldInit and
435+ result = getTranslatedConstructorFieldInitialization ( expr ) .getInstruction ( CallTag ( ) )
432436 }
433437}
434438
@@ -504,11 +508,25 @@ abstract class TranslatedSideEffect extends TranslatedElement {
504508 abstract predicate sideEffectInstruction ( Opcode opcode , CppType type ) ;
505509}
506510
511+ private class CallOrDefaultFieldInit extends Expr {
512+ CallOrDefaultFieldInit ( ) {
513+ this instanceof Call
514+ or
515+ this instanceof ConstructorDefaultFieldInit
516+ }
517+
518+ Declaration getTarget ( ) {
519+ result = this .( Call ) .getTarget ( )
520+ or
521+ result = this .( ConstructorDefaultFieldInit ) .getTarget ( )
522+ }
523+ }
524+
507525/**
508526 * The IR translation of a single argument side effect for a call.
509527 */
510528abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect {
511- Call call ;
529+ CallOrDefaultFieldInit callOrInit ;
512530 int index ;
513531 SideEffectOpcode sideEffectOpcode ;
514532
@@ -524,7 +542,7 @@ abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect {
524542 result = "(read side effect for " + this .getArgString ( ) + ")"
525543 }
526544
527- override Call getPrimaryExpr ( ) { result = call }
545+ override Expr getPrimaryExpr ( ) { result = callOrInit }
528546
529547 override predicate sortOrder ( int group , int indexInGroup ) {
530548 indexInGroup = index and
@@ -586,9 +604,10 @@ abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect {
586604 tag instanceof OnlyInstructionTag and
587605 operandTag instanceof BufferSizeOperandTag and
588606 result =
589- getTranslatedExpr ( call .getArgument ( call .getTarget ( )
590- .( SideEffectFunction )
591- .getParameterSizeIndex ( index ) ) .getFullyConverted ( ) ) .getResult ( )
607+ getTranslatedExpr ( callOrInit
608+ .( Call )
609+ .getArgument ( callOrInit .getTarget ( ) .( SideEffectFunction ) .getParameterSizeIndex ( index ) )
610+ .getFullyConverted ( ) ) .getResult ( )
592611 }
593612
594613 /** Holds if this side effect is a write side effect, rather than a read side effect. */
@@ -616,7 +635,7 @@ class TranslatedArgumentExprSideEffect extends TranslatedArgumentSideEffect,
616635 Expr arg ;
617636
618637 TranslatedArgumentExprSideEffect ( ) {
619- this = TTranslatedArgumentExprSideEffect ( call , arg , index , sideEffectOpcode )
638+ this = TTranslatedArgumentExprSideEffect ( callOrInit , arg , index , sideEffectOpcode )
620639 }
621640
622641 final override Locatable getAst ( ) { result = arg }
@@ -640,28 +659,31 @@ class TranslatedArgumentExprSideEffect extends TranslatedArgumentSideEffect,
640659 * The IR translation of an argument side effect for `*this` on a call, where there is no `Expr`
641660 * object that represents the `this` argument.
642661 *
643- * The applies only to constructor calls, as the AST has exploit qualifier `Expr`s for all other
644- * calls to non-static member functions.
662+ * The applies to constructor calls and default field initializations , as the AST has explicit
663+ * qualifier `Expr`s for all other calls to non-static member functions.
645664 */
646- class TranslatedStructorQualifierSideEffect extends TranslatedArgumentSideEffect ,
647- TTranslatedStructorQualifierSideEffect
665+ class TranslatedImplicitThisQualifierSideEffect extends TranslatedArgumentSideEffect ,
666+ TTranslatedImplicitThisQualifierSideEffect
648667{
649- TranslatedStructorQualifierSideEffect ( ) {
650- this = TTranslatedStructorQualifierSideEffect ( call , sideEffectOpcode ) and
668+ TranslatedImplicitThisQualifierSideEffect ( ) {
669+ this = TTranslatedImplicitThisQualifierSideEffect ( callOrInit , sideEffectOpcode ) and
651670 index = - 1
652671 }
653672
654- final override Locatable getAst ( ) { result = call }
673+ final override Locatable getAst ( ) { result = callOrInit }
655674
656- final override Type getIndirectionType ( ) { result = call .getTarget ( ) .getDeclaringType ( ) }
675+ final override Type getIndirectionType ( ) { result = callOrInit .getTarget ( ) .getDeclaringType ( ) }
657676
658677 final override string getArgString ( ) { result = "this" }
659678
660679 final override Instruction getArgInstruction ( ) {
661680 exists ( TranslatedStructorCall structorCall |
662- structorCall .getExpr ( ) = call and
681+ structorCall .getExpr ( ) = callOrInit and
663682 result = structorCall .getQualifierResult ( )
664683 )
684+ or
685+ callOrInit instanceof ConstructorDefaultFieldInit and
686+ result = getTranslatedFunction ( callOrInit .getEnclosingFunction ( ) ) .getLoadThisInstruction ( )
665687 }
666688}
667689
0 commit comments