Skip to content

Commit fb072a5

Browse files
committed
C++: Add additional IR tests for init statements
1 parent 8aeb756 commit fb072a5

10 files changed

+876
-0
lines changed

cpp/ql/test/library-tests/ir/ir/PrintAST.expected

Lines changed: 283 additions & 0 deletions
Large diffs are not rendered by default.

cpp/ql/test/library-tests/ir/ir/aliased_ir.expected

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12473,6 +12473,160 @@ ir.cpp:
1247312473
# 2121| v2121_6(void) = AliasedUse : ~m2122_8
1247412474
# 2121| v2121_7(void) = ExitFunction :
1247512475

12476+
# 2125| void ClassWithDestructor::ClassWithDestructor(ClassWithDestructor const&)
12477+
# 2125| Block 0
12478+
# 2125| v2125_1(void) = EnterFunction :
12479+
# 2125| m2125_2(unknown) = AliasedDefinition :
12480+
# 2125| m2125_3(unknown) = InitializeNonLocal :
12481+
# 2125| m2125_4(unknown) = Chi : total:m2125_2, partial:m2125_3
12482+
# 2125| r2125_5(glval<unknown>) = VariableAddress[#this] :
12483+
# 2125| m2125_6(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2125_5
12484+
# 2125| r2125_7(glval<ClassWithDestructor>) = Load[#this] : &:r2125_5, m2125_6
12485+
# 2125| m2125_8(ClassWithDestructor) = InitializeIndirection[#this] : &:r2125_7
12486+
#-----| r0_1(glval<ClassWithDestructor &>) = VariableAddress[(unnamed parameter 0)] :
12487+
#-----| m0_2(ClassWithDestructor &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1
12488+
#-----| r0_3(ClassWithDestructor &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2
12489+
#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3
12490+
# 2125| r2125_9(glval<char *>) = FieldAddress[x] : m2125_6
12491+
# 2125| r2125_10(glval<ClassWithDestructor &>) = VariableAddress[(unnamed parameter 0)] :
12492+
# 2125| r2125_11(ClassWithDestructor &) = Load[(unnamed parameter 0)] : &:r2125_10, m0_2
12493+
# 2125| r2125_12(glval<ClassWithDestructor>) = CopyValue : r2125_11
12494+
# 2125| r2125_13(glval<char *>) = FieldAddress[x] : r2125_12
12495+
# 2125| r2125_14(char *) = Load[?] : &:r2125_13, ~m0_4
12496+
# 2125| m2125_15(char *) = Store[?] : &:r2125_9, r2125_14
12497+
# 2125| m2125_16(unknown) = Chi : total:m2125_8, partial:m2125_15
12498+
# 2125| v2125_17(void) = NoOp :
12499+
# 2125| v2125_18(void) = ReturnIndirection[#this] : &:r2125_7, m2125_16
12500+
#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4
12501+
# 2125| v2125_19(void) = ReturnVoid :
12502+
# 2125| v2125_20(void) = AliasedUse : m2125_3
12503+
# 2125| v2125_21(void) = ExitFunction :
12504+
12505+
# 2128| void ClassWithDestructor::ClassWithDestructor()
12506+
# 2128| Block 0
12507+
# 2128| v2128_1(void) = EnterFunction :
12508+
# 2128| m2128_2(unknown) = AliasedDefinition :
12509+
# 2128| m2128_3(unknown) = InitializeNonLocal :
12510+
# 2128| m2128_4(unknown) = Chi : total:m2128_2, partial:m2128_3
12511+
# 2128| r2128_5(glval<unknown>) = VariableAddress[#this] :
12512+
# 2128| m2128_6(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2128_5
12513+
# 2128| r2128_7(glval<ClassWithDestructor>) = Load[#this] : &:r2128_5, m2128_6
12514+
# 2128| m2128_8(ClassWithDestructor) = InitializeIndirection[#this] : &:r2128_7
12515+
# 2128| r2128_9(glval<unknown>) = FunctionAddress[operator new] :
12516+
# 2128| r2128_10(unsigned long) = Constant[1] :
12517+
# 2128| r2128_11(void *) = Call[operator new] : func:r2128_9, 0:r2128_10
12518+
# 2128| m2128_12(unknown) = ^CallSideEffect : ~m2128_4
12519+
# 2128| m2128_13(unknown) = Chi : total:m2128_4, partial:m2128_12
12520+
# 2128| m2128_14(unknown) = ^InitializeDynamicAllocation : &:r2128_11
12521+
# 2128| r2128_15(char *) = Convert : r2128_11
12522+
# 2128| r2128_16(glval<unknown>) = VariableAddress[#this] :
12523+
# 2128| r2128_17(ClassWithDestructor *) = Load[#this] : &:r2128_16, m2128_6
12524+
# 2128| r2128_18(glval<char *>) = FieldAddress[x] : r2128_17
12525+
# 2128| m2128_19(char *) = Store[?] : &:r2128_18, r2128_15
12526+
# 2128| m2128_20(unknown) = Chi : total:m2128_8, partial:m2128_19
12527+
# 2128| v2128_21(void) = NoOp :
12528+
# 2128| v2128_22(void) = ReturnIndirection[#this] : &:r2128_7, m2128_20
12529+
# 2128| v2128_23(void) = ReturnVoid :
12530+
# 2128| v2128_24(void) = AliasedUse : ~m2128_13
12531+
# 2128| v2128_25(void) = ExitFunction :
12532+
12533+
# 2129| void ClassWithDestructor::~ClassWithDestructor()
12534+
# 2129| Block 0
12535+
# 2129| v2129_1(void) = EnterFunction :
12536+
# 2129| m2129_2(unknown) = AliasedDefinition :
12537+
# 2129| m2129_3(unknown) = InitializeNonLocal :
12538+
# 2129| m2129_4(unknown) = Chi : total:m2129_2, partial:m2129_3
12539+
# 2129| r2129_5(glval<unknown>) = VariableAddress[#this] :
12540+
# 2129| m2129_6(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2129_5
12541+
# 2129| r2129_7(glval<ClassWithDestructor>) = Load[#this] : &:r2129_5, m2129_6
12542+
# 2129| m2129_8(ClassWithDestructor) = InitializeIndirection[#this] : &:r2129_7
12543+
# 2129| r2129_9(glval<unknown>) = FunctionAddress[operator delete] :
12544+
# 2129| r2129_10(glval<unknown>) = VariableAddress[#this] :
12545+
# 2129| r2129_11(ClassWithDestructor *) = Load[#this] : &:r2129_10, m2129_6
12546+
# 2129| r2129_12(glval<char *>) = FieldAddress[x] : r2129_11
12547+
# 2129| r2129_13(char *) = Load[?] : &:r2129_12, ~m2129_8
12548+
# 2129| v2129_14(void) = Call[operator delete] : func:r2129_9, 0:r2129_13
12549+
# 2129| m2129_15(unknown) = ^CallSideEffect : ~m2129_4
12550+
# 2129| m2129_16(unknown) = Chi : total:m2129_4, partial:m2129_15
12551+
# 2129| v2129_17(void) = NoOp :
12552+
# 2129| v2129_18(void) = ReturnIndirection[#this] : &:r2129_7, m2129_8
12553+
# 2129| v2129_19(void) = ReturnVoid :
12554+
# 2129| v2129_20(void) = AliasedUse : ~m2129_16
12555+
# 2129| v2129_21(void) = ExitFunction :
12556+
12557+
# 2131| void ClassWithDestructor::set_x(char)
12558+
# 2131| Block 0
12559+
# 2131| v2131_1(void) = EnterFunction :
12560+
# 2131| m2131_2(unknown) = AliasedDefinition :
12561+
# 2131| m2131_3(unknown) = InitializeNonLocal :
12562+
# 2131| m2131_4(unknown) = Chi : total:m2131_2, partial:m2131_3
12563+
# 2131| r2131_5(glval<unknown>) = VariableAddress[#this] :
12564+
# 2131| m2131_6(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2131_5
12565+
# 2131| r2131_7(glval<ClassWithDestructor>) = Load[#this] : &:r2131_5, m2131_6
12566+
# 2131| m2131_8(ClassWithDestructor) = InitializeIndirection[#this] : &:r2131_7
12567+
# 2131| r2131_9(glval<char>) = VariableAddress[y] :
12568+
# 2131| m2131_10(char) = InitializeParameter[y] : &:r2131_9
12569+
# 2131| r2131_11(glval<char>) = VariableAddress[y] :
12570+
# 2131| r2131_12(char) = Load[y] : &:r2131_11, m2131_10
12571+
# 2131| r2131_13(glval<unknown>) = VariableAddress[#this] :
12572+
# 2131| r2131_14(ClassWithDestructor *) = Load[#this] : &:r2131_13, m2131_6
12573+
# 2131| r2131_15(glval<char *>) = FieldAddress[x] : r2131_14
12574+
# 2131| r2131_16(char *) = Load[?] : &:r2131_15, ~m2131_8
12575+
# 2131| r2131_17(glval<char>) = CopyValue : r2131_16
12576+
# 2131| m2131_18(char) = Store[?] : &:r2131_17, r2131_12
12577+
# 2131| m2131_19(unknown) = Chi : total:m2131_4, partial:m2131_18
12578+
# 2131| v2131_20(void) = NoOp :
12579+
# 2131| v2131_21(void) = ReturnIndirection[#this] : &:r2131_7, m2131_8
12580+
# 2131| v2131_22(void) = ReturnVoid :
12581+
# 2131| v2131_23(void) = AliasedUse : ~m2131_19
12582+
# 2131| v2131_24(void) = ExitFunction :
12583+
12584+
# 2134| bool initialization_with_destructor_bool
12585+
# 2134| Block 0
12586+
# 2134| v2134_1(void) = EnterFunction :
12587+
# 2134| m2134_2(unknown) = AliasedDefinition :
12588+
# 2134| r2134_3(glval<bool>) = VariableAddress[initialization_with_destructor_bool] :
12589+
# 2134| r2134_4(bool) = Constant[1] :
12590+
# 2134| m2134_5(bool) = Store[initialization_with_destructor_bool] : &:r2134_3, r2134_4
12591+
# 2134| m2134_6(unknown) = Chi : total:m2134_2, partial:m2134_5
12592+
# 2134| v2134_7(void) = ReturnVoid :
12593+
# 2134| v2134_8(void) = AliasedUse : ~m2134_6
12594+
# 2134| v2134_9(void) = ExitFunction :
12595+
12596+
# 2136| void initialization_with_destructor(bool, char)
12597+
# 2136| Block 0
12598+
# 2136| v2136_1(void) = EnterFunction :
12599+
# 2136| m2136_2(unknown) = AliasedDefinition :
12600+
# 2136| m2136_3(unknown) = InitializeNonLocal :
12601+
# 2136| m2136_4(unknown) = Chi : total:m2136_2, partial:m2136_3
12602+
# 2136| r2136_5(glval<bool>) = VariableAddress[b] :
12603+
# 2136| m2136_6(bool) = InitializeParameter[b] : &:r2136_5
12604+
# 2136| r2136_7(glval<char>) = VariableAddress[c] :
12605+
# 2136| m2136_8(char) = InitializeParameter[c] : &:r2136_7
12606+
# 2137| r2137_1(glval<ClassWithDestructor>) = VariableAddress[x] :
12607+
# 2137| m2137_2(ClassWithDestructor) = Uninitialized[x] : &:r2137_1
12608+
# 2137| r2137_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
12609+
# 2137| v2137_4(void) = Call[ClassWithDestructor] : func:r2137_3, this:r2137_1
12610+
# 2137| m2137_5(unknown) = ^CallSideEffect : ~m2136_4
12611+
# 2137| m2137_6(unknown) = Chi : total:m2136_4, partial:m2137_5
12612+
# 2137| m2137_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2137_1
12613+
# 2137| m2137_8(ClassWithDestructor) = Chi : total:m2137_2, partial:m2137_7
12614+
# 2137| r2137_9(glval<bool>) = VariableAddress[b] :
12615+
# 2137| r2137_10(bool) = Load[b] : &:r2137_9, m2136_6
12616+
# 2137| v2137_11(void) = ConditionalBranch : r2137_10
12617+
#-----| True -> Block 1
12618+
12619+
# 2138| Block 1
12620+
# 2138| r2138_1(glval<ClassWithDestructor>) = VariableAddress[x] :
12621+
# 2138| r2138_2(glval<unknown>) = FunctionAddress[set_x] :
12622+
# 2138| r2138_3(char) = Constant[97] :
12623+
# 2138| v2138_4(void) = Call[set_x] : func:r2138_2, this:r2138_1, 0:r2138_3
12624+
# 2138| m2138_5(unknown) = ^CallSideEffect : ~m2137_6
12625+
# 2138| m2138_6(unknown) = Chi : total:m2137_6, partial:m2138_5
12626+
# 2138| v2138_7(void) = ^IndirectReadSideEffect[-1] : &:r2138_1, m2137_8
12627+
# 2138| m2138_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1
12628+
# 2138| m2138_9(ClassWithDestructor) = Chi : total:m2137_8, partial:m2138_8
12629+
1247612630
perf-regression.cpp:
1247712631
# 6| void Big::Big()
1247812632
# 6| Block 0

cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9+
| ir.cpp:2138:9:2138:9 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
910
ambiguousSuccessors
1011
unexplainedLoop
1112
unnecessaryPhiInstruction

cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9+
| ir.cpp:2138:9:2138:9 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
910
ambiguousSuccessors
1011
unexplainedLoop
1112
unnecessaryPhiInstruction

cpp/ql/test/library-tests/ir/ir/ir.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2122,4 +2122,36 @@ void call_as_child_of_ConditionDeclExpr() {
21222122
if(HasOperatorBool b = HasOperatorBool()) {}
21232123
}
21242124

2125+
class ClassWithDestructor {
2126+
char *x;
2127+
public:
2128+
ClassWithDestructor() { x = new char; }
2129+
~ClassWithDestructor() { delete x; }
2130+
2131+
void set_x(char y) { *x = y; }
2132+
};
2133+
2134+
constexpr bool initialization_with_destructor_bool = true;
2135+
2136+
void initialization_with_destructor(bool b, char c) {
2137+
if (ClassWithDestructor x; b)
2138+
x.set_x('a');
2139+
2140+
if constexpr (ClassWithDestructor x; initialization_with_destructor_bool)
2141+
x.set_x('a');
2142+
2143+
switch(ClassWithDestructor x; c) {
2144+
case 'a':
2145+
x.set_x('a');
2146+
break;
2147+
default:
2148+
x.set_x('b');
2149+
break;
2150+
}
2151+
2152+
ClassWithDestructor x;
2153+
for(vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys)
2154+
y.set_x('a');
2155+
}
2156+
21252157
// semmle-extractor-options: -std=c++20 --clang

0 commit comments

Comments
 (0)