diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 3f4039ebb346..a43595b08e08 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -538,6 +538,11 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { final override predicate producesExprResult() { any() } private TranslatedCoreExpr getOperand() { result.getExpr() = expr } + + override predicate handlesDestructorsExplicitly() { + // The destructor calls will already have been generated by the translation of `expr`. + any() + } } class TranslatedCommaExpr extends TranslatedNonConstantExpr { diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index e0d2da046b2e..28c1398d90bc 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -19565,12 +19565,6 @@ ir.cpp: # 2216| Type = [PlainCharType] char # 2216| Value = [CharLiteral] 97 # 2216| ValueCategory = prvalue -# 2215| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor -# 2215| Type = [VoidType] void -# 2215| ValueCategory = prvalue -# 2215| getQualifier(): [VariableAccess] y -# 2215| Type = [Class] ClassWithDestructor -# 2215| ValueCategory = lvalue # 2215| getImplicitDestructorCall(0): [DestructorCall] call to ~vector # 2215| Type = [VoidType] void # 2215| ValueCategory = prvalue @@ -19580,6 +19574,12 @@ ir.cpp: # 2215| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2215| Type = [ClassTemplateInstantiation,Struct] iterator # 2215| ValueCategory = lvalue +# 2215| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2215| Type = [VoidType] void +# 2215| ValueCategory = prvalue +# 2215| getQualifier(): [VariableAccess] y +# 2215| Type = [Class] ClassWithDestructor +# 2215| ValueCategory = lvalue # 2218| getStmt(6): [RangeBasedForStmt] for(...:...) ... # 2218| getInitialization(): [DeclStmt] declaration # 2218| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys @@ -19746,12 +19746,6 @@ ir.cpp: # 2233| getQualifier(): [VariableAccess] x # 2233| Type = [Class] ClassWithDestructor # 2233| ValueCategory = lvalue -# 2218| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor -# 2218| Type = [VoidType] void -# 2218| ValueCategory = prvalue -# 2218| getQualifier(): [VariableAccess] y -# 2218| Type = [Class] ClassWithDestructor -# 2218| ValueCategory = lvalue # 2218| getImplicitDestructorCall(0): [DestructorCall] call to ~vector # 2218| Type = [VoidType] void # 2218| ValueCategory = prvalue @@ -19761,6 +19755,12 @@ ir.cpp: # 2218| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2218| Type = [ClassTemplateInstantiation,Struct] iterator # 2218| ValueCategory = lvalue +# 2218| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2218| Type = [VoidType] void +# 2218| ValueCategory = prvalue +# 2218| getQualifier(): [VariableAccess] y +# 2218| Type = [Class] ClassWithDestructor +# 2218| ValueCategory = lvalue # 2224| getStmt(7): [RangeBasedForStmt] for(...:...) ... # 2224| getInitialization(): [DeclStmt] declaration # 2224| getDeclarationEntry(0): [VariableDeclarationEntry] definition of ys @@ -20038,12 +20038,6 @@ ir.cpp: # 2232| getQualifier(): [VariableAccess] z1 # 2232| Type = [Class] ClassWithDestructor # 2232| ValueCategory = lvalue -# 2229| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor -# 2229| Type = [VoidType] void -# 2229| ValueCategory = prvalue -# 2229| getQualifier(): [VariableAccess] y -# 2229| Type = [Class] ClassWithDestructor -# 2229| ValueCategory = lvalue # 2229| getImplicitDestructorCall(0): [DestructorCall] call to ~vector # 2229| Type = [VoidType] void # 2229| ValueCategory = prvalue @@ -20053,6 +20047,12 @@ ir.cpp: # 2229| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 2229| Type = [ClassTemplateInstantiation,Struct] iterator # 2229| ValueCategory = lvalue +# 2229| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2229| Type = [VoidType] void +# 2229| ValueCategory = prvalue +# 2229| getQualifier(): [VariableAccess] y +# 2229| Type = [Class] ClassWithDestructor +# 2229| ValueCategory = lvalue # 2233| getStmt(9): [ReturnStmt] return ... # 2233| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor # 2233| Type = [VoidType] void @@ -20662,15 +20662,15 @@ ir.cpp: # 2309| getQualifier(): [VariableAccess] s2 # 2309| Type = [Struct] String # 2309| ValueCategory = lvalue -# 2307| getImplicitDestructorCall(1): [DestructorCall] call to ~String +# 2307| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 2307| Type = [ClassTemplateInstantiation,Struct] iterator +# 2307| ValueCategory = lvalue +# 2307| getImplicitDestructorCall(0): [DestructorCall] call to ~String # 2307| Type = [VoidType] void # 2307| ValueCategory = prvalue # 2307| getQualifier(): [VariableAccess] s # 2307| Type = [Struct] String # 2307| ValueCategory = lvalue -# 2307| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) -# 2307| Type = [ClassTemplateInstantiation,Struct] iterator -# 2307| ValueCategory = lvalue # 2311| getStmt(3): [ForStmt] for(...;...;...) ... # 2311| getInitialization(): [DeclStmt] declaration # 2311| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s 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 3d3a56e790e9..68e5d36d2062 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -15372,7 +15372,7 @@ ir.cpp: #-----| True -> Block 2 # 2198| Block 1 -# 2198| m2198_9(unknown) = Phi : from 13:~m2233_5, from 19:~m2233_13, from 23:~m2233_22 +# 2198| m2198_9(unknown) = Phi : from 14:~m2233_5, from 19:~m2233_13, from 23:~m2233_22 # 2198| v2198_10(void) = ReturnVoid : # 2198| v2198_11(void) = AliasedUse : ~m2198_9 # 2198| v2198_12(void) = ExitFunction : @@ -15524,8 +15524,8 @@ ir.cpp: #-----| Goto -> Block 8 # 2215| Block 8 -# 2215| m2215_40(iterator) = Phi : from 7:m2215_32, from 9:m2215_72 -# 2215| m2215_41(unknown) = Phi : from 7:~m2215_39, from 9:~m2215_63 +# 2215| m2215_40(iterator) = Phi : from 7:m2215_32, from 9:m2215_64 +# 2215| m2215_41(unknown) = Phi : from 7:~m2215_39, from 9:~m2215_69 # 2215| r2215_42(glval>) = VariableAddress[(__begin)] : #-----| r0_7(glval>) = Convert : r2215_42 # 2215| r2215_43(glval) = FunctionAddress[operator!=] : @@ -15567,21 +15567,21 @@ ir.cpp: # 2216| v2216_7(void) = ^IndirectReadSideEffect[-1] : &:r2216_1, m2215_58 # 2216| m2216_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2216_1 # 2216| m2216_9(ClassWithDestructor) = Chi : total:m2215_58, partial:m2216_8 -# 2215| r2215_59(glval) = VariableAddress[y] : -# 2215| r2215_60(glval) = FunctionAddress[~ClassWithDestructor] : -# 2215| v2215_61(void) = Call[~ClassWithDestructor] : func:r2215_60, this:r2215_59 -# 2215| m2215_62(unknown) = ^CallSideEffect : ~m2216_6 -# 2215| m2215_63(unknown) = Chi : total:m2216_6, partial:m2215_62 -# 2215| v2215_64(void) = ^IndirectReadSideEffect[-1] : &:r2215_59, m2216_9 -# 2215| m2215_65(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_59 -# 2215| m2215_66(ClassWithDestructor) = Chi : total:m2216_9, partial:m2215_65 -# 2215| r2215_67(glval>) = VariableAddress[(__begin)] : -# 2215| r2215_68(glval) = FunctionAddress[operator++] : -# 2215| r2215_69(iterator &) = Call[operator++] : func:r2215_68, this:r2215_67 -# 2215| v2215_70(void) = ^IndirectReadSideEffect[-1] : &:r2215_67, m2215_40 -# 2215| m2215_71(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2215_67 -# 2215| m2215_72(iterator) = Chi : total:m2215_40, partial:m2215_71 -# 2215| r2215_73(glval>) = CopyValue : r2215_69 +# 2215| r2215_59(glval>) = VariableAddress[(__begin)] : +# 2215| r2215_60(glval) = FunctionAddress[operator++] : +# 2215| r2215_61(iterator &) = Call[operator++] : func:r2215_60, this:r2215_59 +# 2215| v2215_62(void) = ^IndirectReadSideEffect[-1] : &:r2215_59, m2215_40 +# 2215| m2215_63(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2215_59 +# 2215| m2215_64(iterator) = Chi : total:m2215_40, partial:m2215_63 +# 2215| r2215_65(glval) = VariableAddress[y] : +# 2215| r2215_66(glval) = FunctionAddress[~ClassWithDestructor] : +# 2215| v2215_67(void) = Call[~ClassWithDestructor] : func:r2215_66, this:r2215_65 +# 2215| m2215_68(unknown) = ^CallSideEffect : ~m2216_6 +# 2215| m2215_69(unknown) = Chi : total:m2216_6, partial:m2215_68 +# 2215| v2215_70(void) = ^IndirectReadSideEffect[-1] : &:r2215_65, m2216_9 +# 2215| m2215_71(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_65 +# 2215| m2215_72(ClassWithDestructor) = Chi : total:m2216_9, partial:m2215_71 +# 2215| r2215_73(glval>) = CopyValue : r2215_61 #-----| Goto (back edge) -> Block 8 # 2218| Block 10 @@ -15633,8 +15633,8 @@ ir.cpp: #-----| Goto -> Block 11 # 2218| Block 11 -# 2218| m2218_40(iterator) = Phi : from 10:m2218_32, from 14:m2218_88 -# 2218| m2218_41(unknown) = Phi : from 10:~m2218_39, from 14:~m2218_79 +# 2218| m2218_40(iterator) = Phi : from 10:m2218_32, from 12:m2218_58 +# 2218| m2218_41(unknown) = Phi : from 10:~m2218_39, from 12:~m2218_63 # 2218| r2218_42(glval>) = VariableAddress[(__begin)] : #-----| r0_24(glval>) = Convert : r2218_42 # 2218| r2218_43(glval) = FunctionAddress[operator!=] : @@ -15656,26 +15656,44 @@ ir.cpp: #-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_24, m2218_40 # 2218| v2218_52(void) = ConditionalBranch : r2218_51 #-----| False -> Block 15 -#-----| True -> Block 12 +#-----| True -> Block 13 # 2218| Block 12 -# 2218| r2218_53(glval) = VariableAddress[y] : -# 2218| r2218_54(glval>) = VariableAddress[(__begin)] : -#-----| r0_33(glval>) = Convert : r2218_54 -# 2218| r2218_55(glval) = FunctionAddress[operator*] : -# 2218| r2218_56(ClassWithDestructor &) = Call[operator*] : func:r2218_55, this:r0_33 +# 2218| r2218_53(glval>) = VariableAddress[(__begin)] : +# 2218| r2218_54(glval) = FunctionAddress[operator++] : +# 2218| r2218_55(iterator &) = Call[operator++] : func:r2218_54, this:r2218_53 +# 2218| v2218_56(void) = ^IndirectReadSideEffect[-1] : &:r2218_53, m2218_40 +# 2218| m2218_57(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2218_53 +# 2218| m2218_58(iterator) = Chi : total:m2218_40, partial:m2218_57 +# 2218| r2218_59(glval) = VariableAddress[y] : +# 2218| r2218_60(glval) = FunctionAddress[~ClassWithDestructor] : +# 2218| v2218_61(void) = Call[~ClassWithDestructor] : func:r2218_60, this:r2218_59 +# 2218| m2218_62(unknown) = ^CallSideEffect : ~m2220_5 +# 2218| m2218_63(unknown) = Chi : total:m2220_5, partial:m2218_62 +# 2218| v2218_64(void) = ^IndirectReadSideEffect[-1] : &:r2218_59, m2220_8 +# 2218| m2218_65(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_59 +# 2218| m2218_66(ClassWithDestructor) = Chi : total:m2220_8, partial:m2218_65 +# 2218| r2218_67(glval>) = CopyValue : r2218_55 +#-----| Goto (back edge) -> Block 11 + +# 2218| Block 13 +# 2218| r2218_68(glval) = VariableAddress[y] : +# 2218| r2218_69(glval>) = VariableAddress[(__begin)] : +#-----| r0_33(glval>) = Convert : r2218_69 +# 2218| r2218_70(glval) = FunctionAddress[operator*] : +# 2218| r2218_71(ClassWithDestructor &) = Call[operator*] : func:r2218_70, this:r0_33 #-----| v0_34(void) = ^IndirectReadSideEffect[-1] : &:r0_33, m2218_40 -# 2218| r2218_57(ClassWithDestructor) = Load[?] : &:r2218_56, ~m2218_50 -# 2218| m2218_58(ClassWithDestructor) = Store[y] : &:r2218_53, r2218_57 +# 2218| r2218_72(ClassWithDestructor) = Load[?] : &:r2218_71, ~m2218_50 +# 2218| m2218_73(ClassWithDestructor) = Store[y] : &:r2218_68, r2218_72 # 2219| r2219_1(glval) = VariableAddress[y] : # 2219| r2219_2(glval) = FunctionAddress[set_x] : # 2219| r2219_3(char) = Constant[97] : # 2219| v2219_4(void) = Call[set_x] : func:r2219_2, this:r2219_1, 0:r2219_3 # 2219| m2219_5(unknown) = ^CallSideEffect : ~m2218_50 # 2219| m2219_6(unknown) = Chi : total:m2218_50, partial:m2219_5 -# 2219| v2219_7(void) = ^IndirectReadSideEffect[-1] : &:r2219_1, m2218_58 +# 2219| v2219_7(void) = ^IndirectReadSideEffect[-1] : &:r2219_1, m2218_73 # 2219| m2219_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2219_1 -# 2219| m2219_9(ClassWithDestructor) = Chi : total:m2218_58, partial:m2219_8 +# 2219| m2219_9(ClassWithDestructor) = Chi : total:m2218_73, partial:m2219_8 # 2220| r2220_1(glval) = VariableAddress[y] : # 2220| r2220_2(glval) = FunctionAddress[get_x] : # 2220| r2220_3(char) = Call[get_x] : func:r2220_2, this:r2220_1 @@ -15688,55 +15706,37 @@ ir.cpp: # 2220| r2220_10(int) = Constant[98] : # 2220| r2220_11(bool) = CompareEQ : r2220_9, r2220_10 # 2220| v2220_12(void) = ConditionalBranch : r2220_11 -#-----| False -> Block 14 -#-----| True -> Block 13 +#-----| False -> Block 12 +#-----| True -> Block 14 -# 2221| Block 13 +# 2221| Block 14 # 2221| v2221_1(void) = NoOp : -# 2218| r2218_59(glval) = VariableAddress[y] : -# 2218| r2218_60(glval) = FunctionAddress[~ClassWithDestructor] : -# 2218| v2218_61(void) = Call[~ClassWithDestructor] : func:r2218_60, this:r2218_59 -# 2218| m2218_62(unknown) = ^CallSideEffect : ~m2220_5 -# 2218| m2218_63(unknown) = Chi : total:m2220_5, partial:m2218_62 -# 2218| v2218_64(void) = ^IndirectReadSideEffect[-1] : &:r2218_59, m2220_8 -# 2218| m2218_65(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_59 -# 2218| m2218_66(ClassWithDestructor) = Chi : total:m2220_8, partial:m2218_65 -# 2218| r2218_67(glval>) = VariableAddress[ys] : -# 2218| r2218_68(glval) = FunctionAddress[~vector] : -# 2218| v2218_69(void) = Call[~vector] : func:r2218_68, this:r2218_67 -# 2218| m2218_70(unknown) = ^CallSideEffect : ~m2218_63 -# 2218| m2218_71(unknown) = Chi : total:m2218_63, partial:m2218_70 -# 2218| v2218_72(void) = ^IndirectReadSideEffect[-1] : &:r2218_67, ~m2218_71 -# 2218| m2218_73(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2218_67 -# 2218| m2218_74(unknown) = Chi : total:m2218_71, partial:m2218_73 +# 2218| r2218_74(glval) = VariableAddress[y] : +# 2218| r2218_75(glval) = FunctionAddress[~ClassWithDestructor] : +# 2218| v2218_76(void) = Call[~ClassWithDestructor] : func:r2218_75, this:r2218_74 +# 2218| m2218_77(unknown) = ^CallSideEffect : ~m2220_5 +# 2218| m2218_78(unknown) = Chi : total:m2220_5, partial:m2218_77 +# 2218| v2218_79(void) = ^IndirectReadSideEffect[-1] : &:r2218_74, m2220_8 +# 2218| m2218_80(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_74 +# 2218| m2218_81(ClassWithDestructor) = Chi : total:m2220_8, partial:m2218_80 +# 2218| r2218_82(glval>) = VariableAddress[ys] : +# 2218| r2218_83(glval) = FunctionAddress[~vector] : +# 2218| v2218_84(void) = Call[~vector] : func:r2218_83, this:r2218_82 +# 2218| m2218_85(unknown) = ^CallSideEffect : ~m2218_78 +# 2218| m2218_86(unknown) = Chi : total:m2218_78, partial:m2218_85 +# 2218| v2218_87(void) = ^IndirectReadSideEffect[-1] : &:r2218_82, ~m2218_86 +# 2218| m2218_88(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2218_82 +# 2218| m2218_89(unknown) = Chi : total:m2218_86, partial:m2218_88 # 2233| r2233_1(glval) = VariableAddress[x] : # 2233| r2233_2(glval) = FunctionAddress[~ClassWithDestructor] : # 2233| v2233_3(void) = Call[~ClassWithDestructor] : func:r2233_2, this:r2233_1 -# 2233| m2233_4(unknown) = ^CallSideEffect : ~m2218_74 -# 2233| m2233_5(unknown) = Chi : total:m2218_74, partial:m2233_4 +# 2233| m2233_4(unknown) = ^CallSideEffect : ~m2218_89 +# 2233| m2233_5(unknown) = Chi : total:m2218_89, partial:m2233_4 # 2233| v2233_6(void) = ^IndirectReadSideEffect[-1] : &:r2233_1, m2214_8 # 2233| m2233_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2233_1 # 2233| m2233_8(ClassWithDestructor) = Chi : total:m2214_8, partial:m2233_7 #-----| Goto -> Block 1 -# 2218| Block 14 -# 2218| r2218_75(glval) = VariableAddress[y] : -# 2218| r2218_76(glval) = FunctionAddress[~ClassWithDestructor] : -# 2218| v2218_77(void) = Call[~ClassWithDestructor] : func:r2218_76, this:r2218_75 -# 2218| m2218_78(unknown) = ^CallSideEffect : ~m2220_5 -# 2218| m2218_79(unknown) = Chi : total:m2220_5, partial:m2218_78 -# 2218| v2218_80(void) = ^IndirectReadSideEffect[-1] : &:r2218_75, m2220_8 -# 2218| m2218_81(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_75 -# 2218| m2218_82(ClassWithDestructor) = Chi : total:m2220_8, partial:m2218_81 -# 2218| r2218_83(glval>) = VariableAddress[(__begin)] : -# 2218| r2218_84(glval) = FunctionAddress[operator++] : -# 2218| r2218_85(iterator &) = Call[operator++] : func:r2218_84, this:r2218_83 -# 2218| v2218_86(void) = ^IndirectReadSideEffect[-1] : &:r2218_83, m2218_40 -# 2218| m2218_87(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2218_83 -# 2218| m2218_88(iterator) = Chi : total:m2218_40, partial:m2218_87 -# 2218| r2218_89(glval>) = CopyValue : r2218_85 -#-----| Goto (back edge) -> Block 11 - # 2224| Block 15 # 2224| r2224_1(glval>) = VariableAddress[ys] : # 2224| m2224_2(vector) = Uninitialized[ys] : &:r2224_1 @@ -15895,8 +15895,8 @@ ir.cpp: #-----| Goto -> Block 21 # 2229| Block 21 -# 2229| m2229_40(iterator) = Phi : from 20:m2229_32, from 22:m2229_72 -# 2229| m2229_41(unknown) = Phi : from 20:~m2229_39, from 22:~m2229_63 +# 2229| m2229_40(iterator) = Phi : from 20:m2229_32, from 22:m2229_64 +# 2229| m2229_41(unknown) = Phi : from 20:~m2229_39, from 22:~m2229_69 # 2229| r2229_42(glval>) = VariableAddress[(__begin)] : #-----| r0_58(glval>) = Convert : r2229_42 # 2229| r2229_43(glval) = FunctionAddress[operator!=] : @@ -15961,21 +15961,21 @@ ir.cpp: # 2232| v2232_14(void) = ^IndirectReadSideEffect[-1] : &:r2232_9, m2230_8 # 2232| m2232_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2232_9 # 2232| m2232_16(ClassWithDestructor) = Chi : total:m2230_8, partial:m2232_15 -# 2229| r2229_59(glval) = VariableAddress[y] : -# 2229| r2229_60(glval) = FunctionAddress[~ClassWithDestructor] : -# 2229| v2229_61(void) = Call[~ClassWithDestructor] : func:r2229_60, this:r2229_59 -# 2229| m2229_62(unknown) = ^CallSideEffect : ~m2232_13 -# 2229| m2229_63(unknown) = Chi : total:m2232_13, partial:m2229_62 -# 2229| v2229_64(void) = ^IndirectReadSideEffect[-1] : &:r2229_59, m2229_58 -# 2229| m2229_65(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2229_59 -# 2229| m2229_66(ClassWithDestructor) = Chi : total:m2229_58, partial:m2229_65 -# 2229| r2229_67(glval>) = VariableAddress[(__begin)] : -# 2229| r2229_68(glval) = FunctionAddress[operator++] : -# 2229| r2229_69(iterator &) = Call[operator++] : func:r2229_68, this:r2229_67 -# 2229| v2229_70(void) = ^IndirectReadSideEffect[-1] : &:r2229_67, m2229_40 -# 2229| m2229_71(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2229_67 -# 2229| m2229_72(iterator) = Chi : total:m2229_40, partial:m2229_71 -# 2229| r2229_73(glval>) = CopyValue : r2229_69 +# 2229| r2229_59(glval>) = VariableAddress[(__begin)] : +# 2229| r2229_60(glval) = FunctionAddress[operator++] : +# 2229| r2229_61(iterator &) = Call[operator++] : func:r2229_60, this:r2229_59 +# 2229| v2229_62(void) = ^IndirectReadSideEffect[-1] : &:r2229_59, m2229_40 +# 2229| m2229_63(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2229_59 +# 2229| m2229_64(iterator) = Chi : total:m2229_40, partial:m2229_63 +# 2229| r2229_65(glval) = VariableAddress[y] : +# 2229| r2229_66(glval) = FunctionAddress[~ClassWithDestructor] : +# 2229| v2229_67(void) = Call[~ClassWithDestructor] : func:r2229_66, this:r2229_65 +# 2229| m2229_68(unknown) = ^CallSideEffect : ~m2232_13 +# 2229| m2229_69(unknown) = Chi : total:m2232_13, partial:m2229_68 +# 2229| v2229_70(void) = ^IndirectReadSideEffect[-1] : &:r2229_65, m2229_58 +# 2229| m2229_71(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2229_65 +# 2229| m2229_72(ClassWithDestructor) = Chi : total:m2229_58, partial:m2229_71 +# 2229| r2229_73(glval>) = CopyValue : r2229_61 #-----| Goto (back edge) -> Block 21 # 2233| Block 23 @@ -16684,8 +16684,8 @@ ir.cpp: #-----| Goto -> Block 4 # 2307| Block 4 -# 2307| m2307_47(iterator) = Phi : from 3:m2307_39, from 5:m2307_89 -# 2307| m2307_48(unknown) = Phi : from 3:~m2307_46, from 5:~m2307_83 +# 2307| m2307_47(iterator) = Phi : from 3:m2307_39, from 5:m2307_81 +# 2307| m2307_48(unknown) = Phi : from 3:~m2307_46, from 5:~m2307_89 # 2307| r2307_49(glval>) = VariableAddress[(__begin)] : #-----| r0_7(glval>) = Convert : r2307_49 # 2307| r2307_50(glval) = FunctionAddress[operator!=] : @@ -16745,21 +16745,21 @@ ir.cpp: # 2309| v2309_6(void) = ^IndirectReadSideEffect[-1] : &:r2309_1, ~m2309_5 # 2309| m2309_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2309_1 # 2309| m2309_8(unknown) = Chi : total:m2309_5, partial:m2309_7 -# 2307| r2307_76(glval) = VariableAddress[s] : -# 2307| r2307_77(glval) = FunctionAddress[~String] : -# 2307| v2307_78(void) = Call[~String] : func:r2307_77, this:r2307_76 -# 2307| m2307_79(unknown) = ^CallSideEffect : ~m2309_8 -# 2307| m2307_80(unknown) = Chi : total:m2309_8, partial:m2307_79 -# 2307| v2307_81(void) = ^IndirectReadSideEffect[-1] : &:r2307_76, ~m2307_80 -# 2307| m2307_82(String) = ^IndirectMayWriteSideEffect[-1] : &:r2307_76 -# 2307| m2307_83(unknown) = Chi : total:m2307_80, partial:m2307_82 -# 2307| r2307_84(glval>) = VariableAddress[(__begin)] : -# 2307| r2307_85(glval) = FunctionAddress[operator++] : -# 2307| r2307_86(iterator &) = Call[operator++] : func:r2307_85, this:r2307_84 -# 2307| v2307_87(void) = ^IndirectReadSideEffect[-1] : &:r2307_84, m2307_47 -# 2307| m2307_88(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2307_84 -# 2307| m2307_89(iterator) = Chi : total:m2307_47, partial:m2307_88 -# 2307| r2307_90(glval>) = CopyValue : r2307_86 +# 2307| r2307_76(glval>) = VariableAddress[(__begin)] : +# 2307| r2307_77(glval) = FunctionAddress[operator++] : +# 2307| r2307_78(iterator &) = Call[operator++] : func:r2307_77, this:r2307_76 +# 2307| v2307_79(void) = ^IndirectReadSideEffect[-1] : &:r2307_76, m2307_47 +# 2307| m2307_80(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2307_76 +# 2307| m2307_81(iterator) = Chi : total:m2307_47, partial:m2307_80 +# 2307| r2307_82(glval) = VariableAddress[s] : +# 2307| r2307_83(glval) = FunctionAddress[~String] : +# 2307| v2307_84(void) = Call[~String] : func:r2307_83, this:r2307_82 +# 2307| m2307_85(unknown) = ^CallSideEffect : ~m2309_8 +# 2307| m2307_86(unknown) = Chi : total:m2309_8, partial:m2307_85 +# 2307| v2307_87(void) = ^IndirectReadSideEffect[-1] : &:r2307_82, ~m2307_86 +# 2307| m2307_88(String) = ^IndirectMayWriteSideEffect[-1] : &:r2307_82 +# 2307| m2307_89(unknown) = Chi : total:m2307_86, partial:m2307_88 +# 2307| r2307_90(glval>) = CopyValue : r2307_78 #-----| Goto (back edge) -> Block 4 # 2311| Block 6 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 6ff42a28cb35..aadcd33f5104 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -14325,18 +14325,18 @@ ir.cpp: # 2216| mu2216_5(unknown) = ^CallSideEffect : ~m? # 2216| v2216_6(void) = ^IndirectReadSideEffect[-1] : &:r2216_1, ~m? # 2216| mu2216_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2216_1 -# 2215| r2215_49(glval) = VariableAddress[y] : -# 2215| r2215_50(glval) = FunctionAddress[~ClassWithDestructor] : -# 2215| v2215_51(void) = Call[~ClassWithDestructor] : func:r2215_50, this:r2215_49 -# 2215| mu2215_52(unknown) = ^CallSideEffect : ~m? -# 2215| v2215_53(void) = ^IndirectReadSideEffect[-1] : &:r2215_49, ~m? -# 2215| mu2215_54(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_49 -# 2215| r2215_55(glval>) = VariableAddress[(__begin)] : -# 2215| r2215_56(glval) = FunctionAddress[operator++] : -# 2215| r2215_57(iterator &) = Call[operator++] : func:r2215_56, this:r2215_55 -# 2215| v2215_58(void) = ^IndirectReadSideEffect[-1] : &:r2215_55, ~m? -# 2215| mu2215_59(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2215_55 -# 2215| r2215_60(glval>) = CopyValue : r2215_57 +# 2215| r2215_49(glval>) = VariableAddress[(__begin)] : +# 2215| r2215_50(glval) = FunctionAddress[operator++] : +# 2215| r2215_51(iterator &) = Call[operator++] : func:r2215_50, this:r2215_49 +# 2215| v2215_52(void) = ^IndirectReadSideEffect[-1] : &:r2215_49, ~m? +# 2215| mu2215_53(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2215_49 +# 2215| r2215_54(glval) = VariableAddress[y] : +# 2215| r2215_55(glval) = FunctionAddress[~ClassWithDestructor] : +# 2215| v2215_56(void) = Call[~ClassWithDestructor] : func:r2215_55, this:r2215_54 +# 2215| mu2215_57(unknown) = ^CallSideEffect : ~m? +# 2215| v2215_58(void) = ^IndirectReadSideEffect[-1] : &:r2215_54, ~m? +# 2215| mu2215_59(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_54 +# 2215| r2215_60(glval>) = CopyValue : r2215_51 #-----| Goto (back edge) -> Block 11 # 2215| Block 13 @@ -14409,17 +14409,32 @@ ir.cpp: #-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_23, ~m? # 2218| v2218_42(void) = ConditionalBranch : r2218_41 #-----| False -> Block 20 -#-----| True -> Block 16 +#-----| True -> Block 17 # 2218| Block 16 -# 2218| r2218_43(glval) = VariableAddress[y] : -# 2218| r2218_44(glval>) = VariableAddress[(__begin)] : -#-----| r0_31(glval>) = Convert : r2218_44 -# 2218| r2218_45(glval) = FunctionAddress[operator*] : -# 2218| r2218_46(ClassWithDestructor &) = Call[operator*] : func:r2218_45, this:r0_31 +# 2218| r2218_43(glval>) = VariableAddress[(__begin)] : +# 2218| r2218_44(glval) = FunctionAddress[operator++] : +# 2218| r2218_45(iterator &) = Call[operator++] : func:r2218_44, this:r2218_43 +# 2218| v2218_46(void) = ^IndirectReadSideEffect[-1] : &:r2218_43, ~m? +# 2218| mu2218_47(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2218_43 +# 2218| r2218_48(glval) = VariableAddress[y] : +# 2218| r2218_49(glval) = FunctionAddress[~ClassWithDestructor] : +# 2218| v2218_50(void) = Call[~ClassWithDestructor] : func:r2218_49, this:r2218_48 +# 2218| mu2218_51(unknown) = ^CallSideEffect : ~m? +# 2218| v2218_52(void) = ^IndirectReadSideEffect[-1] : &:r2218_48, ~m? +# 2218| mu2218_53(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_48 +# 2218| r2218_54(glval>) = CopyValue : r2218_45 +#-----| Goto (back edge) -> Block 15 + +# 2218| Block 17 +# 2218| r2218_55(glval) = VariableAddress[y] : +# 2218| r2218_56(glval>) = VariableAddress[(__begin)] : +#-----| r0_31(glval>) = Convert : r2218_56 +# 2218| r2218_57(glval) = FunctionAddress[operator*] : +# 2218| r2218_58(ClassWithDestructor &) = Call[operator*] : func:r2218_57, this:r0_31 #-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m? -# 2218| r2218_47(ClassWithDestructor) = Load[?] : &:r2218_46, ~m? -# 2218| mu2218_48(ClassWithDestructor) = Store[y] : &:r2218_43, r2218_47 +# 2218| r2218_59(ClassWithDestructor) = Load[?] : &:r2218_58, ~m? +# 2218| mu2218_60(ClassWithDestructor) = Store[y] : &:r2218_55, r2218_59 # 2219| r2219_1(glval) = VariableAddress[y] : # 2219| r2219_2(glval) = FunctionAddress[set_x] : # 2219| r2219_3(char) = Constant[97] : @@ -14437,23 +14452,23 @@ ir.cpp: # 2220| r2220_8(int) = Constant[98] : # 2220| r2220_9(bool) = CompareEQ : r2220_7, r2220_8 # 2220| v2220_10(void) = ConditionalBranch : r2220_9 -#-----| False -> Block 18 -#-----| True -> Block 17 +#-----| False -> Block 16 +#-----| True -> Block 18 -# 2221| Block 17 +# 2221| Block 18 # 2221| v2221_1(void) = NoOp : -# 2218| r2218_49(glval) = VariableAddress[y] : -# 2218| r2218_50(glval) = FunctionAddress[~ClassWithDestructor] : -# 2218| v2218_51(void) = Call[~ClassWithDestructor] : func:r2218_50, this:r2218_49 -# 2218| mu2218_52(unknown) = ^CallSideEffect : ~m? -# 2218| v2218_53(void) = ^IndirectReadSideEffect[-1] : &:r2218_49, ~m? -# 2218| mu2218_54(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_49 -# 2218| r2218_55(glval>) = VariableAddress[ys] : -# 2218| r2218_56(glval) = FunctionAddress[~vector] : -# 2218| v2218_57(void) = Call[~vector] : func:r2218_56, this:r2218_55 -# 2218| mu2218_58(unknown) = ^CallSideEffect : ~m? -# 2218| v2218_59(void) = ^IndirectReadSideEffect[-1] : &:r2218_55, ~m? -# 2218| mu2218_60(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2218_55 +# 2218| r2218_61(glval) = VariableAddress[y] : +# 2218| r2218_62(glval) = FunctionAddress[~ClassWithDestructor] : +# 2218| v2218_63(void) = Call[~ClassWithDestructor] : func:r2218_62, this:r2218_61 +# 2218| mu2218_64(unknown) = ^CallSideEffect : ~m? +# 2218| v2218_65(void) = ^IndirectReadSideEffect[-1] : &:r2218_61, ~m? +# 2218| mu2218_66(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_61 +# 2218| r2218_67(glval>) = VariableAddress[ys] : +# 2218| r2218_68(glval) = FunctionAddress[~vector] : +# 2218| v2218_69(void) = Call[~vector] : func:r2218_68, this:r2218_67 +# 2218| mu2218_70(unknown) = ^CallSideEffect : ~m? +# 2218| v2218_71(void) = ^IndirectReadSideEffect[-1] : &:r2218_67, ~m? +# 2218| mu2218_72(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2218_67 # 2233| r2233_1(glval) = VariableAddress[x] : # 2233| r2233_2(glval) = FunctionAddress[~ClassWithDestructor] : # 2233| v2233_3(void) = Call[~ClassWithDestructor] : func:r2233_2, this:r2233_1 @@ -14462,21 +14477,6 @@ ir.cpp: # 2233| mu2233_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2233_1 #-----| Goto -> Block 1 -# 2218| Block 18 -# 2218| r2218_61(glval) = VariableAddress[y] : -# 2218| r2218_62(glval) = FunctionAddress[~ClassWithDestructor] : -# 2218| v2218_63(void) = Call[~ClassWithDestructor] : func:r2218_62, this:r2218_61 -# 2218| mu2218_64(unknown) = ^CallSideEffect : ~m? -# 2218| v2218_65(void) = ^IndirectReadSideEffect[-1] : &:r2218_61, ~m? -# 2218| mu2218_66(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_61 -# 2218| r2218_67(glval>) = VariableAddress[(__begin)] : -# 2218| r2218_68(glval) = FunctionAddress[operator++] : -# 2218| r2218_69(iterator &) = Call[operator++] : func:r2218_68, this:r2218_67 -# 2218| v2218_70(void) = ^IndirectReadSideEffect[-1] : &:r2218_67, ~m? -# 2218| mu2218_71(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2218_67 -# 2218| r2218_72(glval>) = CopyValue : r2218_69 -#-----| Goto (back edge) -> Block 15 - # 2218| Block 19 # 2218| r2218_73(glval>) = VariableAddress[ys] : # 2218| r2218_74(glval) = FunctionAddress[~vector] : @@ -14686,18 +14686,18 @@ ir.cpp: # 2232| mu2232_10(unknown) = ^CallSideEffect : ~m? # 2232| v2232_11(void) = ^IndirectReadSideEffect[-1] : &:r2232_7, ~m? # 2232| mu2232_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2232_7 -# 2229| r2229_49(glval) = VariableAddress[y] : -# 2229| r2229_50(glval) = FunctionAddress[~ClassWithDestructor] : -# 2229| v2229_51(void) = Call[~ClassWithDestructor] : func:r2229_50, this:r2229_49 -# 2229| mu2229_52(unknown) = ^CallSideEffect : ~m? -# 2229| v2229_53(void) = ^IndirectReadSideEffect[-1] : &:r2229_49, ~m? -# 2229| mu2229_54(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2229_49 -# 2229| r2229_55(glval>) = VariableAddress[(__begin)] : -# 2229| r2229_56(glval) = FunctionAddress[operator++] : -# 2229| r2229_57(iterator &) = Call[operator++] : func:r2229_56, this:r2229_55 -# 2229| v2229_58(void) = ^IndirectReadSideEffect[-1] : &:r2229_55, ~m? -# 2229| mu2229_59(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2229_55 -# 2229| r2229_60(glval>) = CopyValue : r2229_57 +# 2229| r2229_49(glval>) = VariableAddress[(__begin)] : +# 2229| r2229_50(glval) = FunctionAddress[operator++] : +# 2229| r2229_51(iterator &) = Call[operator++] : func:r2229_50, this:r2229_49 +# 2229| v2229_52(void) = ^IndirectReadSideEffect[-1] : &:r2229_49, ~m? +# 2229| mu2229_53(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2229_49 +# 2229| r2229_54(glval) = VariableAddress[y] : +# 2229| r2229_55(glval) = FunctionAddress[~ClassWithDestructor] : +# 2229| v2229_56(void) = Call[~ClassWithDestructor] : func:r2229_55, this:r2229_54 +# 2229| mu2229_57(unknown) = ^CallSideEffect : ~m? +# 2229| v2229_58(void) = ^IndirectReadSideEffect[-1] : &:r2229_54, ~m? +# 2229| mu2229_59(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2229_54 +# 2229| r2229_60(glval>) = CopyValue : r2229_51 #-----| Goto (back edge) -> Block 27 # 2229| Block 29 @@ -15339,18 +15339,18 @@ ir.cpp: # 2309| mu2309_4(unknown) = ^CallSideEffect : ~m? # 2309| v2309_5(void) = ^IndirectReadSideEffect[-1] : &:r2309_1, ~m? # 2309| mu2309_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2309_1 -# 2307| r2307_60(glval) = VariableAddress[s] : -# 2307| r2307_61(glval) = FunctionAddress[~String] : -# 2307| v2307_62(void) = Call[~String] : func:r2307_61, this:r2307_60 -# 2307| mu2307_63(unknown) = ^CallSideEffect : ~m? -# 2307| v2307_64(void) = ^IndirectReadSideEffect[-1] : &:r2307_60, ~m? -# 2307| mu2307_65(String) = ^IndirectMayWriteSideEffect[-1] : &:r2307_60 -# 2307| r2307_66(glval>) = VariableAddress[(__begin)] : -# 2307| r2307_67(glval) = FunctionAddress[operator++] : -# 2307| r2307_68(iterator &) = Call[operator++] : func:r2307_67, this:r2307_66 -# 2307| v2307_69(void) = ^IndirectReadSideEffect[-1] : &:r2307_66, ~m? -# 2307| mu2307_70(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2307_66 -# 2307| r2307_71(glval>) = CopyValue : r2307_68 +# 2307| r2307_60(glval>) = VariableAddress[(__begin)] : +# 2307| r2307_61(glval) = FunctionAddress[operator++] : +# 2307| r2307_62(iterator &) = Call[operator++] : func:r2307_61, this:r2307_60 +# 2307| v2307_63(void) = ^IndirectReadSideEffect[-1] : &:r2307_60, ~m? +# 2307| mu2307_64(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2307_60 +# 2307| r2307_65(glval) = VariableAddress[s] : +# 2307| r2307_66(glval) = FunctionAddress[~String] : +# 2307| v2307_67(void) = Call[~String] : func:r2307_66, this:r2307_65 +# 2307| mu2307_68(unknown) = ^CallSideEffect : ~m? +# 2307| v2307_69(void) = ^IndirectReadSideEffect[-1] : &:r2307_65, ~m? +# 2307| mu2307_70(String) = ^IndirectMayWriteSideEffect[-1] : &:r2307_65 +# 2307| r2307_71(glval>) = CopyValue : r2307_62 #-----| Goto (back edge) -> Block 4 # 2311| Block 6