From 3fed59fd13a1602bdfdbc5b733dc4f4675069b83 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Sat, 26 Mar 2022 17:44:02 +0100 Subject: [PATCH 1/5] C++: Add more lambda capture IR tests --- .../library-tests/ir/ir/PrintAST.expected | 208 ++++++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 4 + .../aliased_ssa_consistency_unsound.expected | 4 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 22 ++ .../ir/ir/operand_locations.expected | 88 ++++++++ .../ir/ir/raw_consistency.expected | 41 ++++ .../test/library-tests/ir/ir/raw_ir.expected | 177 +++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 4 + ...unaliased_ssa_consistency_unsound.expected | 4 + 9 files changed, 552 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 1baf73e5747..89ddfc480e6 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -13091,6 +13091,214 @@ ir.cpp: # 1696| getExpr(): [VariableAccess] x # 1696| Type = [IntType] int # 1696| ValueCategory = prvalue(load) +# 1699| [CopyAssignmentOperator] TrivialLambdaClass& TrivialLambdaClass::operator=(TrivialLambdaClass const&) +# 1699| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const TrivialLambdaClass & +# 1699| [MoveAssignmentOperator] TrivialLambdaClass& TrivialLambdaClass::operator=(TrivialLambdaClass&&) +# 1699| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] TrivialLambdaClass && +# 1701| [ConstMemberFunction] void TrivialLambdaClass::m() const +# 1701| : +# 1701| getEntryPoint(): [BlockStmt] { ... } +# 1702| getStmt(0): [DeclStmt] declaration +# 1702| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l_m_outer +# 1702| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1702| getVariable().getInitializer(): [Initializer] initializer for l_m_outer +# 1702| getExpr(): [LambdaExpression] [...](...){...} +# 1702| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1702| ValueCategory = prvalue +# 1702| getInitializer(): [ClassAggregateLiteral] {...} +# 1702| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1702| ValueCategory = prvalue +# 1702| getFieldExpr((captured this)): [Literal] Unknown literal +# 1702| Type = [SpecifiedType] const TrivialLambdaClass +# 1702| ValueCategory = prvalue +# 1709| getStmt(1): [ReturnStmt] return ... +# 1702| [CopyAssignmentOperator] (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)& (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator=((void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26) const&) +# 1702| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1702, col. 26 & +# 1702| [CopyConstructor] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::(unnamed constructor)((void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26) const&) +# 1702| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1702, col. 26 & +# 1702| [MoveConstructor] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::(unnamed constructor)((void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)&&) +# 1702| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1702, col. 26 && +# 1702| [Constructor] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::(unnamed constructor)() +# 1702| : +# 1702| [ConstMemberFunction] void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const +# 1702| : +# 1702| getEntryPoint(): [BlockStmt] { ... } +# 1703| getStmt(0): [ExprStmt] ExprStmt +# 1703| getExpr(): [FunctionCall] call to m +# 1703| Type = [VoidType] void +# 1703| ValueCategory = prvalue +# 1703| getQualifier(): [AddressOfExpr] & ... +# 1703| Type = [PointerType] const TrivialLambdaClass * +# 1703| ValueCategory = prvalue +# 1703| getOperand(): [PointerFieldAccess] (captured this) +# 1703| Type = [SpecifiedType] const TrivialLambdaClass +# 1703| ValueCategory = lvalue +# 1703| getQualifier(): [ThisExpr] this +# 1703| Type = [PointerType] const lambda [] type at line 1702, col. 26 * +# 1703| ValueCategory = prvalue(load) +# 1705| getStmt(1): [DeclStmt] declaration +# 1705| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l_m_inner +# 1705| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1705| getVariable().getInitializer(): [Initializer] initializer for l_m_inner +# 1705| getExpr(): [LambdaExpression] [...](...){...} +# 1705| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1705| ValueCategory = prvalue +# 1705| getInitializer(): [ClassAggregateLiteral] {...} +# 1705| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1705| ValueCategory = prvalue +# 1705| getFieldExpr((captured this)): [Literal] Unknown literal +# 1705| Type = [SpecifiedType] const TrivialLambdaClass +# 1705| ValueCategory = prvalue +# 1708| getStmt(2): [ReturnStmt] return ... +# 1705| [CopyAssignmentOperator] (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)& (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator=((void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30) const&) +# 1705| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1705, col. 30 & +# 1705| [CopyConstructor] void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::(unnamed constructor)((void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30) const&) +# 1705| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1705, col. 30 & +# 1705| [MoveConstructor] void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::(unnamed constructor)((void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)&&) +# 1705| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1705, col. 30 && +# 1705| [Constructor] void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::(unnamed constructor)() +# 1705| : +# 1705| [ConstMemberFunction] void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator()() const +# 1705| : +# 1705| getEntryPoint(): [BlockStmt] { ... } +# 1706| getStmt(0): [ExprStmt] ExprStmt +# 1706| getExpr(): [FunctionCall] call to m +# 1706| Type = [VoidType] void +# 1706| ValueCategory = prvalue +# 1706| getQualifier(): [AddressOfExpr] & ... +# 1706| Type = [PointerType] const TrivialLambdaClass * +# 1706| ValueCategory = prvalue +# 1706| getOperand(): [PointerFieldAccess] (captured this) +# 1706| Type = [SpecifiedType] const TrivialLambdaClass +# 1706| ValueCategory = lvalue +# 1706| getQualifier(): [ThisExpr] this +# 1706| Type = [PointerType] const lambda [] type at line 1705, col. 30 * +# 1706| ValueCategory = prvalue(load) +# 1707| getStmt(1): [ReturnStmt] return ... +# 1712| [TopLevelFunction] void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) +# 1712| : +# 1712| getParameter(0): [Parameter] p1 +# 1712| Type = [Class] TrivialLambdaClass +# 1712| getParameter(1): [Parameter] p2 +# 1712| Type = [LValueReferenceType] TrivialLambdaClass & +# 1712| getParameter(2): [Parameter] p3 +# 1712| Type = [RValueReferenceType] TrivialLambdaClass && +# 1712| getEntryPoint(): [BlockStmt] { ... } +# 1713| getStmt(0): [DeclStmt] declaration +# 1713| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l1 +# 1713| Type = [SpecifiedType] const TrivialLambdaClass +# 1714| getStmt(1): [DeclStmt] declaration +# 1714| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l2 +# 1714| Type = [LValueReferenceType] const TrivialLambdaClass & +# 1714| getVariable().getInitializer(): [Initializer] initializer for l2 +# 1714| getExpr(): [Literal] 0 +# 1714| Type = [Class] TrivialLambdaClass +# 1714| Value = [Literal] 0 +# 1714| ValueCategory = prvalue +# 1714| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1714| Type = [LValueReferenceType] const TrivialLambdaClass & +# 1714| ValueCategory = prvalue +# 1714| getExpr(): [CStyleCast] (const TrivialLambdaClass)... +# 1714| Conversion = [GlvalueConversion] glvalue conversion +# 1714| Type = [SpecifiedType] const TrivialLambdaClass +# 1714| ValueCategory = lvalue +# 1714| getExpr(): [TemporaryObjectExpr] temporary object +# 1714| Type = [Class] TrivialLambdaClass +# 1714| ValueCategory = lvalue +# 1714| getExpr(): [TemporaryObjectExpr] temporary object +# 1714| Type = [Class] TrivialLambdaClass +# 1714| ValueCategory = prvalue(load) +# 1716| getStmt(2): [DeclStmt] declaration +# 1716| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l_outer1 +# 1716| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1716| getVariable().getInitializer(): [Initializer] initializer for l_outer1 +# 1716| getExpr(): [LambdaExpression] [...](...){...} +# 1716| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1716| ValueCategory = prvalue +# 1716| getInitializer(): [ClassAggregateLiteral] {...} +# 1716| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1716| ValueCategory = prvalue +# 1716| getFieldExpr(p1): [Literal] Unknown literal +# 1716| Type = [Class] TrivialLambdaClass +# 1716| ValueCategory = prvalue +# 1716| getFieldExpr(p2): [Literal] Unknown literal +# 1716| Type = [Class] TrivialLambdaClass +# 1716| ValueCategory = prvalue +# 1716| getFieldExpr(p3): [Literal] Unknown literal +# 1716| Type = [Class] TrivialLambdaClass +# 1716| ValueCategory = prvalue +# 1716| getFieldExpr(l1): [Literal] Unknown literal +# 1716| Type = [SpecifiedType] const TrivialLambdaClass +# 1716| ValueCategory = prvalue +# 1716| getFieldExpr(l2): [Literal] Unknown literal +# 1716| Type = [SpecifiedType] const TrivialLambdaClass +# 1716| ValueCategory = prvalue +# 1719| getStmt(3): [ReturnStmt] return ... +# 1716| [CopyAssignmentOperator] (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)& (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator=((void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21) const&) +# 1716| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1716, col. 21 & +# 1716| [CopyConstructor] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::(unnamed constructor)((void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21) const&) +# 1716| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1716, col. 21 & +# 1716| [MoveConstructor] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::(unnamed constructor)((void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)&&) +# 1716| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1716, col. 21 && +# 1716| [Constructor] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::(unnamed constructor)() +# 1716| : +# 1716| [ConstMemberFunction] void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const +# 1716| : +# 1716| getEntryPoint(): [BlockStmt] { ... } +# 1717| getStmt(0): [DeclStmt] declaration +# 1717| getDeclarationEntry(0): [VariableDeclarationEntry] definition of l_inner1 +# 1717| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1717| getVariable().getInitializer(): [Initializer] initializer for l_inner1 +# 1717| getExpr(): [LambdaExpression] [...](...){...} +# 1717| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1717| ValueCategory = prvalue +# 1717| getInitializer(): [ClassAggregateLiteral] {...} +# 1717| Type = [Closure,LocalClass] decltype([...](...){...}) +# 1717| ValueCategory = prvalue +# 1717| getFieldExpr(p1): [Literal] Unknown literal +# 1717| Type = [Class] TrivialLambdaClass +# 1717| ValueCategory = prvalue +# 1718| getStmt(1): [ReturnStmt] return ... +# 1717| [CopyAssignmentOperator] (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)& (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator=((void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25) const&) +# 1717| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1717, col. 25 & +# 1717| [CopyConstructor] void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::(unnamed constructor)((void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25) const&) +# 1717| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const lambda [] type at line 1717, col. 25 & +# 1717| [MoveConstructor] void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::(unnamed constructor)((void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)&&) +# 1717| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] lambda [] type at line 1717, col. 25 && +# 1717| [Constructor] void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::(unnamed constructor)() +# 1717| : +# 1717| [ConstMemberFunction] void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator()() const +# 1717| : +# 1717| getEntryPoint(): [BlockStmt] { ... } +# 1717| getStmt(0): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index b131121438c..5cccae1da93 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -8,6 +8,10 @@ sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | | ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | +| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index b131121438c..5cccae1da93 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -8,6 +8,10 @@ sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | | ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | +| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 9cd6cd6befa..80f48d1a6e2 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1696,4 +1696,26 @@ int goto_on_same_line() { return x; } +class TrivialLambdaClass { +public: + void m() const { + auto l_m_outer = [*this] { + m(); + + auto l_m_inner = [*this] { + m(); + }; + }; + }; +}; + +void captured_lambda2(TrivialLambdaClass p1, TrivialLambdaClass &p2, TrivialLambdaClass &&p3) { + const TrivialLambdaClass l1; + const TrivialLambdaClass &l2 = TrivialLambdaClass(); + + auto l_outer1 = [p1, p2, p3, l1, l2] { + auto l_inner1 = [p1] {}; + }; +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 032ee68d7ff..c22981f2f66 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -7713,6 +7713,94 @@ | ir.cpp:1696:10:1696:10 | Address | &:r1696_2 | | ir.cpp:1696:10:1696:10 | Load | m1694_3 | | ir.cpp:1696:10:1696:10 | StoreValue | r1696_3 | +| ir.cpp:1701:10:1701:10 | Address | &:r1701_5 | +| ir.cpp:1701:10:1701:10 | Address | &:r1701_5 | +| ir.cpp:1701:10:1701:10 | Address | &:r1701_7 | +| ir.cpp:1701:10:1701:10 | ChiPartial | partial:m1701_3 | +| ir.cpp:1701:10:1701:10 | ChiTotal | total:m1701_2 | +| ir.cpp:1701:10:1701:10 | Load | m1701_6 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_2 | +| ir.cpp:1702:25:1708:9 | Unary | r1702_2 | +| ir.cpp:1702:34:1702:34 | Address | &:r1702_5 | +| ir.cpp:1702:34:1702:34 | Address | &:r1702_5 | +| ir.cpp:1702:34:1702:34 | Address | &:r1702_7 | +| ir.cpp:1702:34:1702:34 | ChiPartial | partial:m1702_3 | +| ir.cpp:1702:34:1702:34 | ChiTotal | total:m1702_2 | +| ir.cpp:1702:34:1702:34 | Load | m1702_6 | +| ir.cpp:1703:13:1703:13 | Address | &:r1703_1 | +| ir.cpp:1703:13:1703:13 | Address | &:r1703_4 | +| ir.cpp:1703:13:1703:13 | Arg(this) | this:r1703_4 | +| ir.cpp:1703:13:1703:13 | CallTarget | func:r1703_5 | +| ir.cpp:1703:13:1703:13 | ChiPartial | partial:m1703_7 | +| ir.cpp:1703:13:1703:13 | ChiTotal | total:m1702_4 | +| ir.cpp:1703:13:1703:13 | Load | m1702_6 | +| ir.cpp:1703:13:1703:13 | SideEffect | ~m1702_4 | +| ir.cpp:1703:13:1703:13 | SideEffect | ~m1702_8 | +| ir.cpp:1703:13:1703:13 | Unary | r1703_2 | +| ir.cpp:1703:13:1703:13 | Unary | r1703_3 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_2 | +| ir.cpp:1705:29:1707:13 | Unary | r1705_2 | +| ir.cpp:1705:38:1705:38 | Address | &:r1705_5 | +| ir.cpp:1705:38:1705:38 | Address | &:r1705_5 | +| ir.cpp:1705:38:1705:38 | Address | &:r1705_7 | +| ir.cpp:1705:38:1705:38 | Address | &:r1705_7 | +| ir.cpp:1705:38:1705:38 | ChiPartial | partial:m1705_3 | +| ir.cpp:1705:38:1705:38 | ChiTotal | total:m1705_2 | +| ir.cpp:1705:38:1705:38 | Load | m1705_6 | +| ir.cpp:1705:38:1705:38 | SideEffect | m1705_8 | +| ir.cpp:1705:38:1705:38 | SideEffect | ~m1706_8 | +| ir.cpp:1706:17:1706:17 | Address | &:r1706_1 | +| ir.cpp:1706:17:1706:17 | Address | &:r1706_4 | +| ir.cpp:1706:17:1706:17 | Arg(this) | this:r1706_4 | +| ir.cpp:1706:17:1706:17 | CallTarget | func:r1706_5 | +| ir.cpp:1706:17:1706:17 | ChiPartial | partial:m1706_7 | +| ir.cpp:1706:17:1706:17 | ChiTotal | total:m1705_4 | +| ir.cpp:1706:17:1706:17 | Load | m1705_6 | +| ir.cpp:1706:17:1706:17 | SideEffect | ~m1705_4 | +| ir.cpp:1706:17:1706:17 | SideEffect | ~m1705_8 | +| ir.cpp:1706:17:1706:17 | Unary | r1706_2 | +| ir.cpp:1706:17:1706:17 | Unary | r1706_3 | +| ir.cpp:1712:6:1712:21 | ChiPartial | partial:m1712_3 | +| ir.cpp:1712:6:1712:21 | ChiTotal | total:m1712_2 | +| ir.cpp:1712:42:1712:43 | Address | &:r1712_5 | +| ir.cpp:1712:66:1712:67 | Address | &:r1712_7 | +| ir.cpp:1712:66:1712:67 | Address | &:r1712_7 | +| ir.cpp:1712:66:1712:67 | Address | &:r1712_9 | +| ir.cpp:1712:66:1712:67 | Load | m1712_8 | +| ir.cpp:1712:91:1712:92 | Address | &:r1712_11 | +| ir.cpp:1712:91:1712:92 | Address | &:r1712_11 | +| ir.cpp:1712:91:1712:92 | Address | &:r1712_13 | +| ir.cpp:1712:91:1712:92 | Load | m1712_12 | +| ir.cpp:1713:30:1713:31 | Address | &:r1713_1 | +| ir.cpp:1714:31:1714:32 | Address | &:r1714_1 | +| ir.cpp:1714:36:1714:55 | Address | &:r1714_2 | +| ir.cpp:1714:36:1714:55 | Address | &:r1714_3 | +| ir.cpp:1714:36:1714:55 | Address | &:r1714_3 | +| ir.cpp:1714:36:1714:55 | Load | m1714_5 | +| ir.cpp:1714:36:1714:55 | StoreValue | r1714_4 | +| ir.cpp:1714:36:1714:55 | StoreValue | r1714_6 | +| ir.cpp:1714:36:1714:55 | StoreValue | r1714_9 | +| ir.cpp:1714:36:1714:55 | Unary | r1714_2 | +| ir.cpp:1714:36:1714:55 | Unary | r1714_8 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_2 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:42:1716:42 | Address | &:r1716_5 | +| ir.cpp:1716:42:1716:42 | Address | &:r1716_5 | +| ir.cpp:1716:42:1716:42 | Address | &:r1716_7 | +| ir.cpp:1716:42:1716:42 | ChiPartial | partial:m1716_3 | +| ir.cpp:1716:42:1716:42 | ChiTotal | total:m1716_2 | +| ir.cpp:1716:42:1716:42 | Load | m1716_6 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_2 | +| ir.cpp:1717:24:1717:31 | Unary | r1717_2 | +| ir.cpp:1717:30:1717:30 | Address | &:r1717_5 | +| ir.cpp:1717:30:1717:30 | Address | &:r1717_5 | +| ir.cpp:1717:30:1717:30 | Address | &:r1717_7 | +| ir.cpp:1717:30:1717:30 | Address | &:r1717_7 | +| ir.cpp:1717:30:1717:30 | ChiPartial | partial:m1717_3 | +| ir.cpp:1717:30:1717:30 | ChiTotal | total:m1717_2 | +| ir.cpp:1717:30:1717:30 | Load | m1717_6 | +| ir.cpp:1717:30:1717:30 | SideEffect | m1717_3 | +| ir.cpp:1717:30:1717:30 | SideEffect | m1717_8 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | 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 52173741010..9fc44660afa 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -3,6 +3,14 @@ missingOperand | ir.cpp:1688:24:1690:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | | ir.cpp:1689:28:1689:54 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | | ir.cpp:1689:28:1689:54 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | +| ir.cpp:1702:25:1708:9 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1705:29:1707:13 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1717:24:1717:31 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | unexpectedOperand duplicateOperand missingPhiOperand @@ -15,6 +23,14 @@ instructionWithoutSuccessor | ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | | ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | | ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | +| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -45,6 +61,31 @@ useNotDominatedByDefinition | ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | | ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | | ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | +| ir.cpp:1701:10:1701:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1702:14:1702:22 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1702:25:1708:9 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1702:25:1708:9 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1702:34:1702:34 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1705:18:1705:26 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1705:29:1707:13 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1705:29:1707:13 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1712:66:1712:67 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1712:91:1712:92 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:10:1716:17 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:20:1718:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1716:42:1716:42 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | +| ir.cpp:1717:14:1717:21 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | +| ir.cpp:1717:24:1717:31 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | +| ir.cpp:1717:24:1717:31 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | 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 e48874895e2..438fb995004 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -8999,6 +8999,183 @@ ir.cpp: # 1693| v1693_6(void) = AliasedUse : ~m? # 1693| v1693_7(void) = ExitFunction : +# 1701| void TrivialLambdaClass::m() const +# 1701| Block 0 +# 1701| v1701_1(void) = EnterFunction : +# 1701| mu1701_2(unknown) = AliasedDefinition : +# 1701| mu1701_3(unknown) = InitializeNonLocal : +# 1701| r1701_4(glval) = VariableAddress[#this] : +# 1701| mu1701_5(glval) = InitializeParameter[#this] : &:r1701_4 +# 1701| r1701_6(glval) = Load[#this] : &:r1701_4, ~m? +# 1701| mu1701_7(TrivialLambdaClass) = InitializeIndirection[#this] : &:r1701_6 +# 1702| r1702_1(glval) = VariableAddress[l_m_outer] : +# 1702| r1702_2(glval) = VariableAddress[#temp1702:25] : +# 1702| mu1702_3(decltype([...](...){...})) = Uninitialized[#temp1702:25] : &:r1702_2 +# 1702| r1702_4(glval) = FieldAddress[(captured this)] : r1702_2 + +# 1702| Block 1 +# 1702| mu1702_5(TrivialLambdaClass) = Store[?] : &:r1702_4 +# 1702| r1702_6(decltype([...](...){...})) = Load[#temp1702:25] : &:r1702_2, ~m? +# 1702| mu1702_7(decltype([...](...){...})) = Store[l_m_outer] : &:r1702_1, r1702_6 +# 1709| v1709_1(void) = NoOp : +# 1701| v1701_8(void) = ReturnIndirection[#this] : &:r1701_6, ~m? +# 1701| v1701_9(void) = ReturnVoid : +# 1701| v1701_10(void) = AliasedUse : ~m? +# 1701| v1701_11(void) = ExitFunction : + +# 1702| void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const +# 1702| Block 0 +# 1702| v1702_1(void) = EnterFunction : +# 1702| mu1702_2(unknown) = AliasedDefinition : +# 1702| mu1702_3(unknown) = InitializeNonLocal : +# 1702| r1702_4(glval) = VariableAddress[#this] : +# 1702| mu1702_5(glval) = InitializeParameter[#this] : &:r1702_4 +# 1702| r1702_6(glval) = Load[#this] : &:r1702_4, ~m? +# 1702| mu1702_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1702_6 +# 1703| r1703_1(glval) = VariableAddress[#this] : +# 1703| r1703_2(lambda [] type at line 1702, col. 26 *) = Load[#this] : &:r1703_1, ~m? +# 1703| r1703_3(glval) = FieldAddress[(captured this)] : r1703_2 +# 1703| r1703_4(TrivialLambdaClass *) = CopyValue : r1703_3 +# 1703| r1703_5(glval) = FunctionAddress[m] : +# 1703| v1703_6(void) = Call[m] : func:r1703_5, this:r1703_4 +# 1703| mu1703_7(unknown) = ^CallSideEffect : ~m? +# 1703| v1703_8(void) = ^IndirectReadSideEffect[-1] : &:r1703_4, ~m? +# 1705| r1705_1(glval) = VariableAddress[l_m_inner] : +# 1705| r1705_2(glval) = VariableAddress[#temp1705:29] : +# 1705| mu1705_3(decltype([...](...){...})) = Uninitialized[#temp1705:29] : &:r1705_2 +# 1705| r1705_4(glval) = FieldAddress[(captured this)] : r1705_2 + +# 1705| Block 1 +# 1705| mu1705_5(TrivialLambdaClass) = Store[?] : &:r1705_4 +# 1705| r1705_6(decltype([...](...){...})) = Load[#temp1705:29] : &:r1705_2, ~m? +# 1705| mu1705_7(decltype([...](...){...})) = Store[l_m_inner] : &:r1705_1, r1705_6 +# 1708| v1708_1(void) = NoOp : +# 1702| v1702_8(void) = ReturnIndirection[#this] : &:r1702_6, ~m? +# 1702| v1702_9(void) = ReturnVoid : +# 1702| v1702_10(void) = AliasedUse : ~m? +# 1702| v1702_11(void) = ExitFunction : + +# 1705| void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator()() const +# 1705| Block 0 +# 1705| v1705_1(void) = EnterFunction : +# 1705| mu1705_2(unknown) = AliasedDefinition : +# 1705| mu1705_3(unknown) = InitializeNonLocal : +# 1705| r1705_4(glval) = VariableAddress[#this] : +# 1705| mu1705_5(glval) = InitializeParameter[#this] : &:r1705_4 +# 1705| r1705_6(glval) = Load[#this] : &:r1705_4, ~m? +# 1705| mu1705_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1705_6 +# 1706| r1706_1(glval) = VariableAddress[#this] : +# 1706| r1706_2(lambda [] type at line 1705, col. 30 *) = Load[#this] : &:r1706_1, ~m? +# 1706| r1706_3(glval) = FieldAddress[(captured this)] : r1706_2 +# 1706| r1706_4(TrivialLambdaClass *) = CopyValue : r1706_3 +# 1706| r1706_5(glval) = FunctionAddress[m] : +# 1706| v1706_6(void) = Call[m] : func:r1706_5, this:r1706_4 +# 1706| mu1706_7(unknown) = ^CallSideEffect : ~m? +# 1706| v1706_8(void) = ^IndirectReadSideEffect[-1] : &:r1706_4, ~m? +# 1707| v1707_1(void) = NoOp : +# 1705| v1705_8(void) = ReturnIndirection[#this] : &:r1705_6, ~m? +# 1705| v1705_9(void) = ReturnVoid : +# 1705| v1705_10(void) = AliasedUse : ~m? +# 1705| v1705_11(void) = ExitFunction : + +# 1712| void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) +# 1712| Block 0 +# 1712| v1712_1(void) = EnterFunction : +# 1712| mu1712_2(unknown) = AliasedDefinition : +# 1712| mu1712_3(unknown) = InitializeNonLocal : +# 1712| r1712_4(glval) = VariableAddress[p1] : +# 1712| mu1712_5(TrivialLambdaClass) = InitializeParameter[p1] : &:r1712_4 +# 1712| r1712_6(glval) = VariableAddress[p2] : +# 1712| mu1712_7(TrivialLambdaClass &) = InitializeParameter[p2] : &:r1712_6 +# 1712| r1712_8(TrivialLambdaClass &) = Load[p2] : &:r1712_6, ~m? +# 1712| mu1712_9(unknown) = InitializeIndirection[p2] : &:r1712_8 +# 1712| r1712_10(glval) = VariableAddress[p3] : +# 1712| mu1712_11(TrivialLambdaClass &&) = InitializeParameter[p3] : &:r1712_10 +# 1712| r1712_12(TrivialLambdaClass &&) = Load[p3] : &:r1712_10, ~m? +# 1712| mu1712_13(unknown) = InitializeIndirection[p3] : &:r1712_12 +# 1713| r1713_1(glval) = VariableAddress[l1] : +# 1713| mu1713_2(TrivialLambdaClass) = Uninitialized[l1] : &:r1713_1 +# 1714| r1714_1(glval) = VariableAddress[l2] : +# 1714| r1714_2(glval) = VariableAddress[#temp1714:36] : +# 1714| r1714_3(glval) = VariableAddress[#temp1714:36] : +# 1714| r1714_4(TrivialLambdaClass) = Constant[0] : +# 1714| mu1714_5(TrivialLambdaClass) = Store[#temp1714:36] : &:r1714_3, r1714_4 +# 1714| r1714_6(TrivialLambdaClass) = Load[#temp1714:36] : &:r1714_3, ~m? +# 1714| mu1714_7(TrivialLambdaClass) = Store[#temp1714:36] : &:r1714_2, r1714_6 +# 1714| r1714_8(glval) = Convert : r1714_2 +# 1714| r1714_9(TrivialLambdaClass &) = CopyValue : r1714_8 +# 1714| mu1714_10(TrivialLambdaClass &) = Store[l2] : &:r1714_1, r1714_9 +# 1716| r1716_1(glval) = VariableAddress[l_outer1] : +# 1716| r1716_2(glval) = VariableAddress[#temp1716:20] : +# 1716| mu1716_3(decltype([...](...){...})) = Uninitialized[#temp1716:20] : &:r1716_2 +# 1716| r1716_4(glval) = FieldAddress[p1] : r1716_2 + +# 1716| Block 1 +# 1716| mu1716_5(TrivialLambdaClass) = Store[?] : &:r1716_4 +# 1716| r1716_6(glval) = FieldAddress[p2] : r1716_2 + +# 1716| Block 2 +# 1716| mu1716_7(TrivialLambdaClass) = Store[?] : &:r1716_6 +# 1716| r1716_8(glval) = FieldAddress[p3] : r1716_2 + +# 1716| Block 3 +# 1716| mu1716_9(TrivialLambdaClass) = Store[?] : &:r1716_8 +# 1716| r1716_10(glval) = FieldAddress[l1] : r1716_2 + +# 1716| Block 4 +# 1716| mu1716_11(TrivialLambdaClass) = Store[?] : &:r1716_10 +# 1716| r1716_12(glval) = FieldAddress[l2] : r1716_2 + +# 1716| Block 5 +# 1716| mu1716_13(TrivialLambdaClass) = Store[?] : &:r1716_12 +# 1716| r1716_14(decltype([...](...){...})) = Load[#temp1716:20] : &:r1716_2, ~m? +# 1716| mu1716_15(decltype([...](...){...})) = Store[l_outer1] : &:r1716_1, r1716_14 +# 1719| v1719_1(void) = NoOp : +# 1712| v1712_14(void) = ReturnIndirection[p2] : &:r1712_8, ~m? +# 1712| v1712_15(void) = ReturnIndirection[p3] : &:r1712_12, ~m? +# 1712| v1712_16(void) = ReturnVoid : +# 1712| v1712_17(void) = AliasedUse : ~m? +# 1712| v1712_18(void) = ExitFunction : + +# 1716| void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const +# 1716| Block 0 +# 1716| v1716_1(void) = EnterFunction : +# 1716| mu1716_2(unknown) = AliasedDefinition : +# 1716| mu1716_3(unknown) = InitializeNonLocal : +# 1716| r1716_4(glval) = VariableAddress[#this] : +# 1716| mu1716_5(glval) = InitializeParameter[#this] : &:r1716_4 +# 1716| r1716_6(glval) = Load[#this] : &:r1716_4, ~m? +# 1716| mu1716_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1716_6 +# 1717| r1717_1(glval) = VariableAddress[l_inner1] : +# 1717| r1717_2(glval) = VariableAddress[#temp1717:24] : +# 1717| mu1717_3(decltype([...](...){...})) = Uninitialized[#temp1717:24] : &:r1717_2 +# 1717| r1717_4(glval) = FieldAddress[p1] : r1717_2 + +# 1717| Block 1 +# 1717| mu1717_5(TrivialLambdaClass) = Store[?] : &:r1717_4 +# 1717| r1717_6(decltype([...](...){...})) = Load[#temp1717:24] : &:r1717_2, ~m? +# 1717| mu1717_7(decltype([...](...){...})) = Store[l_inner1] : &:r1717_1, r1717_6 +# 1718| v1718_1(void) = NoOp : +# 1716| v1716_8(void) = ReturnIndirection[#this] : &:r1716_6, ~m? +# 1716| v1716_9(void) = ReturnVoid : +# 1716| v1716_10(void) = AliasedUse : ~m? +# 1716| v1716_11(void) = ExitFunction : + +# 1717| void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator()() const +# 1717| Block 0 +# 1717| v1717_1(void) = EnterFunction : +# 1717| mu1717_2(unknown) = AliasedDefinition : +# 1717| mu1717_3(unknown) = InitializeNonLocal : +# 1717| r1717_4(glval) = VariableAddress[#this] : +# 1717| mu1717_5(glval) = InitializeParameter[#this] : &:r1717_4 +# 1717| r1717_6(glval) = Load[#this] : &:r1717_4, ~m? +# 1717| mu1717_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1717_6 +# 1717| v1717_8(void) = NoOp : +# 1717| v1717_9(void) = ReturnIndirection[#this] : &:r1717_6, ~m? +# 1717| v1717_10(void) = ReturnVoid : +# 1717| v1717_11(void) = AliasedUse : ~m? +# 1717| v1717_12(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index b131121438c..5cccae1da93 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -8,6 +8,10 @@ sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | | ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | +| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index b131121438c..5cccae1da93 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -8,6 +8,10 @@ sideEffectWithoutPrimary instructionWithoutSuccessor | ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | | ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | +| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | +| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | +| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | +| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From 4f49f9d6e1ca1aaff786f9d2b4d25c1eb04c4a4e Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Thu, 24 Mar 2022 23:45:29 +0100 Subject: [PATCH 2/5] C++: Remove exception from `cpp/unused-local-variable` that is no longer needed --- cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql b/cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql index 0d58bc1ef4c..27936223497 100644 --- a/cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql +++ b/cpp/ql/src/Best Practices/Unused Entities/UnusedLocals.ql @@ -58,11 +58,5 @@ where not exists(AsmStmt s | f = s.getEnclosingFunction()) and not v.getAnAttribute().getName() = "unused" and not any(ErrorExpr e).getEnclosingFunction() = f and // unextracted expr may use `v` - not exists( - Literal l // this case can be removed when the `myFunction2( [obj](){} );` test case doesn't depend on this exclusion - | - l.getEnclosingFunction() = f and - not exists(l.getValue()) - ) and not any(ConditionDeclExpr cde).getEnclosingFunction() = f // this case can be removed when the `if (a = b; a)` test case doesn't depend on this exclusion select v, "Variable " + v.getName() + " is not used" From dea510ac959fa91f0f36d4441b57cb4d44bee028 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 25 Mar 2022 13:10:27 +0100 Subject: [PATCH 3/5] C++: Add change note for `cpp/unused-local-variable` changes --- cpp/ql/src/change-notes/2022-03-25-unused-lambda-capture.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/src/change-notes/2022-03-25-unused-lambda-capture.md diff --git a/cpp/ql/src/change-notes/2022-03-25-unused-lambda-capture.md b/cpp/ql/src/change-notes/2022-03-25-unused-lambda-capture.md new file mode 100644 index 00000000000..056cba89670 --- /dev/null +++ b/cpp/ql/src/change-notes/2022-03-25-unused-lambda-capture.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cpp/unused-local-variable` no longer ignores functions that include lambda expressions capturing trivially copyable objects. From 1d51b618d1c7833b61d48abb82fe3f6ae2b2ab09 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Sat, 26 Mar 2022 17:53:00 +0100 Subject: [PATCH 4/5] C++: Update tests for handling op bitwise copy in lambda captures --- .../library-tests/ir/ir/PrintAST.expected | 83 +++-- .../ir/ir/aliased_ssa_consistency.expected | 6 - .../aliased_ssa_consistency_unsound.expected | 6 - .../ir/ir/operand_locations.expected | 195 ++++++++++++ .../ir/ir/raw_consistency.expected | 68 ---- .../test/library-tests/ir/ir/raw_ir.expected | 293 +++++++++--------- .../ir/ir/unaliased_ssa_consistency.expected | 6 - ...unaliased_ssa_consistency_unsound.expected | 6 - 8 files changed, 403 insertions(+), 260 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 89ddfc480e6..1984a1635ea 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -12981,12 +12981,12 @@ ir.cpp: # 1688| getInitializer(): [ClassAggregateLiteral] {...} # 1688| Type = [Closure,LocalClass] decltype([...](...){...}) # 1688| ValueCategory = prvalue -# 1688| getFieldExpr(obj1): [Literal] Unknown literal -# 1688| Type = [SpecifiedType] const CapturedLambdaMyObj -# 1688| ValueCategory = prvalue -# 1688| getFieldExpr(obj2): [Literal] Unknown literal +# 1688| getFieldExpr(obj1): [VariableAccess] obj1 +# 1688| Type = [LValueReferenceType] const CapturedLambdaMyObj & +# 1688| ValueCategory = prvalue(load) +# 1688| getFieldExpr(obj2): [VariableAccess] obj2 # 1688| Type = [Class] CapturedLambdaMyObj -# 1688| ValueCategory = prvalue +# 1688| ValueCategory = prvalue(load) # 1688| getFieldExpr(x): [VariableAccess] x # 1688| Type = [IntType] int # 1688| ValueCategory = prvalue(load) @@ -12996,6 +12996,9 @@ ir.cpp: # 1688| getFieldExpr(z): [VariableAccess] z # 1688| Type = [RValueReferenceType] int && # 1688| ValueCategory = prvalue(load) +#-----| getFieldExpr(obj1).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [SpecifiedType] const CapturedLambdaMyObj +#-----| ValueCategory = prvalue(load) # 1690| getFieldExpr(y).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 1690| Type = [IntType] int # 1690| ValueCategory = prvalue(load) @@ -13030,12 +13033,18 @@ ir.cpp: # 1689| getInitializer(): [ClassAggregateLiteral] {...} # 1689| Type = [Closure,LocalClass] decltype([...](...){...}) # 1689| ValueCategory = prvalue -# 1689| getFieldExpr(obj1): [Literal] Unknown literal +# 1689| getFieldExpr(obj1): [PointerFieldAccess] obj1 # 1689| Type = [SpecifiedType] const CapturedLambdaMyObj -# 1689| ValueCategory = prvalue -# 1689| getFieldExpr(obj2): [Literal] Unknown literal +# 1689| ValueCategory = prvalue(load) +# 1689| getQualifier(): [ThisExpr] this +# 1689| Type = [PointerType] lambda [] type at line 1689, col. 29 * +# 1689| ValueCategory = prvalue(load) +# 1689| getFieldExpr(obj2): [PointerFieldAccess] obj2 # 1689| Type = [Class] CapturedLambdaMyObj -# 1689| ValueCategory = prvalue +# 1689| ValueCategory = prvalue(load) +# 1689| getQualifier(): [ThisExpr] this +# 1689| Type = [PointerType] lambda [] type at line 1689, col. 29 * +# 1689| ValueCategory = prvalue(load) # 1689| getFieldExpr(x): [PointerFieldAccess] x # 1689| Type = [IntType] int # 1689| ValueCategory = prvalue(load) @@ -13112,9 +13121,12 @@ ir.cpp: # 1702| getInitializer(): [ClassAggregateLiteral] {...} # 1702| Type = [Closure,LocalClass] decltype([...](...){...}) # 1702| ValueCategory = prvalue -# 1702| getFieldExpr((captured this)): [Literal] Unknown literal +# 1702| getFieldExpr((captured this)): [PointerDereferenceExpr] * ... # 1702| Type = [SpecifiedType] const TrivialLambdaClass -# 1702| ValueCategory = prvalue +# 1702| ValueCategory = prvalue(load) +# 1702| getOperand(): [ThisExpr] this +# 1702| Type = [SpecifiedType] const TrivialLambdaClass *const +# 1702| ValueCategory = prvalue(load) # 1709| getStmt(1): [ReturnStmt] return ... # 1702| [CopyAssignmentOperator] (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)& (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator=((void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26) const&) # 1702| : @@ -13156,9 +13168,12 @@ ir.cpp: # 1705| getInitializer(): [ClassAggregateLiteral] {...} # 1705| Type = [Closure,LocalClass] decltype([...](...){...}) # 1705| ValueCategory = prvalue -# 1705| getFieldExpr((captured this)): [Literal] Unknown literal +# 1705| getFieldExpr((captured this)): [PointerFieldAccess] (captured this) # 1705| Type = [SpecifiedType] const TrivialLambdaClass -# 1705| ValueCategory = prvalue +# 1705| ValueCategory = prvalue(load) +# 1705| getQualifier(): [ThisExpr] this +# 1705| Type = [PointerType] lambda [] type at line 1705, col. 30 * +# 1705| ValueCategory = prvalue(load) # 1708| getStmt(2): [ReturnStmt] return ... # 1705| [CopyAssignmentOperator] (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)& (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator=((void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30) const&) # 1705| : @@ -13234,21 +13249,30 @@ ir.cpp: # 1716| getInitializer(): [ClassAggregateLiteral] {...} # 1716| Type = [Closure,LocalClass] decltype([...](...){...}) # 1716| ValueCategory = prvalue -# 1716| getFieldExpr(p1): [Literal] Unknown literal +# 1716| getFieldExpr(p1): [VariableAccess] p1 # 1716| Type = [Class] TrivialLambdaClass -# 1716| ValueCategory = prvalue -# 1716| getFieldExpr(p2): [Literal] Unknown literal -# 1716| Type = [Class] TrivialLambdaClass -# 1716| ValueCategory = prvalue -# 1716| getFieldExpr(p3): [Literal] Unknown literal -# 1716| Type = [Class] TrivialLambdaClass -# 1716| ValueCategory = prvalue -# 1716| getFieldExpr(l1): [Literal] Unknown literal +# 1716| ValueCategory = prvalue(load) +# 1716| getFieldExpr(p2): [VariableAccess] p2 +# 1716| Type = [LValueReferenceType] TrivialLambdaClass & +# 1716| ValueCategory = prvalue(load) +# 1716| getFieldExpr(p3): [VariableAccess] p3 +# 1716| Type = [RValueReferenceType] TrivialLambdaClass && +# 1716| ValueCategory = prvalue(load) +# 1716| getFieldExpr(l1): [VariableAccess] l1 # 1716| Type = [SpecifiedType] const TrivialLambdaClass -# 1716| ValueCategory = prvalue -# 1716| getFieldExpr(l2): [Literal] Unknown literal -# 1716| Type = [SpecifiedType] const TrivialLambdaClass -# 1716| ValueCategory = prvalue +# 1716| ValueCategory = prvalue(load) +# 1716| getFieldExpr(l2): [VariableAccess] l2 +# 1716| Type = [LValueReferenceType] const TrivialLambdaClass & +# 1716| ValueCategory = prvalue(load) +#-----| getFieldExpr(p2).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [Class] TrivialLambdaClass +#-----| ValueCategory = prvalue(load) +#-----| getFieldExpr(p3).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [Class] TrivialLambdaClass +#-----| ValueCategory = prvalue(load) +#-----| getFieldExpr(l2).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +#-----| Type = [SpecifiedType] const TrivialLambdaClass +#-----| ValueCategory = prvalue(load) # 1719| getStmt(3): [ReturnStmt] return ... # 1716| [CopyAssignmentOperator] (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)& (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator=((void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21) const&) # 1716| : @@ -13277,9 +13301,12 @@ ir.cpp: # 1717| getInitializer(): [ClassAggregateLiteral] {...} # 1717| Type = [Closure,LocalClass] decltype([...](...){...}) # 1717| ValueCategory = prvalue -# 1717| getFieldExpr(p1): [Literal] Unknown literal +# 1717| getFieldExpr(p1): [PointerFieldAccess] p1 # 1717| Type = [Class] TrivialLambdaClass -# 1717| ValueCategory = prvalue +# 1717| ValueCategory = prvalue(load) +# 1717| getQualifier(): [ThisExpr] this +# 1717| Type = [PointerType] lambda [] type at line 1717, col. 25 * +# 1717| ValueCategory = prvalue(load) # 1718| getStmt(1): [ReturnStmt] return ... # 1717| [CopyAssignmentOperator] (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)& (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator=((void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25) const&) # 1717| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 5cccae1da93..31e5b01229c 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,12 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 5cccae1da93..31e5b01229c 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,12 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index c22981f2f66..0696be7d580 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -716,15 +716,23 @@ | file://:0:0:0:0 | Arg(0) | 0:r0_15 | | file://:0:0:0:0 | CallTarget | func:r0_1 | | file://:0:0:0:0 | ChiPartial | partial:m0_2 | +| file://:0:0:0:0 | ChiPartial | partial:m0_2 | +| file://:0:0:0:0 | ChiPartial | partial:m0_2 | | file://:0:0:0:0 | ChiPartial | partial:m0_3 | | file://:0:0:0:0 | ChiPartial | partial:m0_5 | +| file://:0:0:0:0 | ChiPartial | partial:m0_5 | +| file://:0:0:0:0 | ChiPartial | partial:m0_8 | | file://:0:0:0:0 | ChiPartial | partial:m0_11 | | file://:0:0:0:0 | ChiPartial | partial:m0_11 | +| file://:0:0:0:0 | ChiTotal | total:m0_3 | | file://:0:0:0:0 | ChiTotal | total:m0_4 | | file://:0:0:0:0 | ChiTotal | total:m754_8 | | file://:0:0:0:0 | ChiTotal | total:m763_8 | | file://:0:0:0:0 | ChiTotal | total:m1043_10 | | file://:0:0:0:0 | ChiTotal | total:m1240_4 | +| file://:0:0:0:0 | ChiTotal | total:m1688_3 | +| file://:0:0:0:0 | ChiTotal | total:m1716_8 | +| file://:0:0:0:0 | ChiTotal | total:m1716_19 | | file://:0:0:0:0 | Left | r0_2 | | file://:0:0:0:0 | Left | r0_4 | | file://:0:0:0:0 | Left | r0_7 | @@ -741,7 +749,11 @@ | file://:0:0:0:0 | Load | m763_6 | | file://:0:0:0:0 | Load | m1466_4 | | file://:0:0:0:0 | Load | m1466_4 | +| file://:0:0:0:0 | Load | m1685_9 | +| file://:0:0:0:0 | Load | m1714_7 | | file://:0:0:0:0 | Load | ~m1444_6 | +| file://:0:0:0:0 | Load | ~m1712_10 | +| file://:0:0:0:0 | Load | ~m1712_14 | | file://:0:0:0:0 | Right | r0_3 | | file://:0:0:0:0 | Right | r0_5 | | file://:0:0:0:0 | Right | r0_8 | @@ -776,9 +788,13 @@ | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | +| file://:0:0:0:0 | StoreValue | r0_1 | +| file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_3 | | file://:0:0:0:0 | StoreValue | r0_4 | +| file://:0:0:0:0 | StoreValue | r0_4 | | file://:0:0:0:0 | StoreValue | r0_6 | +| file://:0:0:0:0 | StoreValue | r0_7 | | file://:0:0:0:0 | StoreValue | r0_9 | | file://:0:0:0:0 | StoreValue | r0_13 | | file://:0:0:0:0 | StoreValue | r0_13 | @@ -7652,15 +7668,20 @@ | ir.cpp:1680:5:1680:23 | SideEffect | m1680_8 | | ir.cpp:1683:6:1683:20 | ChiPartial | partial:m1683_3 | | ir.cpp:1683:6:1683:20 | ChiTotal | total:m1683_2 | +| ir.cpp:1683:6:1683:20 | SideEffect | ~m1686_6 | | ir.cpp:1683:26:1683:26 | Address | &:r1683_5 | | ir.cpp:1683:34:1683:34 | Address | &:r1683_7 | | ir.cpp:1683:34:1683:34 | Address | &:r1683_7 | | ir.cpp:1683:34:1683:34 | Address | &:r1683_9 | +| ir.cpp:1683:34:1683:34 | Address | &:r1683_9 | | ir.cpp:1683:34:1683:34 | Load | m1683_8 | +| ir.cpp:1683:34:1683:34 | SideEffect | m1683_10 | | ir.cpp:1683:43:1683:43 | Address | &:r1683_11 | | ir.cpp:1683:43:1683:43 | Address | &:r1683_11 | | ir.cpp:1683:43:1683:43 | Address | &:r1683_13 | +| ir.cpp:1683:43:1683:43 | Address | &:r1683_13 | | ir.cpp:1683:43:1683:43 | Load | m1683_12 | +| ir.cpp:1683:43:1683:43 | SideEffect | m1683_14 | | ir.cpp:1685:17:1685:20 | Address | &:r1685_1 | | ir.cpp:1685:24:1685:44 | Address | &:r1685_2 | | ir.cpp:1685:24:1685:44 | Address | &:r1685_2 | @@ -7683,16 +7704,104 @@ | ir.cpp:1686:16:1686:37 | ChiTotal | total:m1685_7 | | ir.cpp:1686:16:1686:37 | ChiTotal | total:m1686_2 | | ir.cpp:1686:16:1686:37 | SideEffect | ~m1685_7 | +| ir.cpp:1688:10:1688:21 | Address | &:r1688_1 | | ir.cpp:1688:24:1690:5 | Address | &:r1688_2 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_2 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_4 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_5 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_6 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_7 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_8 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_12 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_17 | +| ir.cpp:1688:24:1690:5 | Address | &:r1688_20 | +| ir.cpp:1688:24:1690:5 | ChiPartial | partial:m1688_10 | +| ir.cpp:1688:24:1690:5 | ChiTotal | total:m0_3 | +| ir.cpp:1688:24:1690:5 | Load | m1685_12 | +| ir.cpp:1688:24:1690:5 | Load | m1686_8 | +| ir.cpp:1688:24:1690:5 | Load | m1690_6 | +| ir.cpp:1688:24:1690:5 | StoreValue | r1688_9 | +| ir.cpp:1688:24:1690:5 | StoreValue | r1688_23 | | ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:24:1690:5 | Unary | r1688_2 | +| ir.cpp:1688:38:1688:38 | Address | &:r1688_13 | +| ir.cpp:1688:38:1688:38 | ChiPartial | partial:m1688_15 | +| ir.cpp:1688:38:1688:38 | ChiTotal | total:m1688_11 | +| ir.cpp:1688:38:1688:38 | Load | m1683_6 | +| ir.cpp:1688:38:1688:38 | StoreValue | r1688_14 | +| ir.cpp:1688:41:1688:41 | Address | &:r1688_18 | +| ir.cpp:1688:41:1688:41 | Address | &:r1688_19 | +| ir.cpp:1688:41:1688:41 | Load | m1683_8 | +| ir.cpp:1688:44:1688:44 | Address | &:r1688_21 | +| ir.cpp:1688:44:1688:44 | Address | &:r1688_22 | +| ir.cpp:1688:44:1688:44 | Load | m1683_12 | | ir.cpp:1688:46:1688:46 | Address | &:r1688_5 | | ir.cpp:1688:46:1688:46 | Address | &:r1688_5 | | ir.cpp:1688:46:1688:46 | Address | &:r1688_7 | +| ir.cpp:1688:46:1688:46 | Address | &:r1688_7 | | ir.cpp:1688:46:1688:46 | ChiPartial | partial:m1688_3 | | ir.cpp:1688:46:1688:46 | ChiTotal | total:m1688_2 | | ir.cpp:1688:46:1688:46 | Load | m1688_6 | +| ir.cpp:1688:46:1688:46 | SideEffect | m1688_3 | +| ir.cpp:1688:46:1688:46 | SideEffect | m1688_8 | +| ir.cpp:1689:14:1689:25 | Address | &:r1689_1 | | ir.cpp:1689:28:1689:54 | Address | &:r1689_2 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_2 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_4 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_5 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_7 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_11 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_12 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_14 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_18 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_19 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_21 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_25 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_26 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_28 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_32 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_33 | +| ir.cpp:1689:28:1689:54 | Address | &:r1689_35 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_9 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_16 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_23 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_30 | +| ir.cpp:1689:28:1689:54 | ChiPartial | partial:m1689_37 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_3 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_10 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_17 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_24 | +| ir.cpp:1689:28:1689:54 | ChiTotal | total:m1689_31 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1688_6 | +| ir.cpp:1689:28:1689:54 | Load | m1689_38 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | Load | ~m1688_8 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_8 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_15 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_22 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_29 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_36 | +| ir.cpp:1689:28:1689:54 | StoreValue | r1689_39 | | ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_2 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_6 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_13 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_20 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_27 | +| ir.cpp:1689:28:1689:54 | Unary | r1689_34 | | ir.cpp:1689:50:1689:50 | Address | &:r1689_5 | | ir.cpp:1689:50:1689:50 | Address | &:r1689_5 | | ir.cpp:1689:50:1689:50 | Address | &:r1689_7 | @@ -7702,6 +7811,14 @@ | ir.cpp:1689:50:1689:50 | Load | m1689_6 | | ir.cpp:1689:50:1689:50 | SideEffect | m1689_3 | | ir.cpp:1689:50:1689:50 | SideEffect | m1689_8 | +| ir.cpp:1690:6:1690:6 | ChiPartial | partial:m1690_2 | +| ir.cpp:1690:6:1690:6 | ChiPartial | partial:m1690_5 | +| ir.cpp:1690:6:1690:6 | ChiTotal | total:m1688_16 | +| ir.cpp:1690:6:1690:6 | ChiTotal | total:m1690_3 | +| ir.cpp:1690:6:1690:6 | Load | ~m1683_10 | +| ir.cpp:1690:6:1690:6 | Load | ~m1683_14 | +| ir.cpp:1690:6:1690:6 | StoreValue | r1690_1 | +| ir.cpp:1690:6:1690:6 | StoreValue | r1690_4 | | ir.cpp:1693:5:1693:21 | Address | &:r1693_5 | | ir.cpp:1693:5:1693:21 | ChiPartial | partial:m1693_3 | | ir.cpp:1693:5:1693:21 | ChiTotal | total:m1693_2 | @@ -7716,17 +7833,33 @@ | ir.cpp:1701:10:1701:10 | Address | &:r1701_5 | | ir.cpp:1701:10:1701:10 | Address | &:r1701_5 | | ir.cpp:1701:10:1701:10 | Address | &:r1701_7 | +| ir.cpp:1701:10:1701:10 | Address | &:r1701_7 | | ir.cpp:1701:10:1701:10 | ChiPartial | partial:m1701_3 | | ir.cpp:1701:10:1701:10 | ChiTotal | total:m1701_2 | | ir.cpp:1701:10:1701:10 | Load | m1701_6 | +| ir.cpp:1701:10:1701:10 | SideEffect | m1701_3 | +| ir.cpp:1701:10:1701:10 | SideEffect | m1701_8 | +| ir.cpp:1702:14:1702:22 | Address | &:r1702_1 | | ir.cpp:1702:25:1708:9 | Address | &:r1702_2 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_2 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_4 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_5 | +| ir.cpp:1702:25:1708:9 | Address | &:r1702_6 | +| ir.cpp:1702:25:1708:9 | Load | m1701_6 | +| ir.cpp:1702:25:1708:9 | Load | ~m1701_8 | +| ir.cpp:1702:25:1708:9 | Load | ~m1702_8 | +| ir.cpp:1702:25:1708:9 | StoreValue | r1702_7 | +| ir.cpp:1702:25:1708:9 | StoreValue | r1702_9 | | ir.cpp:1702:25:1708:9 | Unary | r1702_2 | | ir.cpp:1702:34:1702:34 | Address | &:r1702_5 | | ir.cpp:1702:34:1702:34 | Address | &:r1702_5 | | ir.cpp:1702:34:1702:34 | Address | &:r1702_7 | +| ir.cpp:1702:34:1702:34 | Address | &:r1702_7 | | ir.cpp:1702:34:1702:34 | ChiPartial | partial:m1702_3 | | ir.cpp:1702:34:1702:34 | ChiTotal | total:m1702_2 | | ir.cpp:1702:34:1702:34 | Load | m1702_6 | +| ir.cpp:1702:34:1702:34 | SideEffect | m1702_8 | +| ir.cpp:1702:34:1702:34 | SideEffect | ~m1703_8 | | ir.cpp:1703:13:1703:13 | Address | &:r1703_1 | | ir.cpp:1703:13:1703:13 | Address | &:r1703_4 | | ir.cpp:1703:13:1703:13 | Arg(this) | this:r1703_4 | @@ -7738,8 +7871,19 @@ | ir.cpp:1703:13:1703:13 | SideEffect | ~m1702_8 | | ir.cpp:1703:13:1703:13 | Unary | r1703_2 | | ir.cpp:1703:13:1703:13 | Unary | r1703_3 | +| ir.cpp:1705:18:1705:26 | Address | &:r1705_1 | | ir.cpp:1705:29:1707:13 | Address | &:r1705_2 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_2 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_4 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_5 | +| ir.cpp:1705:29:1707:13 | Address | &:r1705_7 | +| ir.cpp:1705:29:1707:13 | Load | m1702_6 | +| ir.cpp:1705:29:1707:13 | Load | ~m1702_8 | +| ir.cpp:1705:29:1707:13 | Load | ~m1705_9 | +| ir.cpp:1705:29:1707:13 | StoreValue | r1705_8 | +| ir.cpp:1705:29:1707:13 | StoreValue | r1705_10 | | ir.cpp:1705:29:1707:13 | Unary | r1705_2 | +| ir.cpp:1705:29:1707:13 | Unary | r1705_6 | | ir.cpp:1705:38:1705:38 | Address | &:r1705_5 | | ir.cpp:1705:38:1705:38 | Address | &:r1705_5 | | ir.cpp:1705:38:1705:38 | Address | &:r1705_7 | @@ -7762,15 +7906,20 @@ | ir.cpp:1706:17:1706:17 | Unary | r1706_3 | | ir.cpp:1712:6:1712:21 | ChiPartial | partial:m1712_3 | | ir.cpp:1712:6:1712:21 | ChiTotal | total:m1712_2 | +| ir.cpp:1712:6:1712:21 | SideEffect | m1712_3 | | ir.cpp:1712:42:1712:43 | Address | &:r1712_5 | | ir.cpp:1712:66:1712:67 | Address | &:r1712_7 | | ir.cpp:1712:66:1712:67 | Address | &:r1712_7 | | ir.cpp:1712:66:1712:67 | Address | &:r1712_9 | +| ir.cpp:1712:66:1712:67 | Address | &:r1712_9 | | ir.cpp:1712:66:1712:67 | Load | m1712_8 | +| ir.cpp:1712:66:1712:67 | SideEffect | m1712_10 | | ir.cpp:1712:91:1712:92 | Address | &:r1712_11 | | ir.cpp:1712:91:1712:92 | Address | &:r1712_11 | | ir.cpp:1712:91:1712:92 | Address | &:r1712_13 | +| ir.cpp:1712:91:1712:92 | Address | &:r1712_13 | | ir.cpp:1712:91:1712:92 | Load | m1712_12 | +| ir.cpp:1712:91:1712:92 | SideEffect | m1712_14 | | ir.cpp:1713:30:1713:31 | Address | &:r1713_1 | | ir.cpp:1714:31:1714:32 | Address | &:r1714_1 | | ir.cpp:1714:36:1714:55 | Address | &:r1714_2 | @@ -7782,16 +7931,62 @@ | ir.cpp:1714:36:1714:55 | StoreValue | r1714_9 | | ir.cpp:1714:36:1714:55 | Unary | r1714_2 | | ir.cpp:1714:36:1714:55 | Unary | r1714_8 | +| ir.cpp:1716:10:1716:17 | Address | &:r1716_1 | | ir.cpp:1716:20:1718:5 | Address | &:r1716_2 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_2 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_4 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_5 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_9 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_10 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_11 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_12 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_13 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_14 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_15 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_16 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_20 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_21 | +| ir.cpp:1716:20:1718:5 | Address | &:r1716_22 | +| ir.cpp:1716:20:1718:5 | ChiPartial | partial:m1716_7 | +| ir.cpp:1716:20:1718:5 | ChiPartial | partial:m1716_18 | +| ir.cpp:1716:20:1718:5 | ChiTotal | total:m0_6 | +| ir.cpp:1716:20:1718:5 | ChiTotal | total:m1716_3 | +| ir.cpp:1716:20:1718:5 | Load | m0_9 | +| ir.cpp:1716:20:1718:5 | Load | m1712_6 | +| ir.cpp:1716:20:1718:5 | Load | m1712_8 | +| ir.cpp:1716:20:1718:5 | Load | m1712_12 | +| ir.cpp:1716:20:1718:5 | Load | m1713_2 | +| ir.cpp:1716:20:1718:5 | Load | m1714_10 | +| ir.cpp:1716:20:1718:5 | StoreValue | r1716_6 | +| ir.cpp:1716:20:1718:5 | StoreValue | r1716_17 | +| ir.cpp:1716:20:1718:5 | StoreValue | r1716_23 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | +| ir.cpp:1716:20:1718:5 | Unary | r1716_2 | | ir.cpp:1716:20:1718:5 | Unary | r1716_2 | | ir.cpp:1716:42:1716:42 | Address | &:r1716_5 | | ir.cpp:1716:42:1716:42 | Address | &:r1716_5 | | ir.cpp:1716:42:1716:42 | Address | &:r1716_7 | +| ir.cpp:1716:42:1716:42 | Address | &:r1716_7 | | ir.cpp:1716:42:1716:42 | ChiPartial | partial:m1716_3 | | ir.cpp:1716:42:1716:42 | ChiTotal | total:m1716_2 | | ir.cpp:1716:42:1716:42 | Load | m1716_6 | +| ir.cpp:1716:42:1716:42 | SideEffect | m1716_3 | +| ir.cpp:1716:42:1716:42 | SideEffect | m1716_8 | +| ir.cpp:1717:14:1717:21 | Address | &:r1717_1 | | ir.cpp:1717:24:1717:31 | Address | &:r1717_2 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_2 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_4 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_5 | +| ir.cpp:1717:24:1717:31 | Address | &:r1717_7 | +| ir.cpp:1717:24:1717:31 | Load | m1716_6 | +| ir.cpp:1717:24:1717:31 | Load | ~m1716_8 | +| ir.cpp:1717:24:1717:31 | Load | ~m1717_9 | +| ir.cpp:1717:24:1717:31 | StoreValue | r1717_8 | +| ir.cpp:1717:24:1717:31 | StoreValue | r1717_10 | | ir.cpp:1717:24:1717:31 | Unary | r1717_2 | +| ir.cpp:1717:24:1717:31 | Unary | r1717_6 | | ir.cpp:1717:30:1717:30 | Address | &:r1717_5 | | ir.cpp:1717:30:1717:30 | Address | &:r1717_5 | | ir.cpp:1717:30:1717:30 | Address | &:r1717_7 | 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 9fc44660afa..826c3beedf1 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,16 +1,4 @@ missingOperand -| ir.cpp:1688:24:1690:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1689:28:1689:54 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1702:25:1708:9 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1705:29:1707:13 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1717:24:1717:31 | Store: Unknown literal | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | unexpectedOperand duplicateOperand missingPhiOperand @@ -19,18 +7,6 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor | ../../../include/memory.h:68:25:68:33 | CopyValue: (reference to) | Instruction 'CopyValue: (reference to)' has no successors in function '$@'. | ../../../include/memory.h:67:5:67:5 | void std::unique_ptr>::~unique_ptr() | void std::unique_ptr>::~unique_ptr() | -| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -42,50 +18,6 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1486:8:1486:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1486:8:1486:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| ir.cpp:1683:34:1683:34 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1683:43:1683:43 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:10:1688:21 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:24:1690:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1688:46:1688:46 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:14:1689:25 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1689:28:1689:54 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1701:10:1701:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1702:14:1702:22 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1702:25:1708:9 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1702:25:1708:9 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1702:34:1702:34 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1705:18:1705:26 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1705:29:1707:13 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1705:29:1707:13 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1712:66:1712:67 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1712:91:1712:92 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:10:1716:17 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:20:1718:5 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1716:42:1716:42 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | -| ir.cpp:1717:14:1717:21 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | -| ir.cpp:1717:24:1717:31 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | -| ir.cpp:1717:24:1717:31 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | 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 438fb995004..6c1e2964a66 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -8888,81 +8888,86 @@ ir.cpp: # 1688| r1688_2(glval) = VariableAddress[#temp1688:24] : # 1688| mu1688_3(decltype([...](...){...})) = Uninitialized[#temp1688:24] : &:r1688_2 # 1688| r1688_4(glval) = FieldAddress[obj1] : r1688_2 - -# 1688| Block 1 -# 1688| mu1688_5(CapturedLambdaMyObj) = Store[?] : &:r1688_4 -# 1688| r1688_6(glval) = FieldAddress[obj2] : r1688_2 - -# 1688| Block 2 -# 1688| mu1688_7(CapturedLambdaMyObj) = Store[?] : &:r1688_6 -# 1688| r1688_8(glval) = FieldAddress[x] : r1688_2 -# 1688| r1688_9(glval) = VariableAddress[x] : -# 1688| r1688_10(int) = Load[x] : &:r1688_9, ~m? -# 1688| mu1688_11(int) = Store[?] : &:r1688_8, r1688_10 -# 1688| r1688_12(glval) = FieldAddress[y] : r1688_2 -# 1688| r1688_13(glval) = VariableAddress[y] : -# 1688| r1688_14(int &) = Load[y] : &:r1688_13, ~m? -# 1690| r1690_1(int) = Load[?] : &:r1688_14, ~m? -# 1690| mu1690_2(int) = Store[?] : &:r1688_12, r1690_1 -# 1688| r1688_15(glval) = FieldAddress[z] : r1688_2 -# 1688| r1688_16(glval) = VariableAddress[z] : -# 1688| r1688_17(int &&) = Load[z] : &:r1688_16, ~m? -# 1690| r1690_3(int) = Load[?] : &:r1688_17, ~m? -# 1690| mu1690_4(int) = Store[?] : &:r1688_15, r1690_3 -# 1688| r1688_18(decltype([...](...){...})) = Load[#temp1688:24] : &:r1688_2, ~m? -# 1688| mu1688_19(decltype([...](...){...})) = Store[lambda_outer] : &:r1688_1, r1688_18 -# 1691| v1691_1(void) = NoOp : -# 1683| v1683_14(void) = ReturnIndirection[y] : &:r1683_8, ~m? -# 1683| v1683_15(void) = ReturnIndirection[z] : &:r1683_12, ~m? -# 1683| v1683_16(void) = ReturnVoid : -# 1683| v1683_17(void) = AliasedUse : ~m? -# 1683| v1683_18(void) = ExitFunction : +# 1688| r1688_5(glval) = VariableAddress[obj1] : +# 1688| r1688_6(CapturedLambdaMyObj &) = Load[obj1] : &:r1688_5, ~m? +#-----| r0_1(CapturedLambdaMyObj) = Load[?] : &:r1688_6, ~m? +#-----| mu0_2(CapturedLambdaMyObj) = Store[?] : &:r1688_4, r0_1 +# 1688| r1688_7(glval) = FieldAddress[obj2] : r1688_2 +# 1688| r1688_8(glval) = VariableAddress[obj2] : +# 1688| r1688_9(CapturedLambdaMyObj) = Load[obj2] : &:r1688_8, ~m? +# 1688| mu1688_10(CapturedLambdaMyObj) = Store[?] : &:r1688_7, r1688_9 +# 1688| r1688_11(glval) = FieldAddress[x] : r1688_2 +# 1688| r1688_12(glval) = VariableAddress[x] : +# 1688| r1688_13(int) = Load[x] : &:r1688_12, ~m? +# 1688| mu1688_14(int) = Store[?] : &:r1688_11, r1688_13 +# 1688| r1688_15(glval) = FieldAddress[y] : r1688_2 +# 1688| r1688_16(glval) = VariableAddress[y] : +# 1688| r1688_17(int &) = Load[y] : &:r1688_16, ~m? +# 1690| r1690_1(int) = Load[?] : &:r1688_17, ~m? +# 1690| mu1690_2(int) = Store[?] : &:r1688_15, r1690_1 +# 1688| r1688_18(glval) = FieldAddress[z] : r1688_2 +# 1688| r1688_19(glval) = VariableAddress[z] : +# 1688| r1688_20(int &&) = Load[z] : &:r1688_19, ~m? +# 1690| r1690_3(int) = Load[?] : &:r1688_20, ~m? +# 1690| mu1690_4(int) = Store[?] : &:r1688_18, r1690_3 +# 1688| r1688_21(decltype([...](...){...})) = Load[#temp1688:24] : &:r1688_2, ~m? +# 1688| mu1688_22(decltype([...](...){...})) = Store[lambda_outer] : &:r1688_1, r1688_21 +# 1691| v1691_1(void) = NoOp : +# 1683| v1683_14(void) = ReturnIndirection[y] : &:r1683_8, ~m? +# 1683| v1683_15(void) = ReturnIndirection[z] : &:r1683_12, ~m? +# 1683| v1683_16(void) = ReturnVoid : +# 1683| v1683_17(void) = AliasedUse : ~m? +# 1683| v1683_18(void) = ExitFunction : # 1688| void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const # 1688| Block 0 -# 1688| v1688_1(void) = EnterFunction : -# 1688| mu1688_2(unknown) = AliasedDefinition : -# 1688| mu1688_3(unknown) = InitializeNonLocal : -# 1688| r1688_4(glval) = VariableAddress[#this] : -# 1688| mu1688_5(glval) = InitializeParameter[#this] : &:r1688_4 -# 1688| r1688_6(glval) = Load[#this] : &:r1688_4, ~m? -# 1688| mu1688_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1688_6 -# 1689| r1689_1(glval) = VariableAddress[lambda_inner] : -# 1689| r1689_2(glval) = VariableAddress[#temp1689:28] : -# 1689| mu1689_3(decltype([...](...){...})) = Uninitialized[#temp1689:28] : &:r1689_2 -# 1689| r1689_4(glval) = FieldAddress[obj1] : r1689_2 - -# 1689| Block 1 -# 1689| mu1689_5(CapturedLambdaMyObj) = Store[?] : &:r1689_4 -# 1689| r1689_6(glval) = FieldAddress[obj2] : r1689_2 - -# 1689| Block 2 -# 1689| mu1689_7(CapturedLambdaMyObj) = Store[?] : &:r1689_6 -# 1689| r1689_8(glval) = FieldAddress[x] : r1689_2 -# 1689| r1689_9(glval) = VariableAddress[#this] : -# 1689| r1689_10(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_9, ~m? -# 1689| r1689_11(glval) = FieldAddress[x] : r1689_10 -# 1689| r1689_12(int) = Load[?] : &:r1689_11, ~m? -# 1689| mu1689_13(int) = Store[?] : &:r1689_8, r1689_12 -# 1689| r1689_14(glval) = FieldAddress[y] : r1689_2 -# 1689| r1689_15(glval) = VariableAddress[#this] : -# 1689| r1689_16(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_15, ~m? -# 1689| r1689_17(glval) = FieldAddress[y] : r1689_16 -# 1689| r1689_18(int) = Load[?] : &:r1689_17, ~m? -# 1689| mu1689_19(int) = Store[?] : &:r1689_14, r1689_18 -# 1689| r1689_20(glval) = FieldAddress[z] : r1689_2 -# 1689| r1689_21(glval) = VariableAddress[#this] : -# 1689| r1689_22(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_21, ~m? -# 1689| r1689_23(glval) = FieldAddress[z] : r1689_22 -# 1689| r1689_24(int) = Load[?] : &:r1689_23, ~m? -# 1689| mu1689_25(int) = Store[?] : &:r1689_20, r1689_24 -# 1689| r1689_26(decltype([...](...){...})) = Load[#temp1689:28] : &:r1689_2, ~m? -# 1689| mu1689_27(decltype([...](...){...})) = Store[lambda_inner] : &:r1689_1, r1689_26 -# 1690| v1690_1(void) = NoOp : -# 1688| v1688_8(void) = ReturnIndirection[#this] : &:r1688_6, ~m? -# 1688| v1688_9(void) = ReturnVoid : -# 1688| v1688_10(void) = AliasedUse : ~m? -# 1688| v1688_11(void) = ExitFunction : +# 1688| v1688_1(void) = EnterFunction : +# 1688| mu1688_2(unknown) = AliasedDefinition : +# 1688| mu1688_3(unknown) = InitializeNonLocal : +# 1688| r1688_4(glval) = VariableAddress[#this] : +# 1688| mu1688_5(glval) = InitializeParameter[#this] : &:r1688_4 +# 1688| r1688_6(glval) = Load[#this] : &:r1688_4, ~m? +# 1688| mu1688_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1688_6 +# 1689| r1689_1(glval) = VariableAddress[lambda_inner] : +# 1689| r1689_2(glval) = VariableAddress[#temp1689:28] : +# 1689| mu1689_3(decltype([...](...){...})) = Uninitialized[#temp1689:28] : &:r1689_2 +# 1689| r1689_4(glval) = FieldAddress[obj1] : r1689_2 +# 1689| r1689_5(glval) = VariableAddress[#this] : +# 1689| r1689_6(lambda [] type at line 1689, col. 29 *) = Load[#this] : &:r1689_5, ~m? +# 1689| r1689_7(glval) = FieldAddress[obj1] : r1689_6 +# 1689| r1689_8(CapturedLambdaMyObj) = Load[?] : &:r1689_7, ~m? +# 1689| mu1689_9(CapturedLambdaMyObj) = Store[?] : &:r1689_4, r1689_8 +# 1689| r1689_10(glval) = FieldAddress[obj2] : r1689_2 +# 1689| r1689_11(glval) = VariableAddress[#this] : +# 1689| r1689_12(lambda [] type at line 1689, col. 29 *) = Load[#this] : &:r1689_11, ~m? +# 1689| r1689_13(glval) = FieldAddress[obj2] : r1689_12 +# 1689| r1689_14(CapturedLambdaMyObj) = Load[?] : &:r1689_13, ~m? +# 1689| mu1689_15(CapturedLambdaMyObj) = Store[?] : &:r1689_10, r1689_14 +# 1689| r1689_16(glval) = FieldAddress[x] : r1689_2 +# 1689| r1689_17(glval) = VariableAddress[#this] : +# 1689| r1689_18(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_17, ~m? +# 1689| r1689_19(glval) = FieldAddress[x] : r1689_18 +# 1689| r1689_20(int) = Load[?] : &:r1689_19, ~m? +# 1689| mu1689_21(int) = Store[?] : &:r1689_16, r1689_20 +# 1689| r1689_22(glval) = FieldAddress[y] : r1689_2 +# 1689| r1689_23(glval) = VariableAddress[#this] : +# 1689| r1689_24(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_23, ~m? +# 1689| r1689_25(glval) = FieldAddress[y] : r1689_24 +# 1689| r1689_26(int) = Load[?] : &:r1689_25, ~m? +# 1689| mu1689_27(int) = Store[?] : &:r1689_22, r1689_26 +# 1689| r1689_28(glval) = FieldAddress[z] : r1689_2 +# 1689| r1689_29(glval) = VariableAddress[#this] : +# 1689| r1689_30(lambda [] type at line 1688, col. 25 *) = Load[#this] : &:r1689_29, ~m? +# 1689| r1689_31(glval) = FieldAddress[z] : r1689_30 +# 1689| r1689_32(int) = Load[?] : &:r1689_31, ~m? +# 1689| mu1689_33(int) = Store[?] : &:r1689_28, r1689_32 +# 1689| r1689_34(decltype([...](...){...})) = Load[#temp1689:28] : &:r1689_2, ~m? +# 1689| mu1689_35(decltype([...](...){...})) = Store[lambda_inner] : &:r1689_1, r1689_34 +# 1690| v1690_1(void) = NoOp : +# 1688| v1688_8(void) = ReturnIndirection[#this] : &:r1688_6, ~m? +# 1688| v1688_9(void) = ReturnVoid : +# 1688| v1688_10(void) = AliasedUse : ~m? +# 1688| v1688_11(void) = ExitFunction : # 1689| void (void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const)::(lambda [] type at line 1689, col. 29)::operator()() const # 1689| Block 0 @@ -9012,16 +9017,17 @@ ir.cpp: # 1702| r1702_2(glval) = VariableAddress[#temp1702:25] : # 1702| mu1702_3(decltype([...](...){...})) = Uninitialized[#temp1702:25] : &:r1702_2 # 1702| r1702_4(glval) = FieldAddress[(captured this)] : r1702_2 - -# 1702| Block 1 -# 1702| mu1702_5(TrivialLambdaClass) = Store[?] : &:r1702_4 -# 1702| r1702_6(decltype([...](...){...})) = Load[#temp1702:25] : &:r1702_2, ~m? -# 1702| mu1702_7(decltype([...](...){...})) = Store[l_m_outer] : &:r1702_1, r1702_6 -# 1709| v1709_1(void) = NoOp : -# 1701| v1701_8(void) = ReturnIndirection[#this] : &:r1701_6, ~m? -# 1701| v1701_9(void) = ReturnVoid : -# 1701| v1701_10(void) = AliasedUse : ~m? -# 1701| v1701_11(void) = ExitFunction : +# 1702| r1702_5(glval) = VariableAddress[#this] : +# 1702| r1702_6(TrivialLambdaClass *) = Load[#this] : &:r1702_5, ~m? +# 1702| r1702_7(TrivialLambdaClass) = Load[?] : &:r1702_6, ~m? +# 1702| mu1702_8(TrivialLambdaClass) = Store[?] : &:r1702_4, r1702_7 +# 1702| r1702_9(decltype([...](...){...})) = Load[#temp1702:25] : &:r1702_2, ~m? +# 1702| mu1702_10(decltype([...](...){...})) = Store[l_m_outer] : &:r1702_1, r1702_9 +# 1709| v1709_1(void) = NoOp : +# 1701| v1701_8(void) = ReturnIndirection[#this] : &:r1701_6, ~m? +# 1701| v1701_9(void) = ReturnVoid : +# 1701| v1701_10(void) = AliasedUse : ~m? +# 1701| v1701_11(void) = ExitFunction : # 1702| void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const # 1702| Block 0 @@ -9044,16 +9050,18 @@ ir.cpp: # 1705| r1705_2(glval) = VariableAddress[#temp1705:29] : # 1705| mu1705_3(decltype([...](...){...})) = Uninitialized[#temp1705:29] : &:r1705_2 # 1705| r1705_4(glval) = FieldAddress[(captured this)] : r1705_2 - -# 1705| Block 1 -# 1705| mu1705_5(TrivialLambdaClass) = Store[?] : &:r1705_4 -# 1705| r1705_6(decltype([...](...){...})) = Load[#temp1705:29] : &:r1705_2, ~m? -# 1705| mu1705_7(decltype([...](...){...})) = Store[l_m_inner] : &:r1705_1, r1705_6 -# 1708| v1708_1(void) = NoOp : -# 1702| v1702_8(void) = ReturnIndirection[#this] : &:r1702_6, ~m? -# 1702| v1702_9(void) = ReturnVoid : -# 1702| v1702_10(void) = AliasedUse : ~m? -# 1702| v1702_11(void) = ExitFunction : +# 1705| r1705_5(glval) = VariableAddress[#this] : +# 1705| r1705_6(lambda [] type at line 1705, col. 30 *) = Load[#this] : &:r1705_5, ~m? +# 1705| r1705_7(glval) = FieldAddress[(captured this)] : r1705_6 +# 1705| r1705_8(TrivialLambdaClass) = Load[?] : &:r1705_7, ~m? +# 1705| mu1705_9(TrivialLambdaClass) = Store[?] : &:r1705_4, r1705_8 +# 1705| r1705_10(decltype([...](...){...})) = Load[#temp1705:29] : &:r1705_2, ~m? +# 1705| mu1705_11(decltype([...](...){...})) = Store[l_m_inner] : &:r1705_1, r1705_10 +# 1708| v1708_1(void) = NoOp : +# 1702| v1702_8(void) = ReturnIndirection[#this] : &:r1702_6, ~m? +# 1702| v1702_9(void) = ReturnVoid : +# 1702| v1702_10(void) = AliasedUse : ~m? +# 1702| v1702_11(void) = ExitFunction : # 1705| void (void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const)::(lambda [] type at line 1705, col. 30)::operator()() const # 1705| Block 0 @@ -9109,57 +9117,62 @@ ir.cpp: # 1716| r1716_2(glval) = VariableAddress[#temp1716:20] : # 1716| mu1716_3(decltype([...](...){...})) = Uninitialized[#temp1716:20] : &:r1716_2 # 1716| r1716_4(glval) = FieldAddress[p1] : r1716_2 - -# 1716| Block 1 -# 1716| mu1716_5(TrivialLambdaClass) = Store[?] : &:r1716_4 -# 1716| r1716_6(glval) = FieldAddress[p2] : r1716_2 - -# 1716| Block 2 -# 1716| mu1716_7(TrivialLambdaClass) = Store[?] : &:r1716_6 -# 1716| r1716_8(glval) = FieldAddress[p3] : r1716_2 - -# 1716| Block 3 -# 1716| mu1716_9(TrivialLambdaClass) = Store[?] : &:r1716_8 -# 1716| r1716_10(glval) = FieldAddress[l1] : r1716_2 - -# 1716| Block 4 -# 1716| mu1716_11(TrivialLambdaClass) = Store[?] : &:r1716_10 -# 1716| r1716_12(glval) = FieldAddress[l2] : r1716_2 - -# 1716| Block 5 -# 1716| mu1716_13(TrivialLambdaClass) = Store[?] : &:r1716_12 -# 1716| r1716_14(decltype([...](...){...})) = Load[#temp1716:20] : &:r1716_2, ~m? -# 1716| mu1716_15(decltype([...](...){...})) = Store[l_outer1] : &:r1716_1, r1716_14 -# 1719| v1719_1(void) = NoOp : -# 1712| v1712_14(void) = ReturnIndirection[p2] : &:r1712_8, ~m? -# 1712| v1712_15(void) = ReturnIndirection[p3] : &:r1712_12, ~m? -# 1712| v1712_16(void) = ReturnVoid : -# 1712| v1712_17(void) = AliasedUse : ~m? -# 1712| v1712_18(void) = ExitFunction : +# 1716| r1716_5(glval) = VariableAddress[p1] : +# 1716| r1716_6(TrivialLambdaClass) = Load[p1] : &:r1716_5, ~m? +# 1716| mu1716_7(TrivialLambdaClass) = Store[?] : &:r1716_4, r1716_6 +# 1716| r1716_8(glval) = FieldAddress[p2] : r1716_2 +# 1716| r1716_9(glval) = VariableAddress[p2] : +# 1716| r1716_10(TrivialLambdaClass &) = Load[p2] : &:r1716_9, ~m? +#-----| r0_1(TrivialLambdaClass) = Load[?] : &:r1716_10, ~m? +#-----| mu0_2(TrivialLambdaClass) = Store[?] : &:r1716_8, r0_1 +# 1716| r1716_11(glval) = FieldAddress[p3] : r1716_2 +# 1716| r1716_12(glval) = VariableAddress[p3] : +# 1716| r1716_13(TrivialLambdaClass &&) = Load[p3] : &:r1716_12, ~m? +#-----| r0_3(TrivialLambdaClass) = Load[?] : &:r1716_13, ~m? +#-----| mu0_4(TrivialLambdaClass) = Store[?] : &:r1716_11, r0_3 +# 1716| r1716_14(glval) = FieldAddress[l1] : r1716_2 +# 1716| r1716_15(glval) = VariableAddress[l1] : +# 1716| r1716_16(TrivialLambdaClass) = Load[l1] : &:r1716_15, ~m? +# 1716| mu1716_17(TrivialLambdaClass) = Store[?] : &:r1716_14, r1716_16 +# 1716| r1716_18(glval) = FieldAddress[l2] : r1716_2 +# 1716| r1716_19(glval) = VariableAddress[l2] : +# 1716| r1716_20(TrivialLambdaClass &) = Load[l2] : &:r1716_19, ~m? +#-----| r0_5(TrivialLambdaClass) = Load[?] : &:r1716_20, ~m? +#-----| mu0_6(TrivialLambdaClass) = Store[?] : &:r1716_18, r0_5 +# 1716| r1716_21(decltype([...](...){...})) = Load[#temp1716:20] : &:r1716_2, ~m? +# 1716| mu1716_22(decltype([...](...){...})) = Store[l_outer1] : &:r1716_1, r1716_21 +# 1719| v1719_1(void) = NoOp : +# 1712| v1712_14(void) = ReturnIndirection[p2] : &:r1712_8, ~m? +# 1712| v1712_15(void) = ReturnIndirection[p3] : &:r1712_12, ~m? +# 1712| v1712_16(void) = ReturnVoid : +# 1712| v1712_17(void) = AliasedUse : ~m? +# 1712| v1712_18(void) = ExitFunction : # 1716| void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const # 1716| Block 0 -# 1716| v1716_1(void) = EnterFunction : -# 1716| mu1716_2(unknown) = AliasedDefinition : -# 1716| mu1716_3(unknown) = InitializeNonLocal : -# 1716| r1716_4(glval) = VariableAddress[#this] : -# 1716| mu1716_5(glval) = InitializeParameter[#this] : &:r1716_4 -# 1716| r1716_6(glval) = Load[#this] : &:r1716_4, ~m? -# 1716| mu1716_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1716_6 -# 1717| r1717_1(glval) = VariableAddress[l_inner1] : -# 1717| r1717_2(glval) = VariableAddress[#temp1717:24] : -# 1717| mu1717_3(decltype([...](...){...})) = Uninitialized[#temp1717:24] : &:r1717_2 -# 1717| r1717_4(glval) = FieldAddress[p1] : r1717_2 - -# 1717| Block 1 -# 1717| mu1717_5(TrivialLambdaClass) = Store[?] : &:r1717_4 -# 1717| r1717_6(decltype([...](...){...})) = Load[#temp1717:24] : &:r1717_2, ~m? -# 1717| mu1717_7(decltype([...](...){...})) = Store[l_inner1] : &:r1717_1, r1717_6 -# 1718| v1718_1(void) = NoOp : -# 1716| v1716_8(void) = ReturnIndirection[#this] : &:r1716_6, ~m? -# 1716| v1716_9(void) = ReturnVoid : -# 1716| v1716_10(void) = AliasedUse : ~m? -# 1716| v1716_11(void) = ExitFunction : +# 1716| v1716_1(void) = EnterFunction : +# 1716| mu1716_2(unknown) = AliasedDefinition : +# 1716| mu1716_3(unknown) = InitializeNonLocal : +# 1716| r1716_4(glval) = VariableAddress[#this] : +# 1716| mu1716_5(glval) = InitializeParameter[#this] : &:r1716_4 +# 1716| r1716_6(glval) = Load[#this] : &:r1716_4, ~m? +# 1716| mu1716_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1716_6 +# 1717| r1717_1(glval) = VariableAddress[l_inner1] : +# 1717| r1717_2(glval) = VariableAddress[#temp1717:24] : +# 1717| mu1717_3(decltype([...](...){...})) = Uninitialized[#temp1717:24] : &:r1717_2 +# 1717| r1717_4(glval) = FieldAddress[p1] : r1717_2 +# 1717| r1717_5(glval) = VariableAddress[#this] : +# 1717| r1717_6(lambda [] type at line 1717, col. 25 *) = Load[#this] : &:r1717_5, ~m? +# 1717| r1717_7(glval) = FieldAddress[p1] : r1717_6 +# 1717| r1717_8(TrivialLambdaClass) = Load[?] : &:r1717_7, ~m? +# 1717| mu1717_9(TrivialLambdaClass) = Store[?] : &:r1717_4, r1717_8 +# 1717| r1717_10(decltype([...](...){...})) = Load[#temp1717:24] : &:r1717_2, ~m? +# 1717| mu1717_11(decltype([...](...){...})) = Store[l_inner1] : &:r1717_1, r1717_10 +# 1718| v1718_1(void) = NoOp : +# 1716| v1716_8(void) = ReturnIndirection[#this] : &:r1716_6, ~m? +# 1716| v1716_9(void) = ReturnVoid : +# 1716| v1716_10(void) = AliasedUse : ~m? +# 1716| v1716_11(void) = ExitFunction : # 1717| void (void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const)::(lambda [] type at line 1717, col. 25)::operator()() const # 1717| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 5cccae1da93..31e5b01229c 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,12 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 5cccae1da93..31e5b01229c 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,12 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:1688:24:1690:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1683:6:1683:20 | void captured_lambda(int, int&, int&&) | void captured_lambda(int, int&, int&&) | -| ir.cpp:1689:28:1689:54 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1688:46:1688:46 | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | void (void captured_lambda(int, int&, int&&))::(lambda [] type at line 1688, col. 25)::operator()() const | -| ir.cpp:1702:25:1708:9 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1701:10:1701:10 | void TrivialLambdaClass::m() const | void TrivialLambdaClass::m() const | -| ir.cpp:1705:29:1707:13 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1702:34:1702:34 | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | void (void TrivialLambdaClass::m() const)::(lambda [] type at line 1702, col. 26)::operator()() const | -| ir.cpp:1716:20:1718:5 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1712:6:1712:21 | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&) | -| ir.cpp:1717:24:1717:31 | FieldAddress: {...} | Instruction 'FieldAddress: {...}' has no successors in function '$@'. | ir.cpp:1716:42:1716:42 | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | void (void captured_lambda2(TrivialLambdaClass, TrivialLambdaClass&, TrivialLambdaClass&&))::(lambda [] type at line 1716, col. 21)::operator()() const | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From e1fa58a6f21d86a4ee7842990f25d14314333595 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 29 Mar 2022 11:49:26 +0200 Subject: [PATCH 5/5] C++: Update tests after generating reference conversion --- .../library-tests/ir/ir/PrintAST.expected | 65 +++++-- .../ir/ir/operand_locations.expected | 151 ++++++++------- .../test/library-tests/ir/ir/raw_ir.expected | 177 ++++++++++-------- .../lambdas/captures/elements.expected | 3 + 4 files changed, 232 insertions(+), 164 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 1984a1635ea..99d1d6b4ee6 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -155,21 +155,27 @@ bad_asts.cpp: # 19| getInitializer(0): [ConstructorFieldInit] constructor init of field x # 19| Type = [IntType] int # 19| ValueCategory = prvalue -# 19| getExpr(): [FieldAccess] x +# 19| getExpr(): [ReferenceFieldAccess] x # 19| Type = [IntType] int # 19| ValueCategory = prvalue(load) # 19| getQualifier(): [VariableAccess] (unnamed parameter 0) # 19| Type = [LValueReferenceType] const Point & # 19| ValueCategory = prvalue(load) +# 19| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 19| Type = [SpecifiedType] const Point +# 19| ValueCategory = lvalue # 19| getInitializer(1): [ConstructorFieldInit] constructor init of field y # 19| Type = [IntType] int # 19| ValueCategory = prvalue -# 19| getExpr(): [FieldAccess] y +# 19| getExpr(): [ReferenceFieldAccess] y # 19| Type = [IntType] int # 19| ValueCategory = prvalue(load) # 19| getQualifier(): [VariableAccess] (unnamed parameter 0) # 19| Type = [LValueReferenceType] const Point & # 19| ValueCategory = prvalue(load) +# 19| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 19| Type = [SpecifiedType] const Point +# 19| ValueCategory = lvalue # 19| getEntryPoint(): [BlockStmt] { ... } # 19| getStmt(0): [ReturnStmt] return ... # 19| [MoveConstructor] void Bad::Point::Point(Bad::Point&&) @@ -11651,75 +11657,99 @@ ir.cpp: # 1486| getInitializer(0): [ConstructorFieldInit] constructor init of field i # 1486| Type = [IntType] int # 1486| ValueCategory = prvalue -# 1486| getExpr(): [FieldAccess] i +# 1486| getExpr(): [ReferenceFieldAccess] i # 1486| Type = [IntType] int # 1486| ValueCategory = prvalue(load) # 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue # 1486| getInitializer(1): [ConstructorFieldInit] constructor init of field d # 1486| Type = [DoubleType] double # 1486| ValueCategory = prvalue -# 1486| getExpr(): [FieldAccess] d +# 1486| getExpr(): [ReferenceFieldAccess] d # 1486| Type = [DoubleType] double # 1486| ValueCategory = prvalue(load) # 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue # 1486| getInitializer(2): [ConstructorFieldInit] constructor init of field b # 1486| Type = [IntType] unsigned int # 1486| ValueCategory = prvalue -# 1486| getExpr(): [FieldAccess] b +# 1486| getExpr(): [ReferenceFieldAccess] b # 1486| Type = [IntType] unsigned int # 1486| ValueCategory = prvalue(load) # 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue # 1486| getInitializer(3): [ConstructorFieldInit] constructor init of field r # 1486| Type = [LValueReferenceType] int & # 1486| ValueCategory = prvalue -# 1486| getExpr(): [FieldAccess] r +# 1486| getExpr(): [ReferenceFieldAccess] r # 1486| Type = [LValueReferenceType] int & # 1486| ValueCategory = prvalue(load) # 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue # 1486| getInitializer(4): [ConstructorFieldInit] constructor init of field p # 1486| Type = [IntPointerType] int * # 1486| ValueCategory = prvalue -# 1486| getExpr(): [FieldAccess] p +# 1486| getExpr(): [ReferenceFieldAccess] p # 1486| Type = [IntPointerType] int * # 1486| ValueCategory = prvalue(load) # 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue # 1486| getInitializer(5): [ConstructorFieldInit] constructor init of field xs # 1486| Type = [CTypedefType,NestedTypedefType] ArrayType # 1486| ValueCategory = prvalue -# 1486| getExpr(): [FieldAccess] xs +# 1486| getExpr(): [ReferenceFieldAccess] xs # 1486| Type = [CTypedefType,NestedTypedefType] ArrayType # 1486| ValueCategory = prvalue(load) # 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue # 1486| getInitializer(6): [ConstructorFieldInit] constructor init of field r_alt # 1486| Type = [CTypedefType,NestedTypedefType] RefType # 1486| ValueCategory = prvalue -# 1486| getExpr(): [FieldAccess] r_alt +# 1486| getExpr(): [ReferenceFieldAccess] r_alt # 1486| Type = [CTypedefType,NestedTypedefType] RefType # 1486| ValueCategory = prvalue(load) # 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue # 1486| getInitializer(7): [ConstructorFieldInit] constructor init of field m # 1486| Type = [Struct] StructuredBindingDataMemberMemberStruct # 1486| ValueCategory = prvalue -# 1486| getExpr(): [FieldAccess] m +# 1486| getExpr(): [ReferenceFieldAccess] m # 1486| Type = [Struct] StructuredBindingDataMemberMemberStruct # 1486| ValueCategory = prvalue(load) # 1486| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1486| Type = [LValueReferenceType] const StructuredBindingDataMemberStruct & # 1486| ValueCategory = prvalue(load) +# 1486| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1486| Type = [SpecifiedType] const StructuredBindingDataMemberStruct +# 1486| ValueCategory = lvalue # 1486| getEntryPoint(): [BlockStmt] { ... } # 1486| getStmt(0): [ReturnStmt] return ... # 1486| [MoveConstructor] void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct(StructuredBindingDataMemberStruct&&) @@ -12096,30 +12126,39 @@ ir.cpp: # 1539| getInitializer(0): [ConstructorFieldInit] constructor init of field i # 1539| Type = [IntType] int # 1539| ValueCategory = prvalue -# 1539| getExpr(): [FieldAccess] i +# 1539| getExpr(): [ReferenceFieldAccess] i # 1539| Type = [IntType] int # 1539| ValueCategory = prvalue(load) # 1539| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1539| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & # 1539| ValueCategory = prvalue(load) +# 1539| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1539| Type = [SpecifiedType] const StructuredBindingTupleRefGet +# 1539| ValueCategory = lvalue # 1539| getInitializer(1): [ConstructorFieldInit] constructor init of field d # 1539| Type = [DoubleType] double # 1539| ValueCategory = prvalue -# 1539| getExpr(): [FieldAccess] d +# 1539| getExpr(): [ReferenceFieldAccess] d # 1539| Type = [DoubleType] double # 1539| ValueCategory = prvalue(load) # 1539| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1539| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & # 1539| ValueCategory = prvalue(load) +# 1539| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1539| Type = [SpecifiedType] const StructuredBindingTupleRefGet +# 1539| ValueCategory = lvalue # 1539| getInitializer(2): [ConstructorFieldInit] constructor init of field r # 1539| Type = [LValueReferenceType] int & # 1539| ValueCategory = prvalue -# 1539| getExpr(): [FieldAccess] r +# 1539| getExpr(): [ReferenceFieldAccess] r # 1539| Type = [LValueReferenceType] int & # 1539| ValueCategory = prvalue(load) # 1539| getQualifier(): [VariableAccess] (unnamed parameter 0) # 1539| Type = [LValueReferenceType] const StructuredBindingTupleRefGet & # 1539| ValueCategory = prvalue(load) +# 1539| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1539| Type = [SpecifiedType] const StructuredBindingTupleRefGet +# 1539| ValueCategory = lvalue # 1539| getEntryPoint(): [BlockStmt] { ... } # 1539| getStmt(0): [ReturnStmt] return ... # 1539| [MoveConstructor] void StructuredBindingTupleRefGet::StructuredBindingTupleRefGet(StructuredBindingTupleRefGet&&) diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index 0696be7d580..e9deaf0b49f 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -47,29 +47,31 @@ | bad_asts.cpp:19:10:19:10 | Address | &:r19_7 | | bad_asts.cpp:19:10:19:10 | Address | &:r19_9 | | bad_asts.cpp:19:10:19:10 | Address | &:r19_10 | -| bad_asts.cpp:19:10:19:10 | Address | &:r19_12 | -| bad_asts.cpp:19:10:19:10 | Address | &:r19_16 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_13 | | bad_asts.cpp:19:10:19:10 | Address | &:r19_17 | -| bad_asts.cpp:19:10:19:10 | Address | &:r19_19 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_18 | +| bad_asts.cpp:19:10:19:10 | Address | &:r19_21 | | bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_3 | -| bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_14 | -| bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_21 | +| bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_15 | +| bad_asts.cpp:19:10:19:10 | ChiPartial | partial:m19_23 | | bad_asts.cpp:19:10:19:10 | ChiTotal | total:m19_2 | | bad_asts.cpp:19:10:19:10 | ChiTotal | total:m19_8 | -| bad_asts.cpp:19:10:19:10 | ChiTotal | total:m19_15 | +| bad_asts.cpp:19:10:19:10 | ChiTotal | total:m19_16 | | bad_asts.cpp:19:10:19:10 | Load | m0_2 | | bad_asts.cpp:19:10:19:10 | Load | m0_2 | | bad_asts.cpp:19:10:19:10 | Load | m19_6 | | bad_asts.cpp:19:10:19:10 | Load | ~m0_4 | | bad_asts.cpp:19:10:19:10 | Load | ~m0_4 | | bad_asts.cpp:19:10:19:10 | SideEffect | m19_3 | -| bad_asts.cpp:19:10:19:10 | SideEffect | m19_22 | -| bad_asts.cpp:19:10:19:10 | StoreValue | r19_13 | -| bad_asts.cpp:19:10:19:10 | StoreValue | r19_20 | +| bad_asts.cpp:19:10:19:10 | SideEffect | m19_24 | +| bad_asts.cpp:19:10:19:10 | StoreValue | r19_14 | +| bad_asts.cpp:19:10:19:10 | StoreValue | r19_22 | | bad_asts.cpp:19:10:19:10 | Unary | m19_6 | | bad_asts.cpp:19:10:19:10 | Unary | m19_6 | | bad_asts.cpp:19:10:19:10 | Unary | r19_11 | -| bad_asts.cpp:19:10:19:10 | Unary | r19_18 | +| bad_asts.cpp:19:10:19:10 | Unary | r19_12 | +| bad_asts.cpp:19:10:19:10 | Unary | r19_19 | +| bad_asts.cpp:19:10:19:10 | Unary | r19_20 | | bad_asts.cpp:22:5:22:9 | Address | &:r22_5 | | bad_asts.cpp:22:5:22:9 | Address | &:r22_5 | | bad_asts.cpp:22:5:22:9 | Address | &:r22_7 | @@ -6840,48 +6842,48 @@ | ir.cpp:1486:8:1486:8 | Address | &:r1486_7 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_9 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_10 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_12 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_16 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_13 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_17 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_19 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_23 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_24 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_18 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_21 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_25 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_26 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_30 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_31 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_29 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_33 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_34 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_37 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_38 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_40 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_44 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_41 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_42 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_45 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_47 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_51 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_52 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_54 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_49 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_50 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_53 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_57 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_58 | -| ir.cpp:1486:8:1486:8 | Address | &:r1486_59 | | ir.cpp:1486:8:1486:8 | Address | &:r1486_61 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_65 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_66 | +| ir.cpp:1486:8:1486:8 | Address | &:r1486_69 | | ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_3 | | ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_3 | -| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_14 | -| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_21 | -| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_28 | -| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_35 | -| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_42 | -| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_49 | -| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_56 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_15 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_23 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_31 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_39 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_47 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_55 | | ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_63 | +| ir.cpp:1486:8:1486:8 | ChiPartial | partial:m1486_71 | | ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_2 | | ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_2 | | ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_8 | -| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_15 | -| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_22 | -| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_29 | -| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_36 | -| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_43 | -| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_50 | -| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_57 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_16 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_24 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_32 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_40 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_48 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_56 | +| ir.cpp:1486:8:1486:8 | ChiTotal | total:m1486_64 | | ir.cpp:1486:8:1486:8 | Load | m0_2 | | ir.cpp:1486:8:1486:8 | Load | m0_2 | | ir.cpp:1486:8:1486:8 | Load | m0_2 | @@ -6903,15 +6905,15 @@ | ir.cpp:1486:8:1486:8 | SideEffect | m1486_3 | | ir.cpp:1486:8:1486:8 | SideEffect | m1486_3 | | ir.cpp:1486:8:1486:8 | SideEffect | m1486_8 | -| ir.cpp:1486:8:1486:8 | SideEffect | m1486_64 | -| ir.cpp:1486:8:1486:8 | StoreValue | r1486_13 | -| ir.cpp:1486:8:1486:8 | StoreValue | r1486_20 | -| ir.cpp:1486:8:1486:8 | StoreValue | r1486_27 | -| ir.cpp:1486:8:1486:8 | StoreValue | r1486_34 | -| ir.cpp:1486:8:1486:8 | StoreValue | r1486_41 | -| ir.cpp:1486:8:1486:8 | StoreValue | r1486_48 | -| ir.cpp:1486:8:1486:8 | StoreValue | r1486_55 | +| ir.cpp:1486:8:1486:8 | SideEffect | m1486_72 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_14 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_22 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_30 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_38 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_46 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_54 | | ir.cpp:1486:8:1486:8 | StoreValue | r1486_62 | +| ir.cpp:1486:8:1486:8 | StoreValue | r1486_70 | | ir.cpp:1486:8:1486:8 | Unary | m1486_6 | | ir.cpp:1486:8:1486:8 | Unary | m1486_6 | | ir.cpp:1486:8:1486:8 | Unary | m1486_6 | @@ -6921,13 +6923,21 @@ | ir.cpp:1486:8:1486:8 | Unary | m1486_6 | | ir.cpp:1486:8:1486:8 | Unary | m1486_6 | | ir.cpp:1486:8:1486:8 | Unary | r1486_11 | -| ir.cpp:1486:8:1486:8 | Unary | r1486_18 | -| ir.cpp:1486:8:1486:8 | Unary | r1486_25 | -| ir.cpp:1486:8:1486:8 | Unary | r1486_32 | -| ir.cpp:1486:8:1486:8 | Unary | r1486_39 | -| ir.cpp:1486:8:1486:8 | Unary | r1486_46 | -| ir.cpp:1486:8:1486:8 | Unary | r1486_53 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_12 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_19 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_20 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_27 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_28 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_35 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_36 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_43 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_44 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_51 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_52 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_59 | | ir.cpp:1486:8:1486:8 | Unary | r1486_60 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_67 | +| ir.cpp:1486:8:1486:8 | Unary | r1486_68 | | ir.cpp:1499:6:1499:35 | ChiPartial | partial:m1499_3 | | ir.cpp:1499:6:1499:35 | ChiTotal | total:m1499_2 | | ir.cpp:1499:6:1499:35 | SideEffect | ~m1525_7 | @@ -7108,23 +7118,23 @@ | ir.cpp:1539:8:1539:8 | Address | &:r1539_7 | | ir.cpp:1539:8:1539:8 | Address | &:r1539_9 | | ir.cpp:1539:8:1539:8 | Address | &:r1539_10 | -| ir.cpp:1539:8:1539:8 | Address | &:r1539_12 | -| ir.cpp:1539:8:1539:8 | Address | &:r1539_16 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_13 | | ir.cpp:1539:8:1539:8 | Address | &:r1539_17 | -| ir.cpp:1539:8:1539:8 | Address | &:r1539_19 | -| ir.cpp:1539:8:1539:8 | Address | &:r1539_23 | -| ir.cpp:1539:8:1539:8 | Address | &:r1539_24 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_18 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_21 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_25 | | ir.cpp:1539:8:1539:8 | Address | &:r1539_26 | +| ir.cpp:1539:8:1539:8 | Address | &:r1539_29 | | ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_3 | | ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_3 | -| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_14 | -| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_21 | -| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_28 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_15 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_23 | +| ir.cpp:1539:8:1539:8 | ChiPartial | partial:m1539_31 | | ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_2 | | ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_2 | | ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_8 | -| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_15 | -| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_22 | +| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_16 | +| ir.cpp:1539:8:1539:8 | ChiTotal | total:m1539_24 | | ir.cpp:1539:8:1539:8 | Load | m0_2 | | ir.cpp:1539:8:1539:8 | Load | m0_2 | | ir.cpp:1539:8:1539:8 | Load | m0_2 | @@ -7136,16 +7146,19 @@ | ir.cpp:1539:8:1539:8 | SideEffect | m1539_3 | | ir.cpp:1539:8:1539:8 | SideEffect | m1539_3 | | ir.cpp:1539:8:1539:8 | SideEffect | m1539_8 | -| ir.cpp:1539:8:1539:8 | SideEffect | m1539_29 | -| ir.cpp:1539:8:1539:8 | StoreValue | r1539_13 | -| ir.cpp:1539:8:1539:8 | StoreValue | r1539_20 | -| ir.cpp:1539:8:1539:8 | StoreValue | r1539_27 | +| ir.cpp:1539:8:1539:8 | SideEffect | m1539_32 | +| ir.cpp:1539:8:1539:8 | StoreValue | r1539_14 | +| ir.cpp:1539:8:1539:8 | StoreValue | r1539_22 | +| ir.cpp:1539:8:1539:8 | StoreValue | r1539_30 | | ir.cpp:1539:8:1539:8 | Unary | m1539_6 | | ir.cpp:1539:8:1539:8 | Unary | m1539_6 | | ir.cpp:1539:8:1539:8 | Unary | m1539_6 | | ir.cpp:1539:8:1539:8 | Unary | r1539_11 | -| ir.cpp:1539:8:1539:8 | Unary | r1539_18 | -| ir.cpp:1539:8:1539:8 | Unary | r1539_25 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_12 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_19 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_20 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_27 | +| ir.cpp:1539:8:1539:8 | Unary | r1539_28 | | ir.cpp:1567:60:1567:95 | Address | &:r1567_5 | | ir.cpp:1567:60:1567:95 | Address | &:r1567_5 | | ir.cpp:1567:60:1567:95 | Address | &:r1567_7 | 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 6c1e2964a66..d0ecc9ace66 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -65,21 +65,23 @@ bad_asts.cpp: # 19| r19_8(glval) = FieldAddress[x] : mu19_5 # 19| r19_9(glval) = VariableAddress[(unnamed parameter 0)] : # 19| r19_10(Point &) = Load[(unnamed parameter 0)] : &:r19_9, ~m? -# 19| r19_11(glval) = FieldAddress[x] : r19_10 -# 19| r19_12(int) = Load[?] : &:r19_11, ~m? -# 19| mu19_13(int) = Store[?] : &:r19_8, r19_12 -# 19| r19_14(glval) = FieldAddress[y] : mu19_5 -# 19| r19_15(glval) = VariableAddress[(unnamed parameter 0)] : -# 19| r19_16(Point &) = Load[(unnamed parameter 0)] : &:r19_15, ~m? -# 19| r19_17(glval) = FieldAddress[y] : r19_16 -# 19| r19_18(int) = Load[?] : &:r19_17, ~m? -# 19| mu19_19(int) = Store[?] : &:r19_14, r19_18 -# 19| v19_20(void) = NoOp : -# 19| v19_21(void) = ReturnIndirection[#this] : &:r19_6, ~m? +# 19| r19_11(glval) = CopyValue : r19_10 +# 19| r19_12(glval) = FieldAddress[x] : r19_11 +# 19| r19_13(int) = Load[?] : &:r19_12, ~m? +# 19| mu19_14(int) = Store[?] : &:r19_8, r19_13 +# 19| r19_15(glval) = FieldAddress[y] : mu19_5 +# 19| r19_16(glval) = VariableAddress[(unnamed parameter 0)] : +# 19| r19_17(Point &) = Load[(unnamed parameter 0)] : &:r19_16, ~m? +# 19| r19_18(glval) = CopyValue : r19_17 +# 19| r19_19(glval) = FieldAddress[y] : r19_18 +# 19| r19_20(int) = Load[?] : &:r19_19, ~m? +# 19| mu19_21(int) = Store[?] : &:r19_15, r19_20 +# 19| v19_22(void) = NoOp : +# 19| v19_23(void) = ReturnIndirection[#this] : &:r19_6, ~m? #-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? -# 19| v19_22(void) = ReturnVoid : -# 19| v19_23(void) = AliasedUse : ~m? -# 19| v19_24(void) = ExitFunction : +# 19| v19_24(void) = ReturnVoid : +# 19| v19_25(void) = AliasedUse : ~m? +# 19| v19_26(void) = ExitFunction : # 22| void Bad::Point::Point() # 22| Block 0 @@ -8077,57 +8079,65 @@ ir.cpp: # 1486| r1486_8(glval) = FieldAddress[i] : mu1486_5 # 1486| r1486_9(glval) = VariableAddress[(unnamed parameter 0)] : # 1486| r1486_10(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_9, ~m? -# 1486| r1486_11(glval) = FieldAddress[i] : r1486_10 -# 1486| r1486_12(int) = Load[?] : &:r1486_11, ~m? -# 1486| mu1486_13(int) = Store[?] : &:r1486_8, r1486_12 -# 1486| r1486_14(glval) = FieldAddress[d] : mu1486_5 -# 1486| r1486_15(glval) = VariableAddress[(unnamed parameter 0)] : -# 1486| r1486_16(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_15, ~m? -# 1486| r1486_17(glval) = FieldAddress[d] : r1486_16 -# 1486| r1486_18(double) = Load[?] : &:r1486_17, ~m? -# 1486| mu1486_19(double) = Store[?] : &:r1486_14, r1486_18 -# 1486| r1486_20(glval) = FieldAddress[b] : mu1486_5 -# 1486| r1486_21(glval) = VariableAddress[(unnamed parameter 0)] : -# 1486| r1486_22(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_21, ~m? -# 1486| r1486_23(glval) = FieldAddress[b] : r1486_22 -# 1486| r1486_24(unsigned int) = Load[?] : &:r1486_23, ~m? -# 1486| mu1486_25(unsigned int) = Store[?] : &:r1486_20, r1486_24 -# 1486| r1486_26(glval) = FieldAddress[r] : mu1486_5 -# 1486| r1486_27(glval) = VariableAddress[(unnamed parameter 0)] : -# 1486| r1486_28(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_27, ~m? -# 1486| r1486_29(glval) = FieldAddress[r] : r1486_28 -# 1486| r1486_30(int &) = Load[?] : &:r1486_29, ~m? -# 1486| mu1486_31(int &) = Store[?] : &:r1486_26, r1486_30 -# 1486| r1486_32(glval) = FieldAddress[p] : mu1486_5 -# 1486| r1486_33(glval) = VariableAddress[(unnamed parameter 0)] : -# 1486| r1486_34(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_33, ~m? -# 1486| r1486_35(glval) = FieldAddress[p] : r1486_34 -# 1486| r1486_36(int *) = Load[?] : &:r1486_35, ~m? -# 1486| mu1486_37(int *) = Store[?] : &:r1486_32, r1486_36 -# 1486| r1486_38(glval) = FieldAddress[xs] : mu1486_5 -# 1486| r1486_39(glval) = VariableAddress[(unnamed parameter 0)] : -# 1486| r1486_40(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_39, ~m? -# 1486| r1486_41(glval) = FieldAddress[xs] : r1486_40 -# 1486| r1486_42(int[2]) = Load[?] : &:r1486_41, ~m? -# 1486| mu1486_43(int[2]) = Store[?] : &:r1486_38, r1486_42 -# 1486| r1486_44(glval) = FieldAddress[r_alt] : mu1486_5 -# 1486| r1486_45(glval) = VariableAddress[(unnamed parameter 0)] : -# 1486| r1486_46(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_45, ~m? -# 1486| r1486_47(glval) = FieldAddress[r_alt] : r1486_46 -# 1486| r1486_48(int &) = Load[?] : &:r1486_47, ~m? -# 1486| mu1486_49(int &) = Store[?] : &:r1486_44, r1486_48 -# 1486| r1486_50(glval) = FieldAddress[m] : mu1486_5 +# 1486| r1486_11(glval) = CopyValue : r1486_10 +# 1486| r1486_12(glval) = FieldAddress[i] : r1486_11 +# 1486| r1486_13(int) = Load[?] : &:r1486_12, ~m? +# 1486| mu1486_14(int) = Store[?] : &:r1486_8, r1486_13 +# 1486| r1486_15(glval) = FieldAddress[d] : mu1486_5 +# 1486| r1486_16(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_17(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_16, ~m? +# 1486| r1486_18(glval) = CopyValue : r1486_17 +# 1486| r1486_19(glval) = FieldAddress[d] : r1486_18 +# 1486| r1486_20(double) = Load[?] : &:r1486_19, ~m? +# 1486| mu1486_21(double) = Store[?] : &:r1486_15, r1486_20 +# 1486| r1486_22(glval) = FieldAddress[b] : mu1486_5 +# 1486| r1486_23(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_24(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_23, ~m? +# 1486| r1486_25(glval) = CopyValue : r1486_24 +# 1486| r1486_26(glval) = FieldAddress[b] : r1486_25 +# 1486| r1486_27(unsigned int) = Load[?] : &:r1486_26, ~m? +# 1486| mu1486_28(unsigned int) = Store[?] : &:r1486_22, r1486_27 +# 1486| r1486_29(glval) = FieldAddress[r] : mu1486_5 +# 1486| r1486_30(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_31(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_30, ~m? +# 1486| r1486_32(glval) = CopyValue : r1486_31 +# 1486| r1486_33(glval) = FieldAddress[r] : r1486_32 +# 1486| r1486_34(int &) = Load[?] : &:r1486_33, ~m? +# 1486| mu1486_35(int &) = Store[?] : &:r1486_29, r1486_34 +# 1486| r1486_36(glval) = FieldAddress[p] : mu1486_5 +# 1486| r1486_37(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_38(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_37, ~m? +# 1486| r1486_39(glval) = CopyValue : r1486_38 +# 1486| r1486_40(glval) = FieldAddress[p] : r1486_39 +# 1486| r1486_41(int *) = Load[?] : &:r1486_40, ~m? +# 1486| mu1486_42(int *) = Store[?] : &:r1486_36, r1486_41 +# 1486| r1486_43(glval) = FieldAddress[xs] : mu1486_5 +# 1486| r1486_44(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_45(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_44, ~m? +# 1486| r1486_46(glval) = CopyValue : r1486_45 +# 1486| r1486_47(glval) = FieldAddress[xs] : r1486_46 +# 1486| r1486_48(int[2]) = Load[?] : &:r1486_47, ~m? +# 1486| mu1486_49(int[2]) = Store[?] : &:r1486_43, r1486_48 +# 1486| r1486_50(glval) = FieldAddress[r_alt] : mu1486_5 # 1486| r1486_51(glval) = VariableAddress[(unnamed parameter 0)] : # 1486| r1486_52(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_51, ~m? -# 1486| r1486_53(glval) = FieldAddress[m] : r1486_52 -# 1486| r1486_54(StructuredBindingDataMemberMemberStruct) = Load[?] : &:r1486_53, ~m? -# 1486| mu1486_55(StructuredBindingDataMemberMemberStruct) = Store[?] : &:r1486_50, r1486_54 -# 1486| v1486_56(void) = NoOp : -# 1486| v1486_57(void) = ReturnIndirection[#this] : &:r1486_6, ~m? +# 1486| r1486_53(glval) = CopyValue : r1486_52 +# 1486| r1486_54(glval) = FieldAddress[r_alt] : r1486_53 +# 1486| r1486_55(int &) = Load[?] : &:r1486_54, ~m? +# 1486| mu1486_56(int &) = Store[?] : &:r1486_50, r1486_55 +# 1486| r1486_57(glval) = FieldAddress[m] : mu1486_5 +# 1486| r1486_58(glval) = VariableAddress[(unnamed parameter 0)] : +# 1486| r1486_59(StructuredBindingDataMemberStruct &) = Load[(unnamed parameter 0)] : &:r1486_58, ~m? +# 1486| r1486_60(glval) = CopyValue : r1486_59 +# 1486| r1486_61(glval) = FieldAddress[m] : r1486_60 +# 1486| r1486_62(StructuredBindingDataMemberMemberStruct) = Load[?] : &:r1486_61, ~m? +# 1486| mu1486_63(StructuredBindingDataMemberMemberStruct) = Store[?] : &:r1486_57, r1486_62 +# 1486| v1486_64(void) = NoOp : +# 1486| v1486_65(void) = ReturnIndirection[#this] : &:r1486_6, ~m? #-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? -# 1486| v1486_58(void) = ReturnVoid : -# 1486| v1486_59(void) = AliasedUse : ~m? -# 1486| v1486_60(void) = ExitFunction : +# 1486| v1486_66(void) = ReturnVoid : +# 1486| v1486_67(void) = AliasedUse : ~m? +# 1486| v1486_68(void) = ExitFunction : # 1499| void data_member_structured_binding() # 1499| Block 0 @@ -8325,27 +8335,30 @@ ir.cpp: # 1539| r1539_8(glval) = FieldAddress[i] : mu1539_5 # 1539| r1539_9(glval) = VariableAddress[(unnamed parameter 0)] : # 1539| r1539_10(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_9, ~m? -# 1539| r1539_11(glval) = FieldAddress[i] : r1539_10 -# 1539| r1539_12(int) = Load[?] : &:r1539_11, ~m? -# 1539| mu1539_13(int) = Store[?] : &:r1539_8, r1539_12 -# 1539| r1539_14(glval) = FieldAddress[d] : mu1539_5 -# 1539| r1539_15(glval) = VariableAddress[(unnamed parameter 0)] : -# 1539| r1539_16(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_15, ~m? -# 1539| r1539_17(glval) = FieldAddress[d] : r1539_16 -# 1539| r1539_18(double) = Load[?] : &:r1539_17, ~m? -# 1539| mu1539_19(double) = Store[?] : &:r1539_14, r1539_18 -# 1539| r1539_20(glval) = FieldAddress[r] : mu1539_5 -# 1539| r1539_21(glval) = VariableAddress[(unnamed parameter 0)] : -# 1539| r1539_22(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_21, ~m? -# 1539| r1539_23(glval) = FieldAddress[r] : r1539_22 -# 1539| r1539_24(int &) = Load[?] : &:r1539_23, ~m? -# 1539| mu1539_25(int &) = Store[?] : &:r1539_20, r1539_24 -# 1539| v1539_26(void) = NoOp : -# 1539| v1539_27(void) = ReturnIndirection[#this] : &:r1539_6, ~m? +# 1539| r1539_11(glval) = CopyValue : r1539_10 +# 1539| r1539_12(glval) = FieldAddress[i] : r1539_11 +# 1539| r1539_13(int) = Load[?] : &:r1539_12, ~m? +# 1539| mu1539_14(int) = Store[?] : &:r1539_8, r1539_13 +# 1539| r1539_15(glval) = FieldAddress[d] : mu1539_5 +# 1539| r1539_16(glval) = VariableAddress[(unnamed parameter 0)] : +# 1539| r1539_17(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_16, ~m? +# 1539| r1539_18(glval) = CopyValue : r1539_17 +# 1539| r1539_19(glval) = FieldAddress[d] : r1539_18 +# 1539| r1539_20(double) = Load[?] : &:r1539_19, ~m? +# 1539| mu1539_21(double) = Store[?] : &:r1539_15, r1539_20 +# 1539| r1539_22(glval) = FieldAddress[r] : mu1539_5 +# 1539| r1539_23(glval) = VariableAddress[(unnamed parameter 0)] : +# 1539| r1539_24(StructuredBindingTupleRefGet &) = Load[(unnamed parameter 0)] : &:r1539_23, ~m? +# 1539| r1539_25(glval) = CopyValue : r1539_24 +# 1539| r1539_26(glval) = FieldAddress[r] : r1539_25 +# 1539| r1539_27(int &) = Load[?] : &:r1539_26, ~m? +# 1539| mu1539_28(int &) = Store[?] : &:r1539_22, r1539_27 +# 1539| v1539_29(void) = NoOp : +# 1539| v1539_30(void) = ReturnIndirection[#this] : &:r1539_6, ~m? #-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m? -# 1539| v1539_28(void) = ReturnVoid : -# 1539| v1539_29(void) = AliasedUse : ~m? -# 1539| v1539_30(void) = ExitFunction : +# 1539| v1539_31(void) = ReturnVoid : +# 1539| v1539_32(void) = AliasedUse : ~m? +# 1539| v1539_33(void) = ExitFunction : # 1567| std::tuple_element::type& StructuredBindingTupleRefGet::get() # 1567| Block 0 diff --git a/cpp/ql/test/library-tests/lambdas/captures/elements.expected b/cpp/ql/test/library-tests/lambdas/captures/elements.expected index c2fd3937d9f..04b6192bdba 100644 --- a/cpp/ql/test/library-tests/lambdas/captures/elements.expected +++ b/cpp/ql/test/library-tests/lambdas/captures/elements.expected @@ -122,6 +122,8 @@ | captures.cpp:22:18:24:3 | initializer for myLambda | | captures.cpp:22:18:24:3 | y | | captures.cpp:22:18:24:3 | {...} | +| captures.cpp:22:19:22:19 | (reference dereference) | +| captures.cpp:22:19:22:19 | (reference dereference) | | captures.cpp:22:19:22:19 | (unnamed constructor) | | captures.cpp:22:19:22:19 | (unnamed constructor) | | captures.cpp:22:19:22:19 | (unnamed constructor) | @@ -184,6 +186,7 @@ | end_pos.cpp:9:14:11:5 | [...](...){...} | | end_pos.cpp:9:14:11:5 | initializer for fp | | end_pos.cpp:9:14:11:5 | {...} | +| end_pos.cpp:9:15:9:15 | (reference dereference) | | end_pos.cpp:9:15:9:15 | (unnamed constructor) | | end_pos.cpp:9:15:9:15 | (unnamed constructor) | | end_pos.cpp:9:15:9:15 | (unnamed constructor) |