diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 117c92e3fe5..66ad2ae2679 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -767,7 +767,7 @@ newtype TTranslatedElement = expr = initList.getFieldExpr(field, position).getFullyConverted() ) or - exists(ConstructorFieldInit init | + exists(ConstructorDirectFieldInit init | not ignoreExpr(init) and ast = init and field = init.getTarget() and @@ -775,6 +775,14 @@ newtype TTranslatedElement = position = -1 ) } or + // The initialization of a field via a default member initializer. + TTranslatedDefaultFieldInitialization(Expr ast, Field field) { + exists(ConstructorDefaultFieldInit init | + not ignoreExpr(init) and + ast = init and + field = init.getTarget() + ) + } or // The value initialization of a field due to an omitted member of an // initializer list. TTranslatedFieldValueInitialization(Expr ast, Field field) { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll index 581b0886f7f..f5d092ca44a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll @@ -533,10 +533,7 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { result = getEnclosingVariable(ast).(Field) } - final override Instruction getFirstInstruction(EdgeKind kind) { - result = this.getInstruction(this.getFieldAddressTag()) and - kind instanceof GotoEdge - } + final Field getField() { result = field } /** * Gets the zero-based index describing the order in which this field is to be @@ -544,6 +541,20 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { */ final int getOrder() { result = field.getInitializationOrder() } + /** Gets the position in the initializer list, or `-1` if the initialization is implicit. */ + int getPosition() { result = -1 } +} + +/** + * Represents the IR translation of the initialization of a field from an + * element of an initializer list where default initialization is not used. + */ +abstract class TranslatedNonDefaultFieldInitialization extends TranslatedFieldInitialization { + final override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getInstruction(this.getFieldAddressTag()) and + kind instanceof GotoEdge + } + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = this.getFieldAddressTag() and opcode instanceof Opcode::FieldAddress and @@ -561,18 +572,13 @@ abstract class TranslatedFieldInitialization extends TranslatedElement { } final InstructionTag getFieldAddressTag() { result = InitializerFieldAddressTag() } - - final Field getField() { result = field } - - /** Gets the position in the initializer list, or `-1` if the initialization is implicit. */ - int getPosition() { result = -1 } } /** * Represents the IR translation of the initialization of a field from an * explicit element in an initializer list. */ -class TranslatedExplicitFieldInitialization extends TranslatedFieldInitialization, +class TranslatedExplicitFieldInitialization extends TranslatedNonDefaultFieldInitialization, InitializationContext, TTranslatedExplicitFieldInitialization { Expr expr; @@ -612,6 +618,61 @@ class TranslatedExplicitFieldInitialization extends TranslatedFieldInitializatio override int getPosition() { result = position } } +/** + * Represents the IR translation of the initialization of a field from an + * element of an initializer list where default initialization is used. + */ +class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization, + TTranslatedDefaultFieldInitialization +{ + TranslatedDefaultFieldInitialization() { + this = TTranslatedDefaultFieldInitialization(ast, field) + } + + final override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getInstruction(CallTargetTag()) and + kind instanceof GotoEdge + } + + override Instruction getALastInstructionInternal() { result = this.getInstruction(CallTag()) } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + tag = CallTargetTag() and + result = this.getInstruction(CallTag()) + or + tag = CallTag() and + result = this.getParent().getChildSuccessor(this, kind) + } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + tag = CallTargetTag() and + opcode instanceof Opcode::FunctionAddress and + resultType = getFunctionGLValueType() + or + tag = CallTag() and + opcode instanceof Opcode::Call and + resultType = getVoidType() + } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + tag = CallTag() and + ( + operandTag instanceof CallTargetOperandTag and + result = this.getInstruction(CallTargetTag()) + or + operandTag instanceof ThisArgumentOperandTag and + result = getTranslatedFunction(this.getFunction()).getLoadThisInstruction() + ) + } + + override Declaration getInstructionFunction(InstructionTag tag) { + tag = CallTargetTag() and + result = field + } + + override TranslatedElement getChild(int id) { none() } +} + private string getZeroValue(Type type) { if type instanceof FloatingPointType then result = "0.0" else result = "0" } @@ -620,7 +681,7 @@ private string getZeroValue(Type type) { * Represents the IR translation of the initialization of a field without a * corresponding element in the initializer list. */ -class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, +class TranslatedFieldValueInitialization extends TranslatedNonDefaultFieldInitialization, TTranslatedFieldValueInitialization { TranslatedFieldValueInitialization() { this = TTranslatedFieldValueInitialization(ast, field) } @@ -630,7 +691,7 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, } override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { - TranslatedFieldInitialization.super.hasInstruction(opcode, tag, resultType) + TranslatedNonDefaultFieldInitialization.super.hasInstruction(opcode, tag, resultType) or tag = this.getFieldDefaultValueTag() and opcode instanceof Opcode::Constant and @@ -661,7 +722,8 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization, } override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { - result = TranslatedFieldInitialization.super.getInstructionRegisterOperand(tag, operandTag) + result = + TranslatedNonDefaultFieldInitialization.super.getInstructionRegisterOperand(tag, operandTag) or tag = this.getFieldDefaultValueStoreTag() and ( diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 40a424f7f9a..20e254f066e 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -12369,11 +12369,14 @@ ir.cpp: # 1533| m1533_6(glval) = InitializeParameter[#this] : &:r1533_5 # 1533| r1533_7(glval) = Load[#this] : &:r1533_5, m1533_6 # 1533| m1533_8(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1533_7 -# 1533| v1533_9(void) = NoOp : -# 1533| v1533_10(void) = ReturnIndirection[#this] : &:r1533_7, m1533_8 -# 1533| v1533_11(void) = ReturnVoid : -# 1533| v1533_12(void) = AliasedUse : m1533_3 -# 1533| v1533_13(void) = ExitFunction : +# 1533| m1533_9(unknown) = Chi : total:m1533_4, partial:m1533_8 +# 1533| r1533_10(glval) = FunctionAddress[x] : +# 1533| v1533_11(void) = Call[x] : func:r1533_10, this:r1533_7 +# 1533| v1533_12(void) = NoOp : +# 1533| v1533_13(void) = ReturnIndirection[#this] : &:r1533_7, m1533_8 +# 1533| v1533_14(void) = ReturnVoid : +# 1533| v1533_15(void) = AliasedUse : ~m1533_9 +# 1533| v1533_16(void) = ExitFunction : # 1534| int StructuredBindingDataMemberMemberStruct::x # 1534| Block 0 @@ -12395,19 +12398,39 @@ ir.cpp: # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() # 1537| Block 0 -# 1537| v1537_1(void) = EnterFunction : -# 1537| m1537_2(unknown) = AliasedDefinition : -# 1537| m1537_3(unknown) = InitializeNonLocal : -# 1537| m1537_4(unknown) = Chi : total:m1537_2, partial:m1537_3 -# 1537| r1537_5(glval) = VariableAddress[#this] : -# 1537| m1537_6(glval) = InitializeParameter[#this] : &:r1537_5 -# 1537| r1537_7(glval) = Load[#this] : &:r1537_5, m1537_6 -# 1537| m1537_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_7 -# 1537| v1537_9(void) = NoOp : -# 1537| v1537_10(void) = ReturnIndirection[#this] : &:r1537_7, m1537_8 -# 1537| v1537_11(void) = ReturnVoid : -# 1537| v1537_12(void) = AliasedUse : m1537_3 -# 1537| v1537_13(void) = ExitFunction : +# 1537| v1537_1(void) = EnterFunction : +# 1537| m1537_2(unknown) = AliasedDefinition : +# 1537| m1537_3(unknown) = InitializeNonLocal : +# 1537| m1537_4(unknown) = Chi : total:m1537_2, partial:m1537_3 +# 1537| r1537_5(glval) = VariableAddress[#this] : +# 1537| m1537_6(glval) = InitializeParameter[#this] : &:r1537_5 +# 1537| r1537_7(glval) = Load[#this] : &:r1537_5, m1537_6 +# 1537| m1537_8(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_7 +# 1537| m1537_9(unknown) = Chi : total:m1537_4, partial:m1537_8 +# 1537| r1537_10(glval) = FunctionAddress[i] : +# 1537| v1537_11(void) = Call[i] : func:r1537_10, this:r1537_7 +# 1537| r1537_12(glval) = FunctionAddress[d] : +# 1537| v1537_13(void) = Call[d] : func:r1537_12, this:r1537_7 +# 1537| r1537_14(glval) = FunctionAddress[r] : +# 1537| v1537_15(void) = Call[r] : func:r1537_14, this:r1537_7 +# 1537| r1537_16(glval) = FunctionAddress[p] : +# 1537| v1537_17(void) = Call[p] : func:r1537_16, this:r1537_7 +# 1537| r1537_18(glval) = FunctionAddress[xs] : +# 1537| v1537_19(void) = Call[xs] : func:r1537_18, this:r1537_7 +# 1537| r1537_20(glval) = FunctionAddress[r_alt] : +# 1537| v1537_21(void) = Call[r_alt] : func:r1537_20, this:r1537_7 +# 1537| r1537_22(glval) = FieldAddress[m] : r1537_7 +# 1537| r1537_23(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : +# 1537| v1537_24(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_23, this:r1537_22 +# 1537| m1537_25(unknown) = ^CallSideEffect : ~m1537_9 +# 1537| m1537_26(unknown) = Chi : total:m1537_9, partial:m1537_25 +# 1537| m1537_27(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_22 +# 1537| m1537_28(unknown) = Chi : total:m1537_26, partial:m1537_27 +# 1537| v1537_29(void) = NoOp : +# 1537| v1537_30(void) = ReturnIndirection[#this] : &:r1537_7, ~m1537_28 +# 1537| v1537_31(void) = ReturnVoid : +# 1537| v1537_32(void) = AliasedUse : ~m1537_28 +# 1537| v1537_33(void) = ExitFunction : # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) # 1537| Block 0 @@ -12626,15 +12649,16 @@ ir.cpp: # 1550| m1550_4(unknown) = Chi : total:m1550_2, partial:m1550_3 # 1551| r1551_1(glval) = VariableAddress[s] : # 1551| m1551_2(StructuredBindingDataMemberStruct) = Uninitialized[s] : &:r1551_1 -# 1551| r1551_3(glval) = FunctionAddress[StructuredBindingDataMemberStruct] : -# 1551| v1551_4(void) = Call[StructuredBindingDataMemberStruct] : func:r1551_3, this:r1551_1 -# 1551| m1551_5(unknown) = ^CallSideEffect : ~m1550_4 -# 1551| m1551_6(unknown) = Chi : total:m1550_4, partial:m1551_5 -# 1551| m1551_7(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1551_1 -# 1551| m1551_8(StructuredBindingDataMemberStruct) = Chi : total:m1551_2, partial:m1551_7 +# 1551| m1551_3(unknown) = Chi : total:m1550_4, partial:m1551_2 +# 1551| r1551_4(glval) = FunctionAddress[StructuredBindingDataMemberStruct] : +# 1551| v1551_5(void) = Call[StructuredBindingDataMemberStruct] : func:r1551_4, this:r1551_1 +# 1551| m1551_6(unknown) = ^CallSideEffect : ~m1551_3 +# 1551| m1551_7(unknown) = Chi : total:m1551_3, partial:m1551_6 +# 1551| m1551_8(StructuredBindingDataMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1551_1 +# 1551| m1551_9(unknown) = Chi : total:m1551_7, partial:m1551_8 # 1554| r1554_1(glval) = VariableAddress[(unnamed local variable)] : # 1554| r1554_2(glval) = VariableAddress[s] : -# 1554| r1554_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1554_2, m1551_8 +# 1554| r1554_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1554_2, ~m1551_9 # 1554| m1554_4(StructuredBindingDataMemberStruct) = Store[(unnamed local variable)] : &:r1554_1, r1554_3 # 1554| r1554_5(glval) = VariableAddress[i] : # 1554| r1554_6(glval) = VariableAddress[(unnamed local variable)] : @@ -12691,7 +12715,7 @@ ir.cpp: # 1558| r1558_2(glval) = VariableAddress[r] : # 1558| r1558_3(int &) = Load[r] : &:r1558_2, m1554_22 # 1558| m1558_4(int) = Store[?] : &:r1558_3, r1558_1 -# 1558| m1558_5(unknown) = Chi : total:m1551_6, partial:m1558_4 +# 1558| m1558_5(unknown) = Chi : total:m1551_9, partial:m1558_4 # 1559| r1559_1(int) = Constant[6] : # 1559| r1559_2(glval) = VariableAddress[p] : # 1559| r1559_3(int *&) = Load[p] : &:r1559_2, m1554_26 @@ -12716,7 +12740,7 @@ ir.cpp: # 1562| m1562_5(int) = Store[w] : &:r1562_1, r1562_4 # 1566| r1566_1(glval) = VariableAddress[unnamed_local_variable] : # 1566| r1566_2(glval) = VariableAddress[s] : -# 1566| r1566_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1566_2, m1551_8 +# 1566| r1566_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1566_2, ~m1559_7 # 1566| m1566_4(StructuredBindingDataMemberStruct) = Store[unnamed_local_variable] : &:r1566_1, r1566_3 # 1567| r1567_1(glval) = VariableAddress[i] : # 1567| r1567_2(glval) = VariableAddress[unnamed_local_variable] : @@ -12802,11 +12826,18 @@ ir.cpp: # 1590| m1590_6(glval) = InitializeParameter[#this] : &:r1590_5 # 1590| r1590_7(glval) = Load[#this] : &:r1590_5, m1590_6 # 1590| m1590_8(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1590_7 -# 1590| v1590_9(void) = NoOp : -# 1590| v1590_10(void) = ReturnIndirection[#this] : &:r1590_7, m1590_8 -# 1590| v1590_11(void) = ReturnVoid : -# 1590| v1590_12(void) = AliasedUse : m1590_3 -# 1590| v1590_13(void) = ExitFunction : +# 1590| m1590_9(unknown) = Chi : total:m1590_4, partial:m1590_8 +# 1590| r1590_10(glval) = FunctionAddress[i] : +# 1590| v1590_11(void) = Call[i] : func:r1590_10, this:r1590_7 +# 1590| r1590_12(glval) = FunctionAddress[d] : +# 1590| v1590_13(void) = Call[d] : func:r1590_12, this:r1590_7 +# 1590| r1590_14(glval) = FunctionAddress[r] : +# 1590| v1590_15(void) = Call[r] : func:r1590_14, this:r1590_7 +# 1590| v1590_16(void) = NoOp : +# 1590| v1590_17(void) = ReturnIndirection[#this] : &:r1590_7, m1590_8 +# 1590| v1590_18(void) = ReturnVoid : +# 1590| v1590_19(void) = AliasedUse : ~m1590_9 +# 1590| v1590_20(void) = ExitFunction : # 1590| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) # 1590| Block 0 @@ -12986,22 +13017,23 @@ ir.cpp: # 1630| m1630_4(unknown) = Chi : total:m1630_2, partial:m1630_3 # 1631| r1631_1(glval) = VariableAddress[t] : # 1631| m1631_2(StructuredBindingTupleRefGet) = Uninitialized[t] : &:r1631_1 -# 1631| r1631_3(glval) = FunctionAddress[StructuredBindingTupleRefGet] : -# 1631| v1631_4(void) = Call[StructuredBindingTupleRefGet] : func:r1631_3, this:r1631_1 -# 1631| m1631_5(unknown) = ^CallSideEffect : ~m1630_4 -# 1631| m1631_6(unknown) = Chi : total:m1630_4, partial:m1631_5 -# 1631| m1631_7(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1631_1 -# 1631| m1631_8(StructuredBindingTupleRefGet) = Chi : total:m1631_2, partial:m1631_7 +# 1631| m1631_3(unknown) = Chi : total:m1630_4, partial:m1631_2 +# 1631| r1631_4(glval) = FunctionAddress[StructuredBindingTupleRefGet] : +# 1631| v1631_5(void) = Call[StructuredBindingTupleRefGet] : func:r1631_4, this:r1631_1 +# 1631| m1631_6(unknown) = ^CallSideEffect : ~m1631_3 +# 1631| m1631_7(unknown) = Chi : total:m1631_3, partial:m1631_6 +# 1631| m1631_8(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1631_1 +# 1631| m1631_9(unknown) = Chi : total:m1631_7, partial:m1631_8 # 1634| r1634_1(glval) = VariableAddress[(unnamed local variable)] : # 1634| r1634_2(glval) = VariableAddress[t] : -# 1634| r1634_3(StructuredBindingTupleRefGet) = Load[t] : &:r1634_2, m1631_8 +# 1634| r1634_3(StructuredBindingTupleRefGet) = Load[t] : &:r1634_2, ~m1631_9 # 1634| m1634_4(StructuredBindingTupleRefGet) = Store[(unnamed local variable)] : &:r1634_1, r1634_3 # 1634| r1634_5(glval) = VariableAddress[i] : # 1634| r1634_6(glval) = VariableAddress[(unnamed local variable)] : # 1634| r1634_7(glval) = FunctionAddress[get] : # 1634| r1634_8(int &) = Call[get] : func:r1634_7, this:r1634_6 -# 1634| m1634_9(unknown) = ^CallSideEffect : ~m1631_6 -# 1634| m1634_10(unknown) = Chi : total:m1631_6, partial:m1634_9 +# 1634| m1634_9(unknown) = ^CallSideEffect : ~m1631_9 +# 1634| m1634_10(unknown) = Chi : total:m1631_9, partial:m1634_9 # 1634| v1634_11(void) = ^IndirectReadSideEffect[-1] : &:r1634_6, m1634_4 # 1634| m1634_12(StructuredBindingTupleRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1634_6 # 1634| m1634_13(StructuredBindingTupleRefGet) = Chi : total:m1634_4, partial:m1634_12 @@ -13068,7 +13100,7 @@ ir.cpp: # 1640| m1640_5(int) = Store[w] : &:r1640_1, r1640_4 # 1644| r1644_1(glval) = VariableAddress[unnamed_local_variable] : # 1644| r1644_2(glval) = VariableAddress[t] : -# 1644| r1644_3(StructuredBindingTupleRefGet) = Load[t] : &:r1644_2, m1631_8 +# 1644| r1644_3(StructuredBindingTupleRefGet) = Load[t] : &:r1644_2, ~m1638_6 # 1644| m1644_4(StructuredBindingTupleRefGet) = Store[unnamed_local_variable] : &:r1644_1, r1644_3 # 1645| r1645_1(glval) = VariableAddress[i] : # 1645| r1645_2(glval) = VariableAddress[unnamed_local_variable] : @@ -13155,11 +13187,16 @@ ir.cpp: # 1657| m1657_6(glval) = InitializeParameter[#this] : &:r1657_5 # 1657| r1657_7(glval) = Load[#this] : &:r1657_5, m1657_6 # 1657| m1657_8(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1657_7 -# 1657| v1657_9(void) = NoOp : -# 1657| v1657_10(void) = ReturnIndirection[#this] : &:r1657_7, m1657_8 -# 1657| v1657_11(void) = ReturnVoid : -# 1657| v1657_12(void) = AliasedUse : m1657_3 -# 1657| v1657_13(void) = ExitFunction : +# 1657| m1657_9(unknown) = Chi : total:m1657_4, partial:m1657_8 +# 1657| r1657_10(glval) = FunctionAddress[i] : +# 1657| v1657_11(void) = Call[i] : func:r1657_10, this:r1657_7 +# 1657| r1657_12(glval) = FunctionAddress[r] : +# 1657| v1657_13(void) = Call[r] : func:r1657_12, this:r1657_7 +# 1657| v1657_14(void) = NoOp : +# 1657| v1657_15(void) = ReturnIndirection[#this] : &:r1657_7, m1657_8 +# 1657| v1657_16(void) = ReturnVoid : +# 1657| v1657_17(void) = AliasedUse : ~m1657_9 +# 1657| v1657_18(void) = ExitFunction : # 1658| int StructuredBindingTupleNoRefGet::i # 1658| Block 0 @@ -13276,12 +13313,13 @@ ir.cpp: # 1696| m1696_4(unknown) = Chi : total:m1696_2, partial:m1696_3 # 1697| r1697_1(glval) = VariableAddress[t] : # 1697| m1697_2(StructuredBindingTupleNoRefGet) = Uninitialized[t] : &:r1697_1 -# 1697| r1697_3(glval) = FunctionAddress[StructuredBindingTupleNoRefGet] : -# 1697| v1697_4(void) = Call[StructuredBindingTupleNoRefGet] : func:r1697_3, this:r1697_1 -# 1697| m1697_5(unknown) = ^CallSideEffect : ~m1696_4 -# 1697| m1697_6(unknown) = Chi : total:m1696_4, partial:m1697_5 -# 1697| m1697_7(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1697_1 -# 1697| m1697_8(StructuredBindingTupleNoRefGet) = Chi : total:m1697_2, partial:m1697_7 +# 1697| m1697_3(unknown) = Chi : total:m1696_4, partial:m1697_2 +# 1697| r1697_4(glval) = FunctionAddress[StructuredBindingTupleNoRefGet] : +# 1697| v1697_5(void) = Call[StructuredBindingTupleNoRefGet] : func:r1697_4, this:r1697_1 +# 1697| m1697_6(unknown) = ^CallSideEffect : ~m1697_3 +# 1697| m1697_7(unknown) = Chi : total:m1697_3, partial:m1697_6 +# 1697| m1697_8(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1697_1 +# 1697| m1697_9(unknown) = Chi : total:m1697_7, partial:m1697_8 # 1700| r1700_1(glval) = VariableAddress[(unnamed local variable)] : # 1700| r1700_2(glval) = VariableAddress[t] : # 1700| r1700_3(StructuredBindingTupleNoRefGet &) = CopyValue : r1700_2 @@ -13293,11 +13331,11 @@ ir.cpp: # 1700| r1700_9(glval) = CopyValue : r1700_8 # 1700| r1700_10(glval) = FunctionAddress[get] : # 1700| r1700_11(int) = Call[get] : func:r1700_10, this:r1700_9 -# 1700| m1700_12(unknown) = ^CallSideEffect : ~m1697_6 -# 1700| m1700_13(unknown) = Chi : total:m1697_6, partial:m1700_12 -# 1700| v1700_14(void) = ^IndirectReadSideEffect[-1] : &:r1700_9, m1697_8 +# 1700| m1700_12(unknown) = ^CallSideEffect : ~m1697_9 +# 1700| m1700_13(unknown) = Chi : total:m1697_9, partial:m1700_12 +# 1700| v1700_14(void) = ^IndirectReadSideEffect[-1] : &:r1700_9, ~m1700_13 # 1700| m1700_15(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1700_9 -# 1700| m1700_16(StructuredBindingTupleNoRefGet) = Chi : total:m1697_8, partial:m1700_15 +# 1700| m1700_16(unknown) = Chi : total:m1700_13, partial:m1700_15 # 1700| m1700_17(int) = Store[#temp1700:16] : &:r1700_6, r1700_11 # 1700| r1700_18(int &) = CopyValue : r1700_6 # 1700| m1700_19(int &&) = Store[i] : &:r1700_5, r1700_18 @@ -13307,11 +13345,11 @@ ir.cpp: # 1700| r1700_23(glval) = CopyValue : r1700_22 # 1700| r1700_24(glval) = FunctionAddress[get] : # 1700| r1700_25(int &) = Call[get] : func:r1700_24, this:r1700_23 -# 1700| m1700_26(unknown) = ^CallSideEffect : ~m1700_13 -# 1700| m1700_27(unknown) = Chi : total:m1700_13, partial:m1700_26 -# 1700| v1700_28(void) = ^IndirectReadSideEffect[-1] : &:r1700_23, m1700_16 +# 1700| m1700_26(unknown) = ^CallSideEffect : ~m1700_16 +# 1700| m1700_27(unknown) = Chi : total:m1700_16, partial:m1700_26 +# 1700| v1700_28(void) = ^IndirectReadSideEffect[-1] : &:r1700_23, ~m1700_27 # 1700| m1700_29(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1700_23 -# 1700| m1700_30(StructuredBindingTupleNoRefGet) = Chi : total:m1700_16, partial:m1700_29 +# 1700| m1700_30(unknown) = Chi : total:m1700_27, partial:m1700_29 # 1700| r1700_31(glval) = CopyValue : r1700_25 # 1700| r1700_32(int &) = CopyValue : r1700_31 # 1700| m1700_33(int &) = Store[r] : &:r1700_20, r1700_32 @@ -13321,11 +13359,11 @@ ir.cpp: # 1700| r1700_37(glval) = CopyValue : r1700_36 # 1700| r1700_38(glval) = FunctionAddress[get] : # 1700| r1700_39(int &&) = Call[get] : func:r1700_38, this:r1700_37 -# 1700| m1700_40(unknown) = ^CallSideEffect : ~m1700_27 -# 1700| m1700_41(unknown) = Chi : total:m1700_27, partial:m1700_40 -# 1700| v1700_42(void) = ^IndirectReadSideEffect[-1] : &:r1700_37, m1700_30 +# 1700| m1700_40(unknown) = ^CallSideEffect : ~m1700_30 +# 1700| m1700_41(unknown) = Chi : total:m1700_30, partial:m1700_40 +# 1700| v1700_42(void) = ^IndirectReadSideEffect[-1] : &:r1700_37, ~m1700_41 # 1700| m1700_43(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1700_37 -# 1700| m1700_44(StructuredBindingTupleNoRefGet) = Chi : total:m1700_30, partial:m1700_43 +# 1700| m1700_44(unknown) = Chi : total:m1700_41, partial:m1700_43 # 1700| r1700_45(glval) = CopyValue : r1700_39 # 1700| r1700_46(int &) = CopyValue : r1700_45 # 1700| m1700_47(int &&) = Store[rv] : &:r1700_34, r1700_46 @@ -13350,7 +13388,7 @@ ir.cpp: # 1704| r1704_3(int &) = Load[r] : &:r1704_2, m1700_33 # 1704| r1704_4(glval) = CopyValue : r1704_3 # 1704| m1704_5(int) = Store[?] : &:r1704_4, r1704_1 -# 1704| m1704_6(unknown) = Chi : total:m1700_41, partial:m1704_5 +# 1704| m1704_6(unknown) = Chi : total:m1700_44, partial:m1704_5 # 1705| r1705_1(glval) = VariableAddress[rr] : # 1705| r1705_2(glval) = VariableAddress[r] : # 1705| r1705_3(int &) = Load[r] : &:r1705_2, m1700_33 @@ -13375,9 +13413,9 @@ ir.cpp: # 1711| r1711_7(int) = Call[get] : func:r1711_6, this:r1711_5 # 1711| m1711_8(unknown) = ^CallSideEffect : ~m1704_6 # 1711| m1711_9(unknown) = Chi : total:m1704_6, partial:m1711_8 -# 1711| v1711_10(void) = ^IndirectReadSideEffect[-1] : &:r1711_5, m1700_44 +# 1711| v1711_10(void) = ^IndirectReadSideEffect[-1] : &:r1711_5, ~m1711_9 # 1711| m1711_11(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1711_5 -# 1711| m1711_12(StructuredBindingTupleNoRefGet) = Chi : total:m1700_44, partial:m1711_11 +# 1711| m1711_12(unknown) = Chi : total:m1711_9, partial:m1711_11 # 1711| m1711_13(int) = Store[#temp1711:20] : &:r1711_2, r1711_7 # 1711| r1711_14(int &) = CopyValue : r1711_2 # 1711| m1711_15(int &&) = Store[i] : &:r1711_1, r1711_14 @@ -13387,11 +13425,11 @@ ir.cpp: # 1712| r1712_4(glval) = CopyValue : r1712_3 # 1712| r1712_5(glval) = FunctionAddress[get] : # 1712| r1712_6(int &) = Call[get] : func:r1712_5, this:r1712_4 -# 1712| m1712_7(unknown) = ^CallSideEffect : ~m1711_9 -# 1712| m1712_8(unknown) = Chi : total:m1711_9, partial:m1712_7 -# 1712| v1712_9(void) = ^IndirectReadSideEffect[-1] : &:r1712_4, m1711_12 +# 1712| m1712_7(unknown) = ^CallSideEffect : ~m1711_12 +# 1712| m1712_8(unknown) = Chi : total:m1711_12, partial:m1712_7 +# 1712| v1712_9(void) = ^IndirectReadSideEffect[-1] : &:r1712_4, ~m1712_8 # 1712| m1712_10(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1712_4 -# 1712| m1712_11(StructuredBindingTupleNoRefGet) = Chi : total:m1711_12, partial:m1712_10 +# 1712| m1712_11(unknown) = Chi : total:m1712_8, partial:m1712_10 # 1712| r1712_12(glval) = CopyValue : r1712_6 # 1712| r1712_13(int &) = CopyValue : r1712_12 # 1712| m1712_14(int &) = Store[r] : &:r1712_1, r1712_13 @@ -13401,11 +13439,11 @@ ir.cpp: # 1713| r1713_4(glval) = CopyValue : r1713_3 # 1713| r1713_5(glval) = FunctionAddress[get] : # 1713| r1713_6(int &&) = Call[get] : func:r1713_5, this:r1713_4 -# 1713| m1713_7(unknown) = ^CallSideEffect : ~m1712_8 -# 1713| m1713_8(unknown) = Chi : total:m1712_8, partial:m1713_7 -# 1713| v1713_9(void) = ^IndirectReadSideEffect[-1] : &:r1713_4, m1712_11 +# 1713| m1713_7(unknown) = ^CallSideEffect : ~m1712_11 +# 1713| m1713_8(unknown) = Chi : total:m1712_11, partial:m1713_7 +# 1713| v1713_9(void) = ^IndirectReadSideEffect[-1] : &:r1713_4, ~m1713_8 # 1713| m1713_10(StructuredBindingTupleNoRefGet) = ^IndirectMayWriteSideEffect[-1] : &:r1713_4 -# 1713| m1713_11(StructuredBindingTupleNoRefGet) = Chi : total:m1712_11, partial:m1713_10 +# 1713| m1713_11(unknown) = Chi : total:m1713_8, partial:m1713_10 # 1713| r1713_12(glval) = CopyValue : r1713_6 # 1713| r1713_13(int &) = CopyValue : r1713_12 # 1713| m1713_14(int &&) = Store[rv] : &:r1713_1, r1713_13 @@ -13430,7 +13468,7 @@ ir.cpp: # 1717| r1717_3(int &) = Load[r] : &:r1717_2, m1712_14 # 1717| r1717_4(glval) = CopyValue : r1717_3 # 1717| m1717_5(int) = Store[?] : &:r1717_4, r1717_1 -# 1717| m1717_6(unknown) = Chi : total:m1713_8, partial:m1717_5 +# 1717| m1717_6(unknown) = Chi : total:m1713_11, partial:m1717_5 # 1718| r1718_1(glval) = VariableAddress[rr] : # 1718| r1718_2(glval) = VariableAddress[r] : # 1718| r1718_3(int &) = Load[r] : &:r1718_2, m1712_14 @@ -21423,21 +21461,47 @@ ir.cpp: # 2897| void StructInit::StructInit(int) # 2897| Block 0 -# 2897| v2897_1(void) = EnterFunction : -# 2897| m2897_2(unknown) = AliasedDefinition : -# 2897| m2897_3(unknown) = InitializeNonLocal : -# 2897| m2897_4(unknown) = Chi : total:m2897_2, partial:m2897_3 -# 2897| r2897_5(glval) = VariableAddress[#this] : -# 2897| m2897_6(glval) = InitializeParameter[#this] : &:r2897_5 -# 2897| r2897_7(glval) = Load[#this] : &:r2897_5, m2897_6 -# 2897| m2897_8(StructInit) = InitializeIndirection[#this] : &:r2897_7 -# 2897| r2897_9(glval) = VariableAddress[j] : -# 2897| m2897_10(int) = InitializeParameter[j] : &:r2897_9 -# 2897| v2897_11(void) = NoOp : -# 2897| v2897_12(void) = ReturnIndirection[#this] : &:r2897_7, m2897_8 -# 2897| v2897_13(void) = ReturnVoid : -# 2897| v2897_14(void) = AliasedUse : m2897_3 -# 2897| v2897_15(void) = ExitFunction : +# 2897| v2897_1(void) = EnterFunction : +# 2897| m2897_2(unknown) = AliasedDefinition : +# 2897| m2897_3(unknown) = InitializeNonLocal : +# 2897| m2897_4(unknown) = Chi : total:m2897_2, partial:m2897_3 +# 2897| r2897_5(glval) = VariableAddress[#this] : +# 2897| m2897_6(glval) = InitializeParameter[#this] : &:r2897_5 +# 2897| r2897_7(glval) = Load[#this] : &:r2897_5, m2897_6 +# 2897| m2897_8(StructInit) = InitializeIndirection[#this] : &:r2897_7 +# 2897| m2897_9(unknown) = Chi : total:m2897_4, partial:m2897_8 +# 2897| r2897_10(glval) = VariableAddress[j] : +# 2897| m2897_11(int) = InitializeParameter[j] : &:r2897_10 +# 2897| r2897_12(glval) = FunctionAddress[i] : +# 2897| v2897_13(void) = Call[i] : func:r2897_12, this:r2897_7 +# 2897| r2897_14(glval) = FieldAddress[j] : r2897_7 +# 2897| r2897_15(glval) = VariableAddress[j] : +# 2897| r2897_16(int) = Load[j] : &:r2897_15, m2897_11 +# 2897| m2897_17(int) = Store[?] : &:r2897_14, r2897_16 +# 2897| m2897_18(unknown) = Chi : total:m2897_9, partial:m2897_17 +# 2897| r2897_19(glval) = FunctionAddress[k] : +# 2897| v2897_20(void) = Call[k] : func:r2897_19, this:r2897_7 +# 2897| r2897_21(glval) = FunctionAddress[l] : +# 2897| v2897_22(void) = Call[l] : func:r2897_21, this:r2897_7 +# 2897| r2897_23(glval) = FunctionAddress[m] : +# 2897| v2897_24(void) = Call[m] : func:r2897_23, this:r2897_7 +# 2897| r2897_25(glval) = FieldAddress[n] : r2897_7 +# 2897| r2897_26(glval) = VariableAddress[#this] : +# 2897| r2897_27(StructInit *) = Load[#this] : &:r2897_26, m2897_6 +# 2897| r2897_28(glval) = FunctionAddress[get_val] : +# 2897| r2897_29(int) = Call[get_val] : func:r2897_28, this:r2897_27 +# 2897| m2897_30(unknown) = ^CallSideEffect : ~m2897_18 +# 2897| m2897_31(unknown) = Chi : total:m2897_18, partial:m2897_30 +# 2897| v2897_32(void) = ^IndirectReadSideEffect[-1] : &:r2897_27, ~m2897_31 +# 2897| m2897_33(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_27 +# 2897| m2897_34(unknown) = Chi : total:m2897_31, partial:m2897_33 +# 2897| m2897_35(int) = Store[?] : &:r2897_25, r2897_29 +# 2897| m2897_36(unknown) = Chi : total:m2897_34, partial:m2897_35 +# 2897| v2897_37(void) = NoOp : +# 2897| v2897_38(void) = ReturnIndirection[#this] : &:r2897_7, ~m2897_36 +# 2897| v2897_39(void) = ReturnVoid : +# 2897| v2897_40(void) = AliasedUse : ~m2897_36 +# 2897| v2897_41(void) = ExitFunction : # 2899| void StructInit::StructInit() # 2899| Block 0 @@ -21449,15 +21513,28 @@ ir.cpp: # 2899| m2899_6(glval) = InitializeParameter[#this] : &:r2899_5 # 2899| r2899_7(glval) = Load[#this] : &:r2899_5, m2899_6 # 2899| m2899_8(StructInit) = InitializeIndirection[#this] : &:r2899_7 -# 2899| r2899_9(glval) = FieldAddress[i] : r2899_7 -# 2899| r2899_10(int) = Constant[41] : -# 2899| m2899_11(int) = Store[?] : &:r2899_9, r2899_10 -# 2899| m2899_12(unknown) = Chi : total:m2899_8, partial:m2899_11 -# 2899| v2899_13(void) = NoOp : -# 2899| v2899_14(void) = ReturnIndirection[#this] : &:r2899_7, m2899_12 -# 2899| v2899_15(void) = ReturnVoid : -# 2899| v2899_16(void) = AliasedUse : m2899_3 -# 2899| v2899_17(void) = ExitFunction : +# 2899| m2899_9(unknown) = Chi : total:m2899_4, partial:m2899_8 +# 2899| r2899_10(glval) = FieldAddress[i] : r2899_7 +# 2899| r2899_11(int) = Constant[41] : +# 2899| m2899_12(int) = Store[?] : &:r2899_10, r2899_11 +# 2899| m2899_13(unknown) = Chi : total:m2899_9, partial:m2899_12 +# 2899| r2899_14(glval) = FunctionAddress[j] : +# 2899| v2899_15(void) = Call[j] : func:r2899_14, this:r2899_7 +# 2899| r2899_16(glval) = FieldAddress[k] : r2899_7 +# 2899| r2899_17(int) = Constant[41] : +# 2899| m2899_18(int) = Store[?] : &:r2899_16, r2899_17 +# 2899| m2899_19(unknown) = Chi : total:m2899_13, partial:m2899_18 +# 2899| r2899_20(glval) = FunctionAddress[l] : +# 2899| v2899_21(void) = Call[l] : func:r2899_20, this:r2899_7 +# 2899| r2899_22(glval) = FunctionAddress[m] : +# 2899| v2899_23(void) = Call[m] : func:r2899_22, this:r2899_7 +# 2899| r2899_24(glval) = FunctionAddress[n] : +# 2899| v2899_25(void) = Call[n] : func:r2899_24, this:r2899_7 +# 2899| v2899_26(void) = NoOp : +# 2899| v2899_27(void) = ReturnIndirection[#this] : &:r2899_7, ~m2899_19 +# 2899| v2899_28(void) = ReturnVoid : +# 2899| v2899_29(void) = AliasedUse : ~m2899_19 +# 2899| v2899_30(void) = ExitFunction : # 2901| int StructInit::get_val() # 2901| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 230d0805cd2..f1b75895c3e 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -20,10 +20,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:1537:8:1537:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1537:8:1537:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| ir.cpp:2897:5:2897:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2897:5:2897:14 | void StructInit::StructInit(int) | void StructInit::StructInit(int) | -| ir.cpp:2897:5:2897:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2897:5:2897:14 | void StructInit::StructInit(int) | void StructInit::StructInit(int) | -| ir.cpp:2899:5:2899:14 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2899:5:2899:14 | void StructInit::StructInit() | void StructInit::StructInit() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 16649e72d08..acb250ed58b 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -11346,11 +11346,13 @@ ir.cpp: # 1533| mu1533_5(glval) = InitializeParameter[#this] : &:r1533_4 # 1533| r1533_6(glval) = Load[#this] : &:r1533_4, ~m? # 1533| mu1533_7(StructuredBindingDataMemberMemberStruct) = InitializeIndirection[#this] : &:r1533_6 -# 1533| v1533_8(void) = NoOp : -# 1533| v1533_9(void) = ReturnIndirection[#this] : &:r1533_6, ~m? -# 1533| v1533_10(void) = ReturnVoid : -# 1533| v1533_11(void) = AliasedUse : ~m? -# 1533| v1533_12(void) = ExitFunction : +# 1533| r1533_8(glval) = FunctionAddress[x] : +# 1533| v1533_9(void) = Call[x] : func:r1533_8, this:r1533_6 +# 1533| v1533_10(void) = NoOp : +# 1533| v1533_11(void) = ReturnIndirection[#this] : &:r1533_6, ~m? +# 1533| v1533_12(void) = ReturnVoid : +# 1533| v1533_13(void) = AliasedUse : ~m? +# 1533| v1533_14(void) = ExitFunction : # 1534| int StructuredBindingDataMemberMemberStruct::x # 1534| Block 0 @@ -11370,29 +11372,35 @@ ir.cpp: # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() # 1537| Block 0 -# 1537| v1537_1(void) = EnterFunction : -# 1537| mu1537_2(unknown) = AliasedDefinition : -# 1537| mu1537_3(unknown) = InitializeNonLocal : -# 1537| r1537_4(glval) = VariableAddress[#this] : -# 1537| mu1537_5(glval) = InitializeParameter[#this] : &:r1537_4 -# 1537| r1537_6(glval) = Load[#this] : &:r1537_4, ~m? -# 1537| mu1537_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_6 -#-----| Goto -> Block 2 - -# 1537| Block 1 -# 1537| r1537_8(glval) = FieldAddress[m] : r1537_6 -# 1537| r1537_9(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : -# 1537| v1537_10(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_9, this:r1537_8 -# 1537| mu1537_11(unknown) = ^CallSideEffect : ~m? -# 1537| mu1537_12(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_8 -#-----| Goto -> Block 2 - -# 1537| Block 2 -# 1537| v1537_13(void) = NoOp : -# 1537| v1537_14(void) = ReturnIndirection[#this] : &:r1537_6, ~m? -# 1537| v1537_15(void) = ReturnVoid : -# 1537| v1537_16(void) = AliasedUse : ~m? -# 1537| v1537_17(void) = ExitFunction : +# 1537| v1537_1(void) = EnterFunction : +# 1537| mu1537_2(unknown) = AliasedDefinition : +# 1537| mu1537_3(unknown) = InitializeNonLocal : +# 1537| r1537_4(glval) = VariableAddress[#this] : +# 1537| mu1537_5(glval) = InitializeParameter[#this] : &:r1537_4 +# 1537| r1537_6(glval) = Load[#this] : &:r1537_4, ~m? +# 1537| mu1537_7(StructuredBindingDataMemberStruct) = InitializeIndirection[#this] : &:r1537_6 +# 1537| r1537_8(glval) = FunctionAddress[i] : +# 1537| v1537_9(void) = Call[i] : func:r1537_8, this:r1537_6 +# 1537| r1537_10(glval) = FunctionAddress[d] : +# 1537| v1537_11(void) = Call[d] : func:r1537_10, this:r1537_6 +# 1537| r1537_12(glval) = FunctionAddress[r] : +# 1537| v1537_13(void) = Call[r] : func:r1537_12, this:r1537_6 +# 1537| r1537_14(glval) = FunctionAddress[p] : +# 1537| v1537_15(void) = Call[p] : func:r1537_14, this:r1537_6 +# 1537| r1537_16(glval) = FunctionAddress[xs] : +# 1537| v1537_17(void) = Call[xs] : func:r1537_16, this:r1537_6 +# 1537| r1537_18(glval) = FunctionAddress[r_alt] : +# 1537| v1537_19(void) = Call[r_alt] : func:r1537_18, this:r1537_6 +# 1537| r1537_20(glval) = FieldAddress[m] : r1537_6 +# 1537| r1537_21(glval) = FunctionAddress[StructuredBindingDataMemberMemberStruct] : +# 1537| v1537_22(void) = Call[StructuredBindingDataMemberMemberStruct] : func:r1537_21, this:r1537_20 +# 1537| mu1537_23(unknown) = ^CallSideEffect : ~m? +# 1537| mu1537_24(StructuredBindingDataMemberMemberStruct) = ^IndirectMayWriteSideEffect[-1] : &:r1537_20 +# 1537| v1537_25(void) = NoOp : +# 1537| v1537_26(void) = ReturnIndirection[#this] : &:r1537_6, ~m? +# 1537| v1537_27(void) = ReturnVoid : +# 1537| v1537_28(void) = AliasedUse : ~m? +# 1537| v1537_29(void) = ExitFunction : # 1537| void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct const&) # 1537| Block 0 @@ -11752,11 +11760,17 @@ ir.cpp: # 1590| mu1590_5(glval) = InitializeParameter[#this] : &:r1590_4 # 1590| r1590_6(glval) = Load[#this] : &:r1590_4, ~m? # 1590| mu1590_7(StructuredBindingTupleRefGet) = InitializeIndirection[#this] : &:r1590_6 -# 1590| v1590_8(void) = NoOp : -# 1590| v1590_9(void) = ReturnIndirection[#this] : &:r1590_6, ~m? -# 1590| v1590_10(void) = ReturnVoid : -# 1590| v1590_11(void) = AliasedUse : ~m? -# 1590| v1590_12(void) = ExitFunction : +# 1590| r1590_8(glval) = FunctionAddress[i] : +# 1590| v1590_9(void) = Call[i] : func:r1590_8, this:r1590_6 +# 1590| r1590_10(glval) = FunctionAddress[d] : +# 1590| v1590_11(void) = Call[d] : func:r1590_10, this:r1590_6 +# 1590| r1590_12(glval) = FunctionAddress[r] : +# 1590| v1590_13(void) = Call[r] : func:r1590_12, this:r1590_6 +# 1590| v1590_14(void) = NoOp : +# 1590| v1590_15(void) = ReturnIndirection[#this] : &:r1590_6, ~m? +# 1590| v1590_16(void) = ReturnVoid : +# 1590| v1590_17(void) = AliasedUse : ~m? +# 1590| v1590_18(void) = ExitFunction : # 1590| void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet const&) # 1590| Block 0 @@ -12071,11 +12085,15 @@ ir.cpp: # 1657| mu1657_5(glval) = InitializeParameter[#this] : &:r1657_4 # 1657| r1657_6(glval) = Load[#this] : &:r1657_4, ~m? # 1657| mu1657_7(StructuredBindingTupleNoRefGet) = InitializeIndirection[#this] : &:r1657_6 -# 1657| v1657_8(void) = NoOp : -# 1657| v1657_9(void) = ReturnIndirection[#this] : &:r1657_6, ~m? -# 1657| v1657_10(void) = ReturnVoid : -# 1657| v1657_11(void) = AliasedUse : ~m? -# 1657| v1657_12(void) = ExitFunction : +# 1657| r1657_8(glval) = FunctionAddress[i] : +# 1657| v1657_9(void) = Call[i] : func:r1657_8, this:r1657_6 +# 1657| r1657_10(glval) = FunctionAddress[r] : +# 1657| v1657_11(void) = Call[r] : func:r1657_10, this:r1657_6 +# 1657| v1657_12(void) = NoOp : +# 1657| v1657_13(void) = ReturnIndirection[#this] : &:r1657_6, ~m? +# 1657| v1657_14(void) = ReturnVoid : +# 1657| v1657_15(void) = AliasedUse : ~m? +# 1657| v1657_16(void) = ExitFunction : # 1658| int StructuredBindingTupleNoRefGet::i # 1658| Block 0 @@ -19513,42 +19531,41 @@ ir.cpp: # 2897| void StructInit::StructInit(int) # 2897| Block 0 -# 2897| v2897_1(void) = EnterFunction : -# 2897| mu2897_2(unknown) = AliasedDefinition : -# 2897| mu2897_3(unknown) = InitializeNonLocal : -# 2897| r2897_4(glval) = VariableAddress[#this] : -# 2897| mu2897_5(glval) = InitializeParameter[#this] : &:r2897_4 -# 2897| r2897_6(glval) = Load[#this] : &:r2897_4, ~m? -# 2897| mu2897_7(StructInit) = InitializeIndirection[#this] : &:r2897_6 -# 2897| r2897_8(glval) = VariableAddress[j] : -# 2897| mu2897_9(int) = InitializeParameter[j] : &:r2897_8 -#-----| Goto -> Block 3 - -# 2897| Block 1 -# 2897| r2897_10(glval) = FieldAddress[j] : r2897_6 -# 2897| r2897_11(glval) = VariableAddress[j] : -# 2897| r2897_12(int) = Load[j] : &:r2897_11, ~m? -# 2897| mu2897_13(int) = Store[?] : &:r2897_10, r2897_12 -#-----| Goto -> Block 3 - -# 2897| Block 2 -# 2897| r2897_14(glval) = FieldAddress[n] : r2897_6 -# 2897| r2897_15(glval) = VariableAddress[#this] : -# 2897| r2897_16(StructInit *) = Load[#this] : &:r2897_15, ~m? -# 2897| r2897_17(glval) = FunctionAddress[get_val] : -# 2897| r2897_18(int) = Call[get_val] : func:r2897_17, this:r2897_16 -# 2897| mu2897_19(unknown) = ^CallSideEffect : ~m? -# 2897| v2897_20(void) = ^IndirectReadSideEffect[-1] : &:r2897_16, ~m? -# 2897| mu2897_21(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_16 -# 2897| mu2897_22(int) = Store[?] : &:r2897_14, r2897_18 -#-----| Goto -> Block 3 - -# 2897| Block 3 -# 2897| v2897_23(void) = NoOp : -# 2897| v2897_24(void) = ReturnIndirection[#this] : &:r2897_6, ~m? -# 2897| v2897_25(void) = ReturnVoid : -# 2897| v2897_26(void) = AliasedUse : ~m? -# 2897| v2897_27(void) = ExitFunction : +# 2897| v2897_1(void) = EnterFunction : +# 2897| mu2897_2(unknown) = AliasedDefinition : +# 2897| mu2897_3(unknown) = InitializeNonLocal : +# 2897| r2897_4(glval) = VariableAddress[#this] : +# 2897| mu2897_5(glval) = InitializeParameter[#this] : &:r2897_4 +# 2897| r2897_6(glval) = Load[#this] : &:r2897_4, ~m? +# 2897| mu2897_7(StructInit) = InitializeIndirection[#this] : &:r2897_6 +# 2897| r2897_8(glval) = VariableAddress[j] : +# 2897| mu2897_9(int) = InitializeParameter[j] : &:r2897_8 +# 2897| r2897_10(glval) = FunctionAddress[i] : +# 2897| v2897_11(void) = Call[i] : func:r2897_10, this:r2897_6 +# 2897| r2897_12(glval) = FieldAddress[j] : r2897_6 +# 2897| r2897_13(glval) = VariableAddress[j] : +# 2897| r2897_14(int) = Load[j] : &:r2897_13, ~m? +# 2897| mu2897_15(int) = Store[?] : &:r2897_12, r2897_14 +# 2897| r2897_16(glval) = FunctionAddress[k] : +# 2897| v2897_17(void) = Call[k] : func:r2897_16, this:r2897_6 +# 2897| r2897_18(glval) = FunctionAddress[l] : +# 2897| v2897_19(void) = Call[l] : func:r2897_18, this:r2897_6 +# 2897| r2897_20(glval) = FunctionAddress[m] : +# 2897| v2897_21(void) = Call[m] : func:r2897_20, this:r2897_6 +# 2897| r2897_22(glval) = FieldAddress[n] : r2897_6 +# 2897| r2897_23(glval) = VariableAddress[#this] : +# 2897| r2897_24(StructInit *) = Load[#this] : &:r2897_23, ~m? +# 2897| r2897_25(glval) = FunctionAddress[get_val] : +# 2897| r2897_26(int) = Call[get_val] : func:r2897_25, this:r2897_24 +# 2897| mu2897_27(unknown) = ^CallSideEffect : ~m? +# 2897| v2897_28(void) = ^IndirectReadSideEffect[-1] : &:r2897_24, ~m? +# 2897| mu2897_29(StructInit) = ^IndirectMayWriteSideEffect[-1] : &:r2897_24 +# 2897| mu2897_30(int) = Store[?] : &:r2897_22, r2897_26 +# 2897| v2897_31(void) = NoOp : +# 2897| v2897_32(void) = ReturnIndirection[#this] : &:r2897_6, ~m? +# 2897| v2897_33(void) = ReturnVoid : +# 2897| v2897_34(void) = AliasedUse : ~m? +# 2897| v2897_35(void) = ExitFunction : # 2899| void StructInit::StructInit() # 2899| Block 0 @@ -19562,20 +19579,22 @@ ir.cpp: # 2899| r2899_8(glval) = FieldAddress[i] : r2899_6 # 2899| r2899_9(int) = Constant[41] : # 2899| mu2899_10(int) = Store[?] : &:r2899_8, r2899_9 -#-----| Goto -> Block 2 - -# 2899| Block 1 -# 2899| r2899_11(glval) = FieldAddress[k] : r2899_6 -# 2899| r2899_12(int) = Constant[41] : -# 2899| mu2899_13(int) = Store[?] : &:r2899_11, r2899_12 -#-----| Goto -> Block 2 - -# 2899| Block 2 -# 2899| v2899_14(void) = NoOp : -# 2899| v2899_15(void) = ReturnIndirection[#this] : &:r2899_6, ~m? -# 2899| v2899_16(void) = ReturnVoid : -# 2899| v2899_17(void) = AliasedUse : ~m? -# 2899| v2899_18(void) = ExitFunction : +# 2899| r2899_11(glval) = FunctionAddress[j] : +# 2899| v2899_12(void) = Call[j] : func:r2899_11, this:r2899_6 +# 2899| r2899_13(glval) = FieldAddress[k] : r2899_6 +# 2899| r2899_14(int) = Constant[41] : +# 2899| mu2899_15(int) = Store[?] : &:r2899_13, r2899_14 +# 2899| r2899_16(glval) = FunctionAddress[l] : +# 2899| v2899_17(void) = Call[l] : func:r2899_16, this:r2899_6 +# 2899| r2899_18(glval) = FunctionAddress[m] : +# 2899| v2899_19(void) = Call[m] : func:r2899_18, this:r2899_6 +# 2899| r2899_20(glval) = FunctionAddress[n] : +# 2899| v2899_21(void) = Call[n] : func:r2899_20, this:r2899_6 +# 2899| v2899_22(void) = NoOp : +# 2899| v2899_23(void) = ReturnIndirection[#this] : &:r2899_6, ~m? +# 2899| v2899_24(void) = ReturnVoid : +# 2899| v2899_25(void) = AliasedUse : ~m? +# 2899| v2899_26(void) = ExitFunction : # 2901| int StructInit::get_val() # 2901| Block 0