diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 1546f383d05a..96e4d9137dff 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -160,11 +160,7 @@ class ExprNode extends InstructionNode { * as `x` in `f(x)` and implicit parameters such as `this` in `x.f()` */ class ParameterNode extends InstructionNode { - ParameterNode() { - instr instanceof InitializeParameterInstruction - or - instr instanceof InitializeThisInstruction - } + override InitializeParameterInstruction instr; /** * Holds if this node is the parameter of `c` at the specified (zero-based) @@ -178,7 +174,7 @@ class ParameterNode extends InstructionNode { * flow graph. */ private class ExplicitParameterNode extends ParameterNode { - override InitializeParameterInstruction instr; + ExplicitParameterNode() { exists(instr.getParameter()) } override predicate isParameterOf(Function f, int i) { f.getParameter(i) = instr.getParameter() } @@ -189,7 +185,7 @@ private class ExplicitParameterNode extends ParameterNode { } private class ThisParameterNode extends ParameterNode { - override InitializeThisInstruction instr; + ThisParameterNode() { instr.getIRVariable() instanceof IRThisVariable } override predicate isParameterOf(Function f, int i) { i = -1 and instr.getEnclosingFunction() = f diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll index 0d5e7fe595c7..9f2a0d4ea281 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRVariable.qll @@ -223,6 +223,15 @@ class IREllipsisVariable extends IRTempVariable { final override string toString() { result = "#ellipsis" } } +/** + * A temporary variable generated to hold the `this` pointer. + */ +class IRThisVariable extends IRTempVariable { + IRThisVariable() { tag = ThisTempVar() } + + final override string toString() { result = "#this" } +} + /** * A variable generated to represent the contents of a string literal. This variable acts much like * a read-only global variable. diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll index c19a34fe0532..1612e0065b77 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll @@ -204,7 +204,7 @@ private predicate isArgumentForParameter(CallInstruction ci, Operand operand, In init.(InitializeParameterInstruction).getParameter() = f.getParameter(operand.(PositionalArgumentOperand).getIndex()) or - init instanceof InitializeThisInstruction and + init.(InitializeParameterInstruction).getIRVariable() instanceof IRThisVariable and init.getEnclosingFunction() = f and operand instanceof ThisArgumentOperand ) and diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll index e95086c89fc9..53f9539252a8 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasConfiguration.qll @@ -5,7 +5,7 @@ private import AliasAnalysis private newtype TAllocation = TVariableAllocation(IRVariable var) or - TIndirectParameterAllocation(IRAutomaticUserVariable var) { + TIndirectParameterAllocation(IRAutomaticVariable var) { exists(InitializeIndirectionInstruction instr | instr.getIRVariable() = var) } or TDynamicAllocation(CallInstruction call) { @@ -74,7 +74,7 @@ class VariableAllocation extends Allocation, TVariableAllocation { } class IndirectParameterAllocation extends Allocation, TIndirectParameterAllocation { - IRAutomaticUserVariable var; + IRAutomaticVariable var; IndirectParameterAllocation() { this = TIndirectParameterAllocation(var) } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRVariable.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRVariable.qll index 0d5e7fe595c7..9f2a0d4ea281 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRVariable.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRVariable.qll @@ -223,6 +223,15 @@ class IREllipsisVariable extends IRTempVariable { final override string toString() { result = "#ellipsis" } } +/** + * A temporary variable generated to hold the `this` pointer. + */ +class IRThisVariable extends IRTempVariable { + IRThisVariable() { tag = ThisTempVar() } + + final override string toString() { result = "#this" } +} + /** * A variable generated to represent the contents of a string literal. This variable acts much like * a read-only global variable. diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll index abcf418bd21c..5200da91a55c 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll @@ -35,6 +35,11 @@ private module Cached { getTranslatedFunction(func).hasUserVariable(var, type) } + cached + predicate hasThisVariable(Function func, CppType type) { + type = getTypeForGLValue(getTranslatedFunction(func).getThisType()) + } + cached predicate hasTempVariable(Function func, Locatable ast, TempVariableTag tag, CppType type) { exists(TranslatedElement element | diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll index ffe81ed549c7..122a23b76a09 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll @@ -2,7 +2,6 @@ private import cpp newtype TInstructionTag = OnlyInstructionTag() or // Single instruction (not including implicit Load) - InitializeThisTag() or InitializerVariableAddressTag() or InitializerLoadStringTag() or InitializerStoreTag() or @@ -70,7 +69,9 @@ newtype TInstructionTag = VarArgsMoveNextTag() or VarArgsVAListStoreTag() or AsmTag() or - AsmInputTag(int elementIndex) { exists(AsmStmt asm | exists(asm.getChild(elementIndex))) } + AsmInputTag(int elementIndex) { exists(AsmStmt asm | exists(asm.getChild(elementIndex))) } or + ThisAddressTag() or + ThisLoadTag() class InstructionTag extends TInstructionTag { final string toString() { result = "Tag" } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index eb8cf1326d45..15bb66940ea1 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -400,6 +400,9 @@ newtype TTranslatedElement = TTranslatedConstructorInitList(Function func) { translateFunction(func) } or // A destructor destruction list TTranslatedDestructorDestructionList(Function func) { translateFunction(func) } or + TTranslatedThisParameter(Function func) { + translateFunction(func) and func.isMember() and not func.isStatic() + } or // A function parameter TTranslatedParameter(Parameter param) { exists(Function func | diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index d59581f6dea7..998386d90708 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -664,31 +664,40 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr { final override TranslatedElement getChild(int id) { none() } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { - tag = OnlyInstructionTag() and - opcode instanceof Opcode::CopyValue and + tag = ThisAddressTag() and + opcode instanceof Opcode::VariableAddress and + resultType = getTypeForGLValue(any(UnknownType t)) + or + tag = ThisLoadTag() and + opcode instanceof Opcode::Load and resultType = getResultType() } - final override Instruction getResult() { result = getInstruction(OnlyInstructionTag()) } + final override Instruction getResult() { result = getInstruction(ThisLoadTag()) } - final override Instruction getFirstInstruction() { result = getInstruction(OnlyInstructionTag()) } + final override Instruction getFirstInstruction() { result = getInstruction(ThisAddressTag()) } final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { kind instanceof GotoEdge and - tag = OnlyInstructionTag() and + tag = ThisAddressTag() and + result = getInstruction(ThisLoadTag()) + or + kind instanceof GotoEdge and + tag = ThisLoadTag() and result = getParent().getChildSuccessor(this) } final override Instruction getChildSuccessor(TranslatedElement child) { none() } final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { - tag = OnlyInstructionTag() and - operandTag instanceof UnaryOperandTag and - result = getInitializeThisInstruction() + tag = ThisLoadTag() and + operandTag instanceof AddressOperandTag and + result = getInstruction(ThisAddressTag()) } - private Instruction getInitializeThisInstruction() { - result = getTranslatedFunction(expr.getEnclosingFunction()).getInitializeThisInstruction() + override IRVariable getInstructionVariable(InstructionTag tag) { + tag = ThisAddressTag() and + result = this.getEnclosingFunction().getThisVariable() } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index e0168cf14783..6d34830a0bd4 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -73,15 +73,15 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { final override Function getFunction() { result = func } final override TranslatedElement getChild(int id) { - id = -4 and result = getReadEffects() + id = -5 and result = getReadEffects() or - id = -3 and result = getConstructorInitList() + id = -4 and result = getConstructorInitList() or - id = -2 and result = getBody() + id = -3 and result = getBody() or - id = -1 and result = getDestructorDestructionList() + id = -2 and result = getDestructorDestructionList() or - id >= 0 and result = getParameter(id) + id >= -1 and result = getParameter(id) } final private TranslatedConstructorInitList getConstructorInitList() { @@ -97,6 +97,9 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { final private TranslatedReadEffects getReadEffects() { result = getTranslatedReadEffects(func) } final private TranslatedParameter getParameter(int index) { + result = getTranslatedThisParameter(func) and + index = -1 + or result = getTranslatedParameter(func.getParameter(index)) or index = getEllipsisParameterIndexForFunction(func) and @@ -117,20 +120,13 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { ( tag = InitializeNonLocalTag() and if exists(getThisType()) - then result = getInstruction(InitializeThisTag()) + then result = getParameter(-1).getFirstInstruction() else if exists(getParameter(0)) then result = getParameter(0).getFirstInstruction() else result = getBody().getFirstInstruction() ) or - ( - tag = InitializeThisTag() and - if exists(getParameter(0)) - then result = getParameter(0).getFirstInstruction() - else result = getConstructorInitList().getFirstInstruction() - ) - or tag = ReturnValueAddressTag() and result = getInstruction(ReturnTag()) or @@ -184,10 +180,6 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { opcode instanceof Opcode::InitializeNonLocal and resultType = getUnknownType() or - tag = InitializeThisTag() and - opcode instanceof Opcode::InitializeThis and - resultType = getTypeForGLValue(getThisType()) - or tag = ReturnValueAddressTag() and opcode instanceof Opcode::VariableAddress and resultType = getTypeForGLValue(getReturnType()) and @@ -228,10 +220,8 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { tag = ReturnTag() and hasReturnValue() and - ( - operandTag instanceof AddressOperandTag and - result = getInstruction(ReturnValueAddressTag()) - ) + operandTag instanceof AddressOperandTag and + result = getInstruction(ReturnValueAddressTag()) } final override CppType getInstructionMemoryOperandType( @@ -264,6 +254,9 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { tag = EllipsisTempVar() and func.isVarargs() and type = getEllipsisVariablePRValueType() + or + tag = ThisTempVar() and + type = getTypeForGLValue(getThisType()) } /** @@ -286,6 +279,11 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { */ final IREllipsisVariable getEllipsisVariable() { result.getEnclosingFunction() = func } + /** + * Gets the variable that represents the `this` pointer for this function, if any. + */ + final IRThisVariable getThisVariable() { result = getIRTempVariable(func, ThisTempVar()) } + /** * Holds if the function has a non-`void` return type. */ @@ -295,7 +293,9 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { * Gets the single `InitializeThis` instruction for this function. Holds only * if the function is an instance member function, constructor, or destructor. */ - final Instruction getInitializeThisInstruction() { result = getInstruction(InitializeThisTag()) } + final Instruction getInitializeThisInstruction() { + result = getTranslatedThisParameter(func).getInstruction(InitializerStoreTag()) + } /** * Gets the type pointed to by the `this` pointer for this function (i.e. `*this`). @@ -336,6 +336,11 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { final Type getReturnType() { result = func.getType() } } +/** + * Gets the `TranslatedThisParameter` for function `func`, if one exists. + */ +TranslatedThisParameter getTranslatedThisParameter(Function func) { result.getFunction() = func } + /** * Gets the `TranslatedPositionalParameter` that represents parameter `param`. */ @@ -350,8 +355,9 @@ TranslatedEllipsisParameter getTranslatedEllipsisParameter(Function func) { /** * The IR translation of a parameter to a function. This can be either a user-declared parameter - * (`TranslatedPositionParameter`) or the synthesized parameter used to represent a `...` in a - * varargs function (`TranslatedEllipsisParameter`). + * (`TranslatedPositionParameter`), the synthesized parameter used to represent `this`, or the + * synthesized parameter used to represent a `...` in a varargs function + * (`TranslatedEllipsisParameter`). */ abstract class TranslatedParameter extends TranslatedElement { final override TranslatedElement getChild(int id) { none() } @@ -398,7 +404,7 @@ abstract class TranslatedParameter extends TranslatedElement { hasIndirection() and tag = InitializerIndirectStoreTag() and opcode instanceof Opcode::InitializeIndirection and - resultType = getUnknownType() + resultType = getInitializationResultType() } final override IRVariable getInstructionVariable(InstructionTag tag) { @@ -435,9 +441,43 @@ abstract class TranslatedParameter extends TranslatedElement { abstract CppType getPRValueType(); + abstract CppType getInitializationResultType(); + abstract IRAutomaticVariable getIRVariable(); } +/** + * The IR translation of the synthesized parameter used to represent the `...` in a varargs + * function. + */ +class TranslatedThisParameter extends TranslatedParameter, TTranslatedThisParameter { + Function func; + + TranslatedThisParameter() { this = TTranslatedThisParameter(func) } + + final override string toString() { result = "this" } + + final override Locatable getAST() { result = func } + + final override Function getFunction() { result = func } + + final override predicate hasIndirection() { any() } + + final override CppType getGLValueType() { result = getTypeForGLValue(any(UnknownType t)) } + + final override CppType getPRValueType() { + result = getTypeForGLValue(getTranslatedFunction(func).getThisType()) + } + + final override CppType getInitializationResultType() { + result = getTypeForPRValue(getTranslatedFunction(func).getThisType()) + } + + final override IRThisVariable getIRVariable() { + result = getTranslatedFunction(func).getThisVariable() + } +} + /** * Represents the IR translation of a function parameter, including the * initialization of that parameter with the incoming argument. @@ -468,6 +508,8 @@ class TranslatedPositionalParameter extends TranslatedParameter, TTranslatedPara final override CppType getPRValueType() { result = getTypeForPRValue(getVariableType(param)) } + final override CppType getInitializationResultType() { result = getUnknownType() } + final override IRAutomaticUserVariable getIRVariable() { result = getIRUserVariable(getFunction(), param) } @@ -494,6 +536,8 @@ class TranslatedEllipsisParameter extends TranslatedParameter, TTranslatedEllips final override CppType getPRValueType() { result = getEllipsisVariablePRValueType() } + final override CppType getInitializationResultType() { result = getUnknownType() } + final override IREllipsisVariable getIRVariable() { result = getTranslatedFunction(func).getEllipsisVariable() } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll index 0d5e7fe595c7..9f2a0d4ea281 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRVariable.qll @@ -223,6 +223,15 @@ class IREllipsisVariable extends IRTempVariable { final override string toString() { result = "#ellipsis" } } +/** + * A temporary variable generated to hold the `this` pointer. + */ +class IRThisVariable extends IRTempVariable { + IRThisVariable() { tag = ThisTempVar() } + + final override string toString() { result = "#this" } +} + /** * A variable generated to represent the contents of a string literal. This variable acts much like * a read-only global variable. diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll index c19a34fe0532..1612e0065b77 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll @@ -204,7 +204,7 @@ private predicate isArgumentForParameter(CallInstruction ci, Operand operand, In init.(InitializeParameterInstruction).getParameter() = f.getParameter(operand.(PositionalArgumentOperand).getIndex()) or - init instanceof InitializeThisInstruction and + init.(InitializeParameterInstruction).getIRVariable() instanceof IRThisVariable and init.getEnclosingFunction() = f and operand instanceof ThisArgumentOperand ) and diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll b/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll index 2cd44a08f9e8..c33280512867 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll @@ -3,7 +3,8 @@ newtype TTempVariableTag = ReturnValueTempVar() or ThrowTempVar() or LambdaTempVar() or - EllipsisTempVar() + EllipsisTempVar() or + ThisTempVar() string getTempVariableTagId(TTempVariableTag tag) { tag = ConditionValueTempVar() and result = "CondVal" @@ -15,4 +16,6 @@ string getTempVariableTagId(TTempVariableTag tag) { tag = LambdaTempVar() and result = "Lambda" or tag = EllipsisTempVar() and result = "Ellipsis" + or + tag = ThisTempVar() and result = "This" } diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-ir-consistency.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-ir-consistency.expected index 3940c1e83893..0bb9343dcaf8 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-ir-consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-ir-consistency.expected @@ -19,9 +19,7 @@ uniqueNodeLocation missingLocation | Nodes without location: 4 | uniqueNodeToString -| lambdas.cpp:2:6:2:9 | (no string representation) | Node should have one toString but has 0. | missingToString -| Nodes without toString: 1 | parameterCallable localFlowIsLocal compatibleTypesReflexive diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected index 9bad6e02bcc6..53ec865fa44a 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected @@ -40,7 +40,6 @@ | test.cpp:347:17:347:22 | test.cpp:349:10:349:18 | AST only | | test.cpp:359:13:359:18 | test.cpp:365:10:365:14 | AST only | | test.cpp:373:13:373:18 | test.cpp:369:10:369:14 | AST only | -| test.cpp:373:13:373:18 | test.cpp:375:10:375:14 | AST only | | test.cpp:399:7:399:9 | test.cpp:401:8:401:10 | AST only | | test.cpp:405:7:405:9 | test.cpp:408:8:408:10 | AST only | | test.cpp:416:7:416:11 | test.cpp:418:8:418:12 | AST only | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected index 35068c562326..e6969b8b1e09 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected @@ -65,6 +65,7 @@ | test.cpp:266:12:266:12 | x | test.cpp:265:22:265:27 | call to source | | test.cpp:289:14:289:14 | x | test.cpp:305:17:305:22 | call to source | | test.cpp:318:7:318:7 | x | test.cpp:314:4:314:9 | call to source | +| test.cpp:375:10:375:14 | field | test.cpp:373:13:373:18 | call to source | | test.cpp:385:8:385:10 | tmp | test.cpp:382:48:382:54 | source1 | | test.cpp:392:8:392:10 | tmp | test.cpp:388:53:388:59 | source1 | | test.cpp:394:10:394:12 | tmp | test.cpp:388:53:388:59 | source1 | diff --git a/cpp/ql/test/library-tests/dataflow/fields/dataflow-ir-consistency.expected b/cpp/ql/test/library-tests/dataflow/fields/dataflow-ir-consistency.expected index 9d0470bd4b25..c47a0f58a33b 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/dataflow-ir-consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/dataflow-ir-consistency.expected @@ -2,6 +2,7 @@ uniqueEnclosingCallable uniqueTypeBound | by_reference.cpp:106:21:106:41 | Chi | Node should have one type bound but has 2. | | by_reference.cpp:126:21:126:40 | Chi | Node should have one type bound but has 2. | +| file://:0:0:0:0 | Chi | Node should have one type bound but has 2. | uniqueTypeRepr uniqueNodeLocation | D.cpp:1:17:1:17 | o | Node should have one location but has 3. | diff --git a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.expected b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.expected index 0b4a738b7df4..dea8075caf5d 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-diff.expected @@ -1,6 +1,4 @@ -| A.cpp:25:7:25:10 | this | AST only | | A.cpp:25:13:25:13 | c | AST only | -| A.cpp:27:22:27:25 | this | AST only | | A.cpp:27:28:27:28 | c | AST only | | A.cpp:31:20:31:20 | c | AST only | | A.cpp:40:5:40:6 | cc | AST only | @@ -39,7 +37,6 @@ | A.cpp:132:10:132:10 | b | AST only | | A.cpp:132:13:132:13 | c | AST only | | A.cpp:142:10:142:10 | c | AST only | -| A.cpp:143:7:143:10 | this | AST only | | A.cpp:143:13:143:13 | b | AST only | | A.cpp:151:18:151:18 | b | AST only | | A.cpp:152:10:152:10 | d | AST only | @@ -69,8 +66,6 @@ | A.cpp:169:12:169:12 | l | AST only | | A.cpp:169:15:169:18 | head | AST only | | A.cpp:183:7:183:10 | head | AST only | -| A.cpp:183:7:183:10 | this | AST only | -| A.cpp:184:7:184:10 | this | AST only | | A.cpp:184:13:184:16 | next | AST only | | B.cpp:7:25:7:25 | e | AST only | | B.cpp:8:25:8:26 | b1 | AST only | @@ -88,23 +83,15 @@ | B.cpp:19:10:19:11 | b2 | AST only | | B.cpp:19:14:19:17 | box1 | AST only | | B.cpp:19:20:19:24 | elem2 | AST only | -| B.cpp:35:7:35:10 | this | AST only | | B.cpp:35:13:35:17 | elem1 | AST only | -| B.cpp:36:7:36:10 | this | AST only | | B.cpp:36:13:36:17 | elem2 | AST only | -| B.cpp:46:7:46:10 | this | AST only | | B.cpp:46:13:46:16 | box1 | AST only | | C.cpp:19:5:19:5 | c | AST only | -| C.cpp:24:5:24:8 | this | AST only | | C.cpp:24:11:24:12 | s3 | AST only | | D.cpp:9:21:9:24 | elem | AST only | -| D.cpp:9:21:9:24 | this | AST only | | D.cpp:11:29:11:32 | elem | AST only | -| D.cpp:11:29:11:32 | this | AST only | | D.cpp:16:21:16:23 | box | AST only | -| D.cpp:16:21:16:23 | this | AST only | | D.cpp:18:29:18:31 | box | AST only | -| D.cpp:18:29:18:31 | this | AST only | | D.cpp:22:10:22:11 | b2 | AST only | | D.cpp:22:14:22:20 | call to getBox1 | AST only | | D.cpp:22:25:22:31 | call to getElem | AST only | @@ -125,7 +112,6 @@ | D.cpp:51:27:51:27 | e | AST only | | D.cpp:52:14:52:14 | b | AST only | | D.cpp:57:5:57:12 | boxfield | AST only | -| D.cpp:57:5:57:12 | this | AST only | | D.cpp:58:5:58:12 | boxfield | AST only | | D.cpp:58:5:58:12 | this | AST only | | D.cpp:58:15:58:17 | box | AST only | @@ -163,7 +149,6 @@ | aliasing.cpp:92:3:92:3 | w | AST only | | aliasing.cpp:92:7:92:8 | m1 | AST only | | by_reference.cpp:12:8:12:8 | a | AST only | -| by_reference.cpp:16:5:16:8 | this | AST only | | by_reference.cpp:16:11:16:11 | a | AST only | | by_reference.cpp:20:5:20:8 | this | AST only | | by_reference.cpp:20:23:20:27 | value | AST only | @@ -240,9 +225,7 @@ | by_reference.cpp:136:8:136:13 | pouter | AST only | | by_reference.cpp:136:16:136:16 | a | AST only | | complex.cpp:11:22:11:23 | a_ | AST only | -| complex.cpp:11:22:11:23 | this | AST only | | complex.cpp:12:22:12:23 | b_ | AST only | -| complex.cpp:12:22:12:23 | this | AST only | | complex.cpp:51:8:51:8 | b | AST only | | complex.cpp:51:10:51:14 | inner | AST only | | complex.cpp:51:16:51:16 | f | AST only | @@ -266,9 +249,7 @@ | complex.cpp:74:7:74:8 | b3 | AST only | | complex.cpp:77:7:77:8 | b4 | AST only | | constructors.cpp:20:24:20:25 | a_ | AST only | -| constructors.cpp:20:24:20:25 | this | AST only | | constructors.cpp:21:24:21:25 | b_ | AST only | -| constructors.cpp:21:24:21:25 | this | AST only | | constructors.cpp:28:10:28:10 | f | AST only | | constructors.cpp:29:10:29:10 | f | AST only | | constructors.cpp:40:9:40:9 | f | AST only | @@ -285,7 +266,6 @@ | file://:0:0:0:0 | this | AST only | | file://:0:0:0:0 | this | AST only | | file://:0:0:0:0 | this | AST only | -| qualifiers.cpp:9:30:9:33 | this | AST only | | qualifiers.cpp:9:36:9:36 | a | AST only | | qualifiers.cpp:12:56:12:56 | a | AST only | | qualifiers.cpp:13:57:13:57 | a | AST only | @@ -326,9 +306,7 @@ | qualifiers.cpp:48:16:48:20 | inner | AST only | | qualifiers.cpp:48:23:48:23 | a | AST only | | simple.cpp:20:24:20:25 | a_ | AST only | -| simple.cpp:20:24:20:25 | this | AST only | | simple.cpp:21:24:21:25 | b_ | AST only | -| simple.cpp:21:24:21:25 | this | AST only | | simple.cpp:28:10:28:10 | f | AST only | | simple.cpp:29:10:29:10 | f | AST only | | simple.cpp:39:5:39:5 | f | AST only | @@ -340,7 +318,6 @@ | simple.cpp:51:9:51:9 | h | AST only | | simple.cpp:54:9:54:9 | i | AST only | | simple.cpp:65:7:65:7 | i | AST only | -| simple.cpp:83:9:83:10 | f2 | AST only | | simple.cpp:83:9:83:10 | this | AST only | | simple.cpp:83:12:83:13 | f1 | AST only | | struct_init.c:15:8:15:9 | ab | AST only | diff --git a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-ir.expected b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-ir.expected index fdaab4a95e9e..4d3cf489fe16 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/partial-definition-ir.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/partial-definition-ir.expected @@ -1,5 +1,13 @@ +| A.cpp:25:7:25:10 | this | +| A.cpp:27:22:27:25 | this | | A.cpp:100:5:100:6 | c1 | | A.cpp:142:7:142:7 | b | +| A.cpp:143:7:143:10 | this | +| A.cpp:184:7:184:10 | this | +| B.cpp:35:7:35:10 | this | +| B.cpp:36:7:36:10 | this | +| B.cpp:46:7:46:10 | this | +| C.cpp:24:5:24:8 | this | | aliasing.cpp:9:3:9:3 | s | | aliasing.cpp:13:3:13:3 | s | | aliasing.cpp:17:3:17:3 | s | @@ -13,8 +21,23 @@ | aliasing.cpp:86:3:86:3 | s | | aliasing.cpp:92:5:92:5 | s | | by_reference.cpp:12:5:12:5 | s | +| by_reference.cpp:16:5:16:8 | this | | by_reference.cpp:84:3:84:7 | inner | | by_reference.cpp:88:3:88:7 | inner | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| file://:0:0:0:0 | this | +| qualifiers.cpp:9:30:9:33 | this | | qualifiers.cpp:12:49:12:53 | inner | | qualifiers.cpp:13:51:13:55 | inner | | simple.cpp:65:5:65:5 | a | +| simple.cpp:83:9:83:10 | f2 | 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 289fbb831cb7..4035b805a812 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1,26 +1,30 @@ bad_asts.cpp: # 9| int Bad::S::MemberFunction(int) # 9| Block 0 -# 9| v9_1(void) = EnterFunction : -# 9| mu9_2(unknown) = AliasedDefinition : -# 9| mu9_3(unknown) = InitializeNonLocal : -# 9| r9_4(glval) = InitializeThis : -# 9| r9_5(glval) = VariableAddress[y] : -# 9| mu9_6(int) = InitializeParameter[y] : &:r9_5 -# 10| r10_1(glval) = VariableAddress[#return] : -# 10| r10_2(int) = Constant[6] : -#-----| r0_1(S *) = CopyValue : r9_4 -# 10| r10_3(glval) = FieldAddress[x] : r0_1 -# 10| r10_4(int) = Load : &:r10_3, ~m? -# 10| r10_5(int) = Add : r10_2, r10_4 -# 10| r10_6(glval) = VariableAddress[y] : -# 10| r10_7(int) = Load : &:r10_6, ~m? -# 10| r10_8(int) = Add : r10_5, r10_7 -# 10| mu10_9(int) = Store : &:r10_1, r10_8 -# 9| r9_7(glval) = VariableAddress[#return] : -# 9| v9_8(void) = ReturnValue : &:r9_7, ~m? -# 9| v9_9(void) = AliasedUse : ~m? -# 9| v9_10(void) = ExitFunction : +# 9| v9_1(void) = EnterFunction : +# 9| mu9_2(unknown) = AliasedDefinition : +# 9| mu9_3(unknown) = InitializeNonLocal : +# 9| r9_4(glval) = VariableAddress[#this] : +# 9| mu9_5(glval) = InitializeParameter[#this] : &:r9_4 +# 9| r9_6(glval) = Load : &:r9_4, ~m? +# 9| mu9_7(S) = InitializeIndirection[#this] : &:r9_6 +# 9| r9_8(glval) = VariableAddress[y] : +# 9| mu9_9(int) = InitializeParameter[y] : &:r9_8 +# 10| r10_1(glval) = VariableAddress[#return] : +# 10| r10_2(int) = Constant[6] : +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(S *) = Load : &:r0_1, ~m? +# 10| r10_3(glval) = FieldAddress[x] : r0_2 +# 10| r10_4(int) = Load : &:r10_3, ~m? +# 10| r10_5(int) = Add : r10_2, r10_4 +# 10| r10_6(glval) = VariableAddress[y] : +# 10| r10_7(int) = Load : &:r10_6, ~m? +# 10| r10_8(int) = Add : r10_5, r10_7 +# 10| mu10_9(int) = Store : &:r10_1, r10_8 +# 9| r9_10(glval) = VariableAddress[#return] : +# 9| v9_11(void) = ReturnValue : &:r9_10, ~m? +# 9| v9_12(void) = AliasedUse : ~m? +# 9| v9_13(void) = ExitFunction : # 14| void Bad::CallBadMemberFunction() # 14| Block 0 @@ -46,14 +50,17 @@ bad_asts.cpp: # 22| void Bad::Point::Point() # 22| Block 0 -# 22| v22_1(void) = EnterFunction : -# 22| mu22_2(unknown) = AliasedDefinition : -# 22| mu22_3(unknown) = InitializeNonLocal : -# 22| r22_4(glval) = InitializeThis : -# 23| v23_1(void) = NoOp : -# 22| v22_5(void) = ReturnVoid : -# 22| v22_6(void) = AliasedUse : ~m? -# 22| v22_7(void) = ExitFunction : +# 22| v22_1(void) = EnterFunction : +# 22| mu22_2(unknown) = AliasedDefinition : +# 22| mu22_3(unknown) = InitializeNonLocal : +# 22| r22_4(glval) = VariableAddress[#this] : +# 22| mu22_5(glval) = InitializeParameter[#this] : &:r22_4 +# 22| r22_6(glval) = Load : &:r22_4, ~m? +# 22| mu22_7(Point) = InitializeIndirection[#this] : &:r22_6 +# 23| v23_1(void) = NoOp : +# 22| v22_8(void) = ReturnVoid : +# 22| v22_9(void) = AliasedUse : ~m? +# 22| v22_10(void) = ExitFunction : # 26| void Bad::CallCopyConstructor(Bad::Point const&) # 26| Block 0 @@ -3425,22 +3432,25 @@ ir.cpp: # 628| void C::~C() # 628| Block 0 -# 628| v628_1(void) = EnterFunction : -# 628| mu628_2(unknown) = AliasedDefinition : -# 628| mu628_3(unknown) = InitializeNonLocal : -# 628| r628_4(glval) = InitializeThis : -#-----| v0_1(void) = NoOp : -# 628| r628_5(glval) = FieldAddress[m_f] : r628_4 -# 628| r628_6(glval) = FunctionAddress[~String] : -# 628| v628_7(void) = Call : func:r628_6, this:r628_5 -# 628| mu628_8(unknown) = ^CallSideEffect : ~m? -# 628| r628_9(glval) = FieldAddress[m_b] : r628_4 -# 628| r628_10(glval) = FunctionAddress[~String] : -# 628| v628_11(void) = Call : func:r628_10, this:r628_9 -# 628| mu628_12(unknown) = ^CallSideEffect : ~m? -# 628| v628_13(void) = ReturnVoid : -# 628| v628_14(void) = AliasedUse : ~m? -# 628| v628_15(void) = ExitFunction : +# 628| v628_1(void) = EnterFunction : +# 628| mu628_2(unknown) = AliasedDefinition : +# 628| mu628_3(unknown) = InitializeNonLocal : +# 628| r628_4(glval) = VariableAddress[#this] : +# 628| mu628_5(glval) = InitializeParameter[#this] : &:r628_4 +# 628| r628_6(glval) = Load : &:r628_4, ~m? +# 628| mu628_7(C) = InitializeIndirection[#this] : &:r628_6 +#-----| v0_1(void) = NoOp : +# 628| r628_8(glval) = FieldAddress[m_f] : mu628_5 +# 628| r628_9(glval) = FunctionAddress[~String] : +# 628| v628_10(void) = Call : func:r628_9, this:r628_8 +# 628| mu628_11(unknown) = ^CallSideEffect : ~m? +# 628| r628_12(glval) = FieldAddress[m_b] : mu628_5 +# 628| r628_13(glval) = FunctionAddress[~String] : +# 628| v628_14(void) = Call : func:r628_13, this:r628_12 +# 628| mu628_15(unknown) = ^CallSideEffect : ~m? +# 628| v628_16(void) = ReturnVoid : +# 628| v628_17(void) = AliasedUse : ~m? +# 628| v628_18(void) = ExitFunction : # 630| int C::StaticMemberFunction(int) # 630| Block 0 @@ -3460,134 +3470,158 @@ ir.cpp: # 634| int C::InstanceMemberFunction(int) # 634| Block 0 -# 634| v634_1(void) = EnterFunction : -# 634| mu634_2(unknown) = AliasedDefinition : -# 634| mu634_3(unknown) = InitializeNonLocal : -# 634| r634_4(glval) = InitializeThis : -# 634| r634_5(glval) = VariableAddress[x] : -# 634| mu634_6(int) = InitializeParameter[x] : &:r634_5 -# 635| r635_1(glval) = VariableAddress[#return] : -# 635| r635_2(glval) = VariableAddress[x] : -# 635| r635_3(int) = Load : &:r635_2, ~m? -# 635| mu635_4(int) = Store : &:r635_1, r635_3 -# 634| r634_7(glval) = VariableAddress[#return] : -# 634| v634_8(void) = ReturnValue : &:r634_7, ~m? -# 634| v634_9(void) = AliasedUse : ~m? -# 634| v634_10(void) = ExitFunction : +# 634| v634_1(void) = EnterFunction : +# 634| mu634_2(unknown) = AliasedDefinition : +# 634| mu634_3(unknown) = InitializeNonLocal : +# 634| r634_4(glval) = VariableAddress[#this] : +# 634| mu634_5(glval) = InitializeParameter[#this] : &:r634_4 +# 634| r634_6(glval) = Load : &:r634_4, ~m? +# 634| mu634_7(C) = InitializeIndirection[#this] : &:r634_6 +# 634| r634_8(glval) = VariableAddress[x] : +# 634| mu634_9(int) = InitializeParameter[x] : &:r634_8 +# 635| r635_1(glval) = VariableAddress[#return] : +# 635| r635_2(glval) = VariableAddress[x] : +# 635| r635_3(int) = Load : &:r635_2, ~m? +# 635| mu635_4(int) = Store : &:r635_1, r635_3 +# 634| r634_10(glval) = VariableAddress[#return] : +# 634| v634_11(void) = ReturnValue : &:r634_10, ~m? +# 634| v634_12(void) = AliasedUse : ~m? +# 634| v634_13(void) = ExitFunction : # 638| int C::VirtualMemberFunction(int) # 638| Block 0 -# 638| v638_1(void) = EnterFunction : -# 638| mu638_2(unknown) = AliasedDefinition : -# 638| mu638_3(unknown) = InitializeNonLocal : -# 638| r638_4(glval) = InitializeThis : -# 638| r638_5(glval) = VariableAddress[x] : -# 638| mu638_6(int) = InitializeParameter[x] : &:r638_5 -# 639| r639_1(glval) = VariableAddress[#return] : -# 639| r639_2(glval) = VariableAddress[x] : -# 639| r639_3(int) = Load : &:r639_2, ~m? -# 639| mu639_4(int) = Store : &:r639_1, r639_3 -# 638| r638_7(glval) = VariableAddress[#return] : -# 638| v638_8(void) = ReturnValue : &:r638_7, ~m? -# 638| v638_9(void) = AliasedUse : ~m? -# 638| v638_10(void) = ExitFunction : +# 638| v638_1(void) = EnterFunction : +# 638| mu638_2(unknown) = AliasedDefinition : +# 638| mu638_3(unknown) = InitializeNonLocal : +# 638| r638_4(glval) = VariableAddress[#this] : +# 638| mu638_5(glval) = InitializeParameter[#this] : &:r638_4 +# 638| r638_6(glval) = Load : &:r638_4, ~m? +# 638| mu638_7(C) = InitializeIndirection[#this] : &:r638_6 +# 638| r638_8(glval) = VariableAddress[x] : +# 638| mu638_9(int) = InitializeParameter[x] : &:r638_8 +# 639| r639_1(glval) = VariableAddress[#return] : +# 639| r639_2(glval) = VariableAddress[x] : +# 639| r639_3(int) = Load : &:r639_2, ~m? +# 639| mu639_4(int) = Store : &:r639_1, r639_3 +# 638| r638_10(glval) = VariableAddress[#return] : +# 638| v638_11(void) = ReturnValue : &:r638_10, ~m? +# 638| v638_12(void) = AliasedUse : ~m? +# 638| v638_13(void) = ExitFunction : # 642| void C::FieldAccess() # 642| Block 0 -# 642| v642_1(void) = EnterFunction : -# 642| mu642_2(unknown) = AliasedDefinition : -# 642| mu642_3(unknown) = InitializeNonLocal : -# 642| r642_4(glval) = InitializeThis : -# 643| r643_1(int) = Constant[0] : -# 643| r643_2(C *) = CopyValue : r642_4 -# 643| r643_3(glval) = FieldAddress[m_a] : r643_2 -# 643| mu643_4(int) = Store : &:r643_3, r643_1 -# 644| r644_1(int) = Constant[1] : -# 644| r644_2(C *) = CopyValue : r642_4 -# 644| r644_3(glval) = CopyValue : r644_2 -# 644| r644_4(glval) = FieldAddress[m_a] : r644_3 -# 644| mu644_5(int) = Store : &:r644_4, r644_1 -# 645| r645_1(int) = Constant[2] : -#-----| r0_1(C *) = CopyValue : r642_4 -# 645| r645_2(glval) = FieldAddress[m_a] : r0_1 -# 645| mu645_3(int) = Store : &:r645_2, r645_1 -# 646| r646_1(glval) = VariableAddress[x] : -# 646| mu646_2(int) = Uninitialized[x] : &:r646_1 -# 647| r647_1(C *) = CopyValue : r642_4 -# 647| r647_2(glval) = FieldAddress[m_a] : r647_1 -# 647| r647_3(int) = Load : &:r647_2, ~m? -# 647| r647_4(glval) = VariableAddress[x] : -# 647| mu647_5(int) = Store : &:r647_4, r647_3 -# 648| r648_1(C *) = CopyValue : r642_4 -# 648| r648_2(glval) = CopyValue : r648_1 -# 648| r648_3(glval) = FieldAddress[m_a] : r648_2 -# 648| r648_4(int) = Load : &:r648_3, ~m? -# 648| r648_5(glval) = VariableAddress[x] : -# 648| mu648_6(int) = Store : &:r648_5, r648_4 -#-----| r0_2(C *) = CopyValue : r642_4 -# 649| r649_1(glval) = FieldAddress[m_a] : r0_2 -# 649| r649_2(int) = Load : &:r649_1, ~m? -# 649| r649_3(glval) = VariableAddress[x] : -# 649| mu649_4(int) = Store : &:r649_3, r649_2 -# 650| v650_1(void) = NoOp : -# 642| v642_5(void) = ReturnVoid : -# 642| v642_6(void) = AliasedUse : ~m? -# 642| v642_7(void) = ExitFunction : +# 642| v642_1(void) = EnterFunction : +# 642| mu642_2(unknown) = AliasedDefinition : +# 642| mu642_3(unknown) = InitializeNonLocal : +# 642| r642_4(glval) = VariableAddress[#this] : +# 642| mu642_5(glval) = InitializeParameter[#this] : &:r642_4 +# 642| r642_6(glval) = Load : &:r642_4, ~m? +# 642| mu642_7(C) = InitializeIndirection[#this] : &:r642_6 +# 643| r643_1(int) = Constant[0] : +# 643| r643_2(glval) = VariableAddress[#this] : +# 643| r643_3(C *) = Load : &:r643_2, ~m? +# 643| r643_4(glval) = FieldAddress[m_a] : r643_3 +# 643| mu643_5(int) = Store : &:r643_4, r643_1 +# 644| r644_1(int) = Constant[1] : +# 644| r644_2(glval) = VariableAddress[#this] : +# 644| r644_3(C *) = Load : &:r644_2, ~m? +# 644| r644_4(glval) = CopyValue : r644_3 +# 644| r644_5(glval) = FieldAddress[m_a] : r644_4 +# 644| mu644_6(int) = Store : &:r644_5, r644_1 +# 645| r645_1(int) = Constant[2] : +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(C *) = Load : &:r0_1, ~m? +# 645| r645_2(glval) = FieldAddress[m_a] : r0_2 +# 645| mu645_3(int) = Store : &:r645_2, r645_1 +# 646| r646_1(glval) = VariableAddress[x] : +# 646| mu646_2(int) = Uninitialized[x] : &:r646_1 +# 647| r647_1(glval) = VariableAddress[#this] : +# 647| r647_2(C *) = Load : &:r647_1, ~m? +# 647| r647_3(glval) = FieldAddress[m_a] : r647_2 +# 647| r647_4(int) = Load : &:r647_3, ~m? +# 647| r647_5(glval) = VariableAddress[x] : +# 647| mu647_6(int) = Store : &:r647_5, r647_4 +# 648| r648_1(glval) = VariableAddress[#this] : +# 648| r648_2(C *) = Load : &:r648_1, ~m? +# 648| r648_3(glval) = CopyValue : r648_2 +# 648| r648_4(glval) = FieldAddress[m_a] : r648_3 +# 648| r648_5(int) = Load : &:r648_4, ~m? +# 648| r648_6(glval) = VariableAddress[x] : +# 648| mu648_7(int) = Store : &:r648_6, r648_5 +#-----| r0_3(glval) = VariableAddress[#this] : +#-----| r0_4(C *) = Load : &:r0_3, ~m? +# 649| r649_1(glval) = FieldAddress[m_a] : r0_4 +# 649| r649_2(int) = Load : &:r649_1, ~m? +# 649| r649_3(glval) = VariableAddress[x] : +# 649| mu649_4(int) = Store : &:r649_3, r649_2 +# 650| v650_1(void) = NoOp : +# 642| v642_8(void) = ReturnVoid : +# 642| v642_9(void) = AliasedUse : ~m? +# 642| v642_10(void) = ExitFunction : # 652| void C::MethodCalls() # 652| Block 0 # 652| v652_1(void) = EnterFunction : # 652| mu652_2(unknown) = AliasedDefinition : # 652| mu652_3(unknown) = InitializeNonLocal : -# 652| r652_4(glval) = InitializeThis : -# 653| r653_1(C *) = CopyValue : r652_4 -# 653| r653_2(glval) = FunctionAddress[InstanceMemberFunction] : -# 653| r653_3(int) = Constant[0] : -# 653| r653_4(int) = Call : func:r653_2, this:r653_1, 0:r653_3 -# 653| mu653_5(unknown) = ^CallSideEffect : ~m? -# 653| v653_6(void) = ^BufferReadSideEffect[-1] : &:r653_1, ~m? -# 653| mu653_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r653_1 -# 654| r654_1(C *) = CopyValue : r652_4 -# 654| r654_2(glval) = CopyValue : r654_1 -# 654| r654_3(glval) = FunctionAddress[InstanceMemberFunction] : -# 654| r654_4(int) = Constant[1] : -# 654| r654_5(int) = Call : func:r654_3, this:r654_2, 0:r654_4 -# 654| mu654_6(unknown) = ^CallSideEffect : ~m? -# 654| v654_7(void) = ^BufferReadSideEffect[-1] : &:r654_2, ~m? -# 654| mu654_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r654_2 -#-----| r0_1(C *) = CopyValue : r652_4 +# 652| r652_4(glval) = VariableAddress[#this] : +# 652| mu652_5(glval) = InitializeParameter[#this] : &:r652_4 +# 652| r652_6(glval) = Load : &:r652_4, ~m? +# 652| mu652_7(C) = InitializeIndirection[#this] : &:r652_6 +# 653| r653_1(glval) = VariableAddress[#this] : +# 653| r653_2(C *) = Load : &:r653_1, ~m? +# 653| r653_3(glval) = FunctionAddress[InstanceMemberFunction] : +# 653| r653_4(int) = Constant[0] : +# 653| r653_5(int) = Call : func:r653_3, this:r653_2, 0:r653_4 +# 653| mu653_6(unknown) = ^CallSideEffect : ~m? +# 653| v653_7(void) = ^BufferReadSideEffect[-1] : &:r653_2, ~m? +# 653| mu653_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r653_2 +# 654| r654_1(glval) = VariableAddress[#this] : +# 654| r654_2(C *) = Load : &:r654_1, ~m? +# 654| r654_3(glval) = CopyValue : r654_2 +# 654| r654_4(glval) = FunctionAddress[InstanceMemberFunction] : +# 654| r654_5(int) = Constant[1] : +# 654| r654_6(int) = Call : func:r654_4, this:r654_3, 0:r654_5 +# 654| mu654_7(unknown) = ^CallSideEffect : ~m? +# 654| v654_8(void) = ^BufferReadSideEffect[-1] : &:r654_3, ~m? +# 654| mu654_9(C) = ^IndirectMayWriteSideEffect[-1] : &:r654_3 +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(C *) = Load : &:r0_1, ~m? # 655| r655_1(glval) = FunctionAddress[InstanceMemberFunction] : # 655| r655_2(int) = Constant[2] : -# 655| r655_3(int) = Call : func:r655_1, this:r0_1, 0:r655_2 +# 655| r655_3(int) = Call : func:r655_1, this:r0_2, 0:r655_2 # 655| mu655_4(unknown) = ^CallSideEffect : ~m? -#-----| v0_2(void) = ^BufferReadSideEffect[-1] : &:r0_1, ~m? -#-----| mu0_3(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_1 +#-----| v0_3(void) = ^BufferReadSideEffect[-1] : &:r0_2, ~m? +#-----| mu0_4(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_2 # 656| v656_1(void) = NoOp : -# 652| v652_5(void) = ReturnVoid : -# 652| v652_6(void) = AliasedUse : ~m? -# 652| v652_7(void) = ExitFunction : +# 652| v652_8(void) = ReturnVoid : +# 652| v652_9(void) = AliasedUse : ~m? +# 652| v652_10(void) = ExitFunction : # 658| void C::C() # 658| Block 0 # 658| v658_1(void) = EnterFunction : # 658| mu658_2(unknown) = AliasedDefinition : # 658| mu658_3(unknown) = InitializeNonLocal : -# 658| r658_4(glval) = InitializeThis : -# 659| r659_1(glval) = FieldAddress[m_a] : r658_4 +# 658| r658_4(glval) = VariableAddress[#this] : +# 658| mu658_5(glval) = InitializeParameter[#this] : &:r658_4 +# 658| r658_6(glval) = Load : &:r658_4, ~m? +# 658| mu658_7(C) = InitializeIndirection[#this] : &:r658_6 +# 659| r659_1(glval) = FieldAddress[m_a] : mu658_5 # 659| r659_2(int) = Constant[1] : # 659| mu659_3(int) = Store : &:r659_1, r659_2 -# 663| r663_1(glval) = FieldAddress[m_b] : r658_4 +# 663| r663_1(glval) = FieldAddress[m_b] : mu658_5 # 663| r663_2(glval) = FunctionAddress[String] : # 663| v663_3(void) = Call : func:r663_2, this:r663_1 # 663| mu663_4(unknown) = ^CallSideEffect : ~m? # 663| mu663_5(String) = ^IndirectMayWriteSideEffect[-1] : &:r663_1 -# 660| r660_1(glval) = FieldAddress[m_c] : r658_4 +# 660| r660_1(glval) = FieldAddress[m_c] : mu658_5 # 660| r660_2(char) = Constant[3] : # 660| mu660_3(char) = Store : &:r660_1, r660_2 -# 661| r661_1(glval) = FieldAddress[m_e] : r658_4 +# 661| r661_1(glval) = FieldAddress[m_e] : mu658_5 # 661| r661_2(void *) = Constant[0] : # 661| mu661_3(void *) = Store : &:r661_1, r661_2 -# 662| r662_1(glval) = FieldAddress[m_f] : r658_4 +# 662| r662_1(glval) = FieldAddress[m_f] : mu658_5 # 662| r662_2(glval) = FunctionAddress[String] : # 662| r662_3(glval) = StringConstant["test"] : # 662| r662_4(char *) = Convert : r662_3 @@ -3597,9 +3631,9 @@ ir.cpp: # 662| v662_8(void) = ^BufferReadSideEffect[0] : &:r662_4, ~m? # 662| mu662_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r662_4 # 664| v664_1(void) = NoOp : -# 658| v658_5(void) = ReturnVoid : -# 658| v658_6(void) = AliasedUse : ~m? -# 658| v658_7(void) = ExitFunction : +# 658| v658_8(void) = ReturnVoid : +# 658| v658_9(void) = AliasedUse : ~m? +# 658| v658_10(void) = ExitFunction : # 675| int DerefReference(int&) # 675| Block 0 @@ -3949,415 +3983,471 @@ ir.cpp: # 745| v745_1(void) = EnterFunction : # 745| mu745_2(unknown) = AliasedDefinition : # 745| mu745_3(unknown) = InitializeNonLocal : -# 745| r745_4(glval) = InitializeThis : +# 745| r745_4(glval) = VariableAddress[#this] : +# 745| mu745_5(glval) = InitializeParameter[#this] : &:r745_4 +# 745| r745_6(glval) = Load : &:r745_4, ~m? +# 745| mu745_7(Base) = InitializeIndirection[#this] : &:r745_6 #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_2(Base &) = InitializeParameter[p#0] : &:r0_1 #-----| r0_3(Base &) = Load : &:r0_1, ~m? #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 -#-----| r0_5(Base *) = CopyValue : r745_4 -#-----| r0_6(glval) = FieldAddress[base_s] : r0_5 -#-----| r0_7(String *) = CopyValue : r0_6 -# 745| r745_5(glval) = FunctionAddress[operator=] : -#-----| r0_8(glval) = VariableAddress[p#0] : -#-----| r0_9(Base &) = Load : &:r0_8, ~m? -#-----| r0_10(glval) = CopyValue : r0_9 -#-----| r0_11(glval) = FieldAddress[base_s] : r0_10 -#-----| r0_12(String &) = CopyValue : r0_11 -# 745| r745_6(String &) = Call : func:r745_5, this:r0_7, 0:r0_12 -# 745| mu745_7(unknown) = ^CallSideEffect : ~m? -#-----| v0_13(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~m? -#-----| v0_14(void) = ^BufferReadSideEffect[0] : &:r0_12, ~m? -#-----| mu0_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_7 -#-----| mu0_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_12 -#-----| r0_17(glval) = CopyValue : r745_6 -#-----| r0_18(glval) = VariableAddress[#return] : -#-----| r0_19(Base *) = CopyValue : r745_4 -#-----| r0_20(glval) = CopyValue : r0_19 -#-----| r0_21(Base &) = CopyValue : r0_20 -#-----| mu0_22(Base &) = Store : &:r0_18, r0_21 -#-----| v0_23(void) = ReturnIndirection[p#0] : &:r0_3, ~m? -# 745| r745_8(glval) = VariableAddress[#return] : -# 745| v745_9(void) = ReturnValue : &:r745_8, ~m? -# 745| v745_10(void) = AliasedUse : ~m? -# 745| v745_11(void) = ExitFunction : +#-----| r0_5(glval) = VariableAddress[#this] : +#-----| r0_6(Base *) = Load : &:r0_5, ~m? +#-----| r0_7(glval) = FieldAddress[base_s] : r0_6 +#-----| r0_8(String *) = CopyValue : r0_7 +# 745| r745_8(glval) = FunctionAddress[operator=] : +#-----| r0_9(glval) = VariableAddress[p#0] : +#-----| r0_10(Base &) = Load : &:r0_9, ~m? +#-----| r0_11(glval) = CopyValue : r0_10 +#-----| r0_12(glval) = FieldAddress[base_s] : r0_11 +#-----| r0_13(String &) = CopyValue : r0_12 +# 745| r745_9(String &) = Call : func:r745_8, this:r0_8, 0:r0_13 +# 745| mu745_10(unknown) = ^CallSideEffect : ~m? +#-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_8, ~m? +#-----| v0_15(void) = ^BufferReadSideEffect[0] : &:r0_13, ~m? +#-----| mu0_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 +#-----| mu0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_13 +#-----| r0_18(glval) = CopyValue : r745_9 +#-----| r0_19(glval) = VariableAddress[#return] : +#-----| r0_20(glval) = VariableAddress[#this] : +#-----| r0_21(Base *) = Load : &:r0_20, ~m? +#-----| r0_22(glval) = CopyValue : r0_21 +#-----| r0_23(Base &) = CopyValue : r0_22 +#-----| mu0_24(Base &) = Store : &:r0_19, r0_23 +#-----| v0_25(void) = ReturnIndirection[p#0] : &:r0_3, ~m? +# 745| r745_11(glval) = VariableAddress[#return] : +# 745| v745_12(void) = ReturnValue : &:r745_11, ~m? +# 745| v745_13(void) = AliasedUse : ~m? +# 745| v745_14(void) = ExitFunction : # 745| void Base::Base(Base const&) # 745| Block 0 # 745| v745_1(void) = EnterFunction : # 745| mu745_2(unknown) = AliasedDefinition : # 745| mu745_3(unknown) = InitializeNonLocal : -# 745| r745_4(glval) = InitializeThis : +# 745| r745_4(glval) = VariableAddress[#this] : +# 745| mu745_5(glval) = InitializeParameter[#this] : &:r745_4 +# 745| r745_6(glval) = Load : &:r745_4, ~m? +# 745| mu745_7(Base) = InitializeIndirection[#this] : &:r745_6 #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_2(Base &) = InitializeParameter[p#0] : &:r0_1 #-----| r0_3(Base &) = Load : &:r0_1, ~m? #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 -# 745| r745_5(glval) = FieldAddress[base_s] : r745_4 -# 745| r745_6(glval) = FunctionAddress[String] : -# 745| v745_7(void) = Call : func:r745_6, this:r745_5 -# 745| mu745_8(unknown) = ^CallSideEffect : ~m? -# 745| mu745_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r745_5 -# 745| v745_10(void) = NoOp : +# 745| r745_8(glval) = FieldAddress[base_s] : mu745_5 +# 745| r745_9(glval) = FunctionAddress[String] : +# 745| v745_10(void) = Call : func:r745_9, this:r745_8 +# 745| mu745_11(unknown) = ^CallSideEffect : ~m? +# 745| mu745_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r745_8 +# 745| v745_13(void) = NoOp : #-----| v0_5(void) = ReturnIndirection[p#0] : &:r0_3, ~m? -# 745| v745_11(void) = ReturnVoid : -# 745| v745_12(void) = AliasedUse : ~m? -# 745| v745_13(void) = ExitFunction : +# 745| v745_14(void) = ReturnVoid : +# 745| v745_15(void) = AliasedUse : ~m? +# 745| v745_16(void) = ExitFunction : # 748| void Base::Base() # 748| Block 0 # 748| v748_1(void) = EnterFunction : # 748| mu748_2(unknown) = AliasedDefinition : # 748| mu748_3(unknown) = InitializeNonLocal : -# 748| r748_4(glval) = InitializeThis : -# 748| r748_5(glval) = FieldAddress[base_s] : r748_4 -# 748| r748_6(glval) = FunctionAddress[String] : -# 748| v748_7(void) = Call : func:r748_6, this:r748_5 -# 748| mu748_8(unknown) = ^CallSideEffect : ~m? -# 748| mu748_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r748_5 +# 748| r748_4(glval) = VariableAddress[#this] : +# 748| mu748_5(glval) = InitializeParameter[#this] : &:r748_4 +# 748| r748_6(glval) = Load : &:r748_4, ~m? +# 748| mu748_7(Base) = InitializeIndirection[#this] : &:r748_6 +# 748| r748_8(glval) = FieldAddress[base_s] : mu748_5 +# 748| r748_9(glval) = FunctionAddress[String] : +# 748| v748_10(void) = Call : func:r748_9, this:r748_8 +# 748| mu748_11(unknown) = ^CallSideEffect : ~m? +# 748| mu748_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r748_8 # 749| v749_1(void) = NoOp : -# 748| v748_10(void) = ReturnVoid : -# 748| v748_11(void) = AliasedUse : ~m? -# 748| v748_12(void) = ExitFunction : +# 748| v748_13(void) = ReturnVoid : +# 748| v748_14(void) = AliasedUse : ~m? +# 748| v748_15(void) = ExitFunction : # 750| void Base::~Base() # 750| Block 0 -# 750| v750_1(void) = EnterFunction : -# 750| mu750_2(unknown) = AliasedDefinition : -# 750| mu750_3(unknown) = InitializeNonLocal : -# 750| r750_4(glval) = InitializeThis : -# 751| v751_1(void) = NoOp : -# 751| r751_2(glval) = FieldAddress[base_s] : r750_4 -# 751| r751_3(glval) = FunctionAddress[~String] : -# 751| v751_4(void) = Call : func:r751_3, this:r751_2 -# 751| mu751_5(unknown) = ^CallSideEffect : ~m? -# 750| v750_5(void) = ReturnVoid : -# 750| v750_6(void) = AliasedUse : ~m? -# 750| v750_7(void) = ExitFunction : +# 750| v750_1(void) = EnterFunction : +# 750| mu750_2(unknown) = AliasedDefinition : +# 750| mu750_3(unknown) = InitializeNonLocal : +# 750| r750_4(glval) = VariableAddress[#this] : +# 750| mu750_5(glval) = InitializeParameter[#this] : &:r750_4 +# 750| r750_6(glval) = Load : &:r750_4, ~m? +# 750| mu750_7(Base) = InitializeIndirection[#this] : &:r750_6 +# 751| v751_1(void) = NoOp : +# 751| r751_2(glval) = FieldAddress[base_s] : mu750_5 +# 751| r751_3(glval) = FunctionAddress[~String] : +# 751| v751_4(void) = Call : func:r751_3, this:r751_2 +# 751| mu751_5(unknown) = ^CallSideEffect : ~m? +# 750| v750_8(void) = ReturnVoid : +# 750| v750_9(void) = AliasedUse : ~m? +# 750| v750_10(void) = ExitFunction : # 754| Middle& Middle::operator=(Middle const&) # 754| Block 0 # 754| v754_1(void) = EnterFunction : # 754| mu754_2(unknown) = AliasedDefinition : # 754| mu754_3(unknown) = InitializeNonLocal : -# 754| r754_4(glval) = InitializeThis : +# 754| r754_4(glval) = VariableAddress[#this] : +# 754| mu754_5(glval) = InitializeParameter[#this] : &:r754_4 +# 754| r754_6(glval) = Load : &:r754_4, ~m? +# 754| mu754_7(Middle) = InitializeIndirection[#this] : &:r754_6 #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_2(Middle &) = InitializeParameter[p#0] : &:r0_1 #-----| r0_3(Middle &) = Load : &:r0_1, ~m? #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 -#-----| r0_5(Middle *) = CopyValue : r754_4 -#-----| r0_6(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_5 -# 754| r754_5(glval) = FunctionAddress[operator=] : -#-----| r0_7(glval) = VariableAddress[p#0] : -#-----| r0_8(Middle &) = Load : &:r0_7, ~m? -#-----| r0_9(glval) = CopyValue : r0_8 -#-----| r0_10(Middle *) = CopyValue : r0_9 -#-----| r0_11(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_10 -#-----| r0_12(glval) = CopyValue : r0_11 -#-----| r0_13(Base &) = CopyValue : r0_12 -# 754| r754_6(Base &) = Call : func:r754_5, this:r0_6, 0:r0_13 -# 754| mu754_7(unknown) = ^CallSideEffect : ~m? -#-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_6, ~m? -#-----| v0_15(void) = ^BufferReadSideEffect[0] : &:r0_13, ~m? -#-----| mu0_16(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_6 -#-----| mu0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_13 -#-----| r0_18(glval) = CopyValue : r754_6 -#-----| r0_19(Middle *) = CopyValue : r754_4 -#-----| r0_20(glval) = FieldAddress[middle_s] : r0_19 -#-----| r0_21(String *) = CopyValue : r0_20 +#-----| r0_5(glval) = VariableAddress[#this] : +#-----| r0_6(Middle *) = Load : &:r0_5, ~m? +#-----| r0_7(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_6 # 754| r754_8(glval) = FunctionAddress[operator=] : -#-----| r0_22(glval) = VariableAddress[p#0] : -#-----| r0_23(Middle &) = Load : &:r0_22, ~m? -#-----| r0_24(glval) = CopyValue : r0_23 -#-----| r0_25(glval) = FieldAddress[middle_s] : r0_24 -#-----| r0_26(String &) = CopyValue : r0_25 -# 754| r754_9(String &) = Call : func:r754_8, this:r0_21, 0:r0_26 +#-----| r0_8(glval) = VariableAddress[p#0] : +#-----| r0_9(Middle &) = Load : &:r0_8, ~m? +#-----| r0_10(glval) = CopyValue : r0_9 +#-----| r0_11(Middle *) = CopyValue : r0_10 +#-----| r0_12(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_11 +#-----| r0_13(glval) = CopyValue : r0_12 +#-----| r0_14(Base &) = CopyValue : r0_13 +# 754| r754_9(Base &) = Call : func:r754_8, this:r0_7, 0:r0_14 # 754| mu754_10(unknown) = ^CallSideEffect : ~m? -#-----| v0_27(void) = ^BufferReadSideEffect[-1] : &:r0_21, ~m? -#-----| v0_28(void) = ^BufferReadSideEffect[0] : &:r0_26, ~m? -#-----| mu0_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_21 -#-----| mu0_30(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_26 -#-----| r0_31(glval) = CopyValue : r754_9 -#-----| r0_32(glval) = VariableAddress[#return] : -#-----| r0_33(Middle *) = CopyValue : r754_4 -#-----| r0_34(glval) = CopyValue : r0_33 -#-----| r0_35(Middle &) = CopyValue : r0_34 -#-----| mu0_36(Middle &) = Store : &:r0_32, r0_35 -#-----| v0_37(void) = ReturnIndirection[p#0] : &:r0_3, ~m? -# 754| r754_11(glval) = VariableAddress[#return] : -# 754| v754_12(void) = ReturnValue : &:r754_11, ~m? -# 754| v754_13(void) = AliasedUse : ~m? -# 754| v754_14(void) = ExitFunction : +#-----| v0_15(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~m? +#-----| v0_16(void) = ^BufferReadSideEffect[0] : &:r0_14, ~m? +#-----| mu0_17(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_7 +#-----| mu0_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_14 +#-----| r0_19(glval) = CopyValue : r754_9 +#-----| r0_20(glval) = VariableAddress[#this] : +#-----| r0_21(Middle *) = Load : &:r0_20, ~m? +#-----| r0_22(glval) = FieldAddress[middle_s] : r0_21 +#-----| r0_23(String *) = CopyValue : r0_22 +# 754| r754_11(glval) = FunctionAddress[operator=] : +#-----| r0_24(glval) = VariableAddress[p#0] : +#-----| r0_25(Middle &) = Load : &:r0_24, ~m? +#-----| r0_26(glval) = CopyValue : r0_25 +#-----| r0_27(glval) = FieldAddress[middle_s] : r0_26 +#-----| r0_28(String &) = CopyValue : r0_27 +# 754| r754_12(String &) = Call : func:r754_11, this:r0_23, 0:r0_28 +# 754| mu754_13(unknown) = ^CallSideEffect : ~m? +#-----| v0_29(void) = ^BufferReadSideEffect[-1] : &:r0_23, ~m? +#-----| v0_30(void) = ^BufferReadSideEffect[0] : &:r0_28, ~m? +#-----| mu0_31(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_23 +#-----| mu0_32(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_28 +#-----| r0_33(glval) = CopyValue : r754_12 +#-----| r0_34(glval) = VariableAddress[#return] : +#-----| r0_35(glval) = VariableAddress[#this] : +#-----| r0_36(Middle *) = Load : &:r0_35, ~m? +#-----| r0_37(glval) = CopyValue : r0_36 +#-----| r0_38(Middle &) = CopyValue : r0_37 +#-----| mu0_39(Middle &) = Store : &:r0_34, r0_38 +#-----| v0_40(void) = ReturnIndirection[p#0] : &:r0_3, ~m? +# 754| r754_14(glval) = VariableAddress[#return] : +# 754| v754_15(void) = ReturnValue : &:r754_14, ~m? +# 754| v754_16(void) = AliasedUse : ~m? +# 754| v754_17(void) = ExitFunction : # 757| void Middle::Middle() # 757| Block 0 # 757| v757_1(void) = EnterFunction : # 757| mu757_2(unknown) = AliasedDefinition : # 757| mu757_3(unknown) = InitializeNonLocal : -# 757| r757_4(glval) = InitializeThis : -# 757| r757_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r757_4 -# 757| r757_6(glval) = FunctionAddress[Base] : -# 757| v757_7(void) = Call : func:r757_6, this:r757_5 -# 757| mu757_8(unknown) = ^CallSideEffect : ~m? -# 757| mu757_9(Base) = ^IndirectMayWriteSideEffect[-1] : &:r757_5 -# 757| r757_10(glval) = FieldAddress[middle_s] : r757_4 -# 757| r757_11(glval) = FunctionAddress[String] : -# 757| v757_12(void) = Call : func:r757_11, this:r757_10 -# 757| mu757_13(unknown) = ^CallSideEffect : ~m? -# 757| mu757_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r757_10 +# 757| r757_4(glval) = VariableAddress[#this] : +# 757| mu757_5(glval) = InitializeParameter[#this] : &:r757_4 +# 757| r757_6(glval) = Load : &:r757_4, ~m? +# 757| mu757_7(Middle) = InitializeIndirection[#this] : &:r757_6 +# 757| r757_8(glval) = ConvertToNonVirtualBase[Middle : Base] : mu757_5 +# 757| r757_9(glval) = FunctionAddress[Base] : +# 757| v757_10(void) = Call : func:r757_9, this:r757_8 +# 757| mu757_11(unknown) = ^CallSideEffect : ~m? +# 757| mu757_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r757_8 +# 757| r757_13(glval) = FieldAddress[middle_s] : mu757_5 +# 757| r757_14(glval) = FunctionAddress[String] : +# 757| v757_15(void) = Call : func:r757_14, this:r757_13 +# 757| mu757_16(unknown) = ^CallSideEffect : ~m? +# 757| mu757_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r757_13 # 758| v758_1(void) = NoOp : -# 757| v757_15(void) = ReturnVoid : -# 757| v757_16(void) = AliasedUse : ~m? -# 757| v757_17(void) = ExitFunction : +# 757| v757_18(void) = ReturnVoid : +# 757| v757_19(void) = AliasedUse : ~m? +# 757| v757_20(void) = ExitFunction : # 759| void Middle::~Middle() # 759| Block 0 # 759| v759_1(void) = EnterFunction : # 759| mu759_2(unknown) = AliasedDefinition : # 759| mu759_3(unknown) = InitializeNonLocal : -# 759| r759_4(glval) = InitializeThis : +# 759| r759_4(glval) = VariableAddress[#this] : +# 759| mu759_5(glval) = InitializeParameter[#this] : &:r759_4 +# 759| r759_6(glval) = Load : &:r759_4, ~m? +# 759| mu759_7(Middle) = InitializeIndirection[#this] : &:r759_6 # 760| v760_1(void) = NoOp : -# 760| r760_2(glval) = FieldAddress[middle_s] : r759_4 +# 760| r760_2(glval) = FieldAddress[middle_s] : mu759_5 # 760| r760_3(glval) = FunctionAddress[~String] : # 760| v760_4(void) = Call : func:r760_3, this:r760_2 # 760| mu760_5(unknown) = ^CallSideEffect : ~m? -# 760| r760_6(glval) = ConvertToNonVirtualBase[Middle : Base] : r759_4 +# 760| r760_6(glval) = ConvertToNonVirtualBase[Middle : Base] : mu759_5 # 760| r760_7(glval) = FunctionAddress[~Base] : # 760| v760_8(void) = Call : func:r760_7, this:r760_6 # 760| mu760_9(unknown) = ^CallSideEffect : ~m? -# 759| v759_5(void) = ReturnVoid : -# 759| v759_6(void) = AliasedUse : ~m? -# 759| v759_7(void) = ExitFunction : +# 759| v759_8(void) = ReturnVoid : +# 759| v759_9(void) = AliasedUse : ~m? +# 759| v759_10(void) = ExitFunction : # 763| Derived& Derived::operator=(Derived const&) # 763| Block 0 # 763| v763_1(void) = EnterFunction : # 763| mu763_2(unknown) = AliasedDefinition : # 763| mu763_3(unknown) = InitializeNonLocal : -# 763| r763_4(glval) = InitializeThis : +# 763| r763_4(glval) = VariableAddress[#this] : +# 763| mu763_5(glval) = InitializeParameter[#this] : &:r763_4 +# 763| r763_6(glval) = Load : &:r763_4, ~m? +# 763| mu763_7(Derived) = InitializeIndirection[#this] : &:r763_6 #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_2(Derived &) = InitializeParameter[p#0] : &:r0_1 #-----| r0_3(Derived &) = Load : &:r0_1, ~m? #-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 -#-----| r0_5(Derived *) = CopyValue : r763_4 -#-----| r0_6(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_5 -# 763| r763_5(glval) = FunctionAddress[operator=] : -#-----| r0_7(glval) = VariableAddress[p#0] : -#-----| r0_8(Derived &) = Load : &:r0_7, ~m? -#-----| r0_9(glval) = CopyValue : r0_8 -#-----| r0_10(Derived *) = CopyValue : r0_9 -#-----| r0_11(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_10 -#-----| r0_12(glval) = CopyValue : r0_11 -#-----| r0_13(Middle &) = CopyValue : r0_12 -# 763| r763_6(Middle &) = Call : func:r763_5, this:r0_6, 0:r0_13 -# 763| mu763_7(unknown) = ^CallSideEffect : ~m? -#-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_6, ~m? -#-----| v0_15(void) = ^BufferReadSideEffect[0] : &:r0_13, ~m? -#-----| mu0_16(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_6 -#-----| mu0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_13 -#-----| r0_18(glval) = CopyValue : r763_6 -#-----| r0_19(Derived *) = CopyValue : r763_4 -#-----| r0_20(glval) = FieldAddress[derived_s] : r0_19 -#-----| r0_21(String *) = CopyValue : r0_20 +#-----| r0_5(glval) = VariableAddress[#this] : +#-----| r0_6(Derived *) = Load : &:r0_5, ~m? +#-----| r0_7(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_6 # 763| r763_8(glval) = FunctionAddress[operator=] : -#-----| r0_22(glval) = VariableAddress[p#0] : -#-----| r0_23(Derived &) = Load : &:r0_22, ~m? -#-----| r0_24(glval) = CopyValue : r0_23 -#-----| r0_25(glval) = FieldAddress[derived_s] : r0_24 -#-----| r0_26(String &) = CopyValue : r0_25 -# 763| r763_9(String &) = Call : func:r763_8, this:r0_21, 0:r0_26 +#-----| r0_8(glval) = VariableAddress[p#0] : +#-----| r0_9(Derived &) = Load : &:r0_8, ~m? +#-----| r0_10(glval) = CopyValue : r0_9 +#-----| r0_11(Derived *) = CopyValue : r0_10 +#-----| r0_12(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_11 +#-----| r0_13(glval) = CopyValue : r0_12 +#-----| r0_14(Middle &) = CopyValue : r0_13 +# 763| r763_9(Middle &) = Call : func:r763_8, this:r0_7, 0:r0_14 # 763| mu763_10(unknown) = ^CallSideEffect : ~m? -#-----| v0_27(void) = ^BufferReadSideEffect[-1] : &:r0_21, ~m? -#-----| v0_28(void) = ^BufferReadSideEffect[0] : &:r0_26, ~m? -#-----| mu0_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_21 -#-----| mu0_30(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_26 -#-----| r0_31(glval) = CopyValue : r763_9 -#-----| r0_32(glval) = VariableAddress[#return] : -#-----| r0_33(Derived *) = CopyValue : r763_4 -#-----| r0_34(glval) = CopyValue : r0_33 -#-----| r0_35(Derived &) = CopyValue : r0_34 -#-----| mu0_36(Derived &) = Store : &:r0_32, r0_35 -#-----| v0_37(void) = ReturnIndirection[p#0] : &:r0_3, ~m? -# 763| r763_11(glval) = VariableAddress[#return] : -# 763| v763_12(void) = ReturnValue : &:r763_11, ~m? -# 763| v763_13(void) = AliasedUse : ~m? -# 763| v763_14(void) = ExitFunction : +#-----| v0_15(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~m? +#-----| v0_16(void) = ^BufferReadSideEffect[0] : &:r0_14, ~m? +#-----| mu0_17(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_7 +#-----| mu0_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_14 +#-----| r0_19(glval) = CopyValue : r763_9 +#-----| r0_20(glval) = VariableAddress[#this] : +#-----| r0_21(Derived *) = Load : &:r0_20, ~m? +#-----| r0_22(glval) = FieldAddress[derived_s] : r0_21 +#-----| r0_23(String *) = CopyValue : r0_22 +# 763| r763_11(glval) = FunctionAddress[operator=] : +#-----| r0_24(glval) = VariableAddress[p#0] : +#-----| r0_25(Derived &) = Load : &:r0_24, ~m? +#-----| r0_26(glval) = CopyValue : r0_25 +#-----| r0_27(glval) = FieldAddress[derived_s] : r0_26 +#-----| r0_28(String &) = CopyValue : r0_27 +# 763| r763_12(String &) = Call : func:r763_11, this:r0_23, 0:r0_28 +# 763| mu763_13(unknown) = ^CallSideEffect : ~m? +#-----| v0_29(void) = ^BufferReadSideEffect[-1] : &:r0_23, ~m? +#-----| v0_30(void) = ^BufferReadSideEffect[0] : &:r0_28, ~m? +#-----| mu0_31(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_23 +#-----| mu0_32(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_28 +#-----| r0_33(glval) = CopyValue : r763_12 +#-----| r0_34(glval) = VariableAddress[#return] : +#-----| r0_35(glval) = VariableAddress[#this] : +#-----| r0_36(Derived *) = Load : &:r0_35, ~m? +#-----| r0_37(glval) = CopyValue : r0_36 +#-----| r0_38(Derived &) = CopyValue : r0_37 +#-----| mu0_39(Derived &) = Store : &:r0_34, r0_38 +#-----| v0_40(void) = ReturnIndirection[p#0] : &:r0_3, ~m? +# 763| r763_14(glval) = VariableAddress[#return] : +# 763| v763_15(void) = ReturnValue : &:r763_14, ~m? +# 763| v763_16(void) = AliasedUse : ~m? +# 763| v763_17(void) = ExitFunction : # 766| void Derived::Derived() # 766| Block 0 # 766| v766_1(void) = EnterFunction : # 766| mu766_2(unknown) = AliasedDefinition : # 766| mu766_3(unknown) = InitializeNonLocal : -# 766| r766_4(glval) = InitializeThis : -# 766| r766_5(glval) = ConvertToNonVirtualBase[Derived : Middle] : r766_4 -# 766| r766_6(glval) = FunctionAddress[Middle] : -# 766| v766_7(void) = Call : func:r766_6, this:r766_5 -# 766| mu766_8(unknown) = ^CallSideEffect : ~m? -# 766| mu766_9(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r766_5 -# 766| r766_10(glval) = FieldAddress[derived_s] : r766_4 -# 766| r766_11(glval) = FunctionAddress[String] : -# 766| v766_12(void) = Call : func:r766_11, this:r766_10 -# 766| mu766_13(unknown) = ^CallSideEffect : ~m? -# 766| mu766_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r766_10 +# 766| r766_4(glval) = VariableAddress[#this] : +# 766| mu766_5(glval) = InitializeParameter[#this] : &:r766_4 +# 766| r766_6(glval) = Load : &:r766_4, ~m? +# 766| mu766_7(Derived) = InitializeIndirection[#this] : &:r766_6 +# 766| r766_8(glval) = ConvertToNonVirtualBase[Derived : Middle] : mu766_5 +# 766| r766_9(glval) = FunctionAddress[Middle] : +# 766| v766_10(void) = Call : func:r766_9, this:r766_8 +# 766| mu766_11(unknown) = ^CallSideEffect : ~m? +# 766| mu766_12(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r766_8 +# 766| r766_13(glval) = FieldAddress[derived_s] : mu766_5 +# 766| r766_14(glval) = FunctionAddress[String] : +# 766| v766_15(void) = Call : func:r766_14, this:r766_13 +# 766| mu766_16(unknown) = ^CallSideEffect : ~m? +# 766| mu766_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r766_13 # 767| v767_1(void) = NoOp : -# 766| v766_15(void) = ReturnVoid : -# 766| v766_16(void) = AliasedUse : ~m? -# 766| v766_17(void) = ExitFunction : +# 766| v766_18(void) = ReturnVoid : +# 766| v766_19(void) = AliasedUse : ~m? +# 766| v766_20(void) = ExitFunction : # 768| void Derived::~Derived() # 768| Block 0 -# 768| v768_1(void) = EnterFunction : -# 768| mu768_2(unknown) = AliasedDefinition : -# 768| mu768_3(unknown) = InitializeNonLocal : -# 768| r768_4(glval) = InitializeThis : -# 769| v769_1(void) = NoOp : -# 769| r769_2(glval) = FieldAddress[derived_s] : r768_4 -# 769| r769_3(glval) = FunctionAddress[~String] : -# 769| v769_4(void) = Call : func:r769_3, this:r769_2 -# 769| mu769_5(unknown) = ^CallSideEffect : ~m? -# 769| r769_6(glval) = ConvertToNonVirtualBase[Derived : Middle] : r768_4 -# 769| r769_7(glval) = FunctionAddress[~Middle] : -# 769| v769_8(void) = Call : func:r769_7, this:r769_6 -# 769| mu769_9(unknown) = ^CallSideEffect : ~m? -# 768| v768_5(void) = ReturnVoid : -# 768| v768_6(void) = AliasedUse : ~m? -# 768| v768_7(void) = ExitFunction : +# 768| v768_1(void) = EnterFunction : +# 768| mu768_2(unknown) = AliasedDefinition : +# 768| mu768_3(unknown) = InitializeNonLocal : +# 768| r768_4(glval) = VariableAddress[#this] : +# 768| mu768_5(glval) = InitializeParameter[#this] : &:r768_4 +# 768| r768_6(glval) = Load : &:r768_4, ~m? +# 768| mu768_7(Derived) = InitializeIndirection[#this] : &:r768_6 +# 769| v769_1(void) = NoOp : +# 769| r769_2(glval) = FieldAddress[derived_s] : mu768_5 +# 769| r769_3(glval) = FunctionAddress[~String] : +# 769| v769_4(void) = Call : func:r769_3, this:r769_2 +# 769| mu769_5(unknown) = ^CallSideEffect : ~m? +# 769| r769_6(glval) = ConvertToNonVirtualBase[Derived : Middle] : mu768_5 +# 769| r769_7(glval) = FunctionAddress[~Middle] : +# 769| v769_8(void) = Call : func:r769_7, this:r769_6 +# 769| mu769_9(unknown) = ^CallSideEffect : ~m? +# 768| v768_8(void) = ReturnVoid : +# 768| v768_9(void) = AliasedUse : ~m? +# 768| v768_10(void) = ExitFunction : # 775| void MiddleVB1::MiddleVB1() # 775| Block 0 -# 775| v775_1(void) = EnterFunction : -# 775| mu775_2(unknown) = AliasedDefinition : -# 775| mu775_3(unknown) = InitializeNonLocal : -# 775| r775_4(glval) = InitializeThis : -# 775| r775_5(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : r775_4 -# 775| r775_6(glval) = FunctionAddress[Base] : -# 775| v775_7(void) = Call : func:r775_6, this:r775_5 -# 775| mu775_8(unknown) = ^CallSideEffect : ~m? -# 775| mu775_9(Base) = ^IndirectMayWriteSideEffect[-1] : &:r775_5 -# 775| r775_10(glval) = FieldAddress[middlevb1_s] : r775_4 -# 775| r775_11(glval) = FunctionAddress[String] : -# 775| v775_12(void) = Call : func:r775_11, this:r775_10 -# 775| mu775_13(unknown) = ^CallSideEffect : ~m? -# 775| mu775_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r775_10 -# 776| v776_1(void) = NoOp : -# 775| v775_15(void) = ReturnVoid : -# 775| v775_16(void) = AliasedUse : ~m? -# 775| v775_17(void) = ExitFunction : +# 775| v775_1(void) = EnterFunction : +# 775| mu775_2(unknown) = AliasedDefinition : +# 775| mu775_3(unknown) = InitializeNonLocal : +# 775| r775_4(glval) = VariableAddress[#this] : +# 775| mu775_5(glval) = InitializeParameter[#this] : &:r775_4 +# 775| r775_6(glval) = Load : &:r775_4, ~m? +# 775| mu775_7(MiddleVB1) = InitializeIndirection[#this] : &:r775_6 +# 775| r775_8(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : mu775_5 +# 775| r775_9(glval) = FunctionAddress[Base] : +# 775| v775_10(void) = Call : func:r775_9, this:r775_8 +# 775| mu775_11(unknown) = ^CallSideEffect : ~m? +# 775| mu775_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r775_8 +# 775| r775_13(glval) = FieldAddress[middlevb1_s] : mu775_5 +# 775| r775_14(glval) = FunctionAddress[String] : +# 775| v775_15(void) = Call : func:r775_14, this:r775_13 +# 775| mu775_16(unknown) = ^CallSideEffect : ~m? +# 775| mu775_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r775_13 +# 776| v776_1(void) = NoOp : +# 775| v775_18(void) = ReturnVoid : +# 775| v775_19(void) = AliasedUse : ~m? +# 775| v775_20(void) = ExitFunction : # 777| void MiddleVB1::~MiddleVB1() # 777| Block 0 -# 777| v777_1(void) = EnterFunction : -# 777| mu777_2(unknown) = AliasedDefinition : -# 777| mu777_3(unknown) = InitializeNonLocal : -# 777| r777_4(glval) = InitializeThis : -# 778| v778_1(void) = NoOp : -# 778| r778_2(glval) = FieldAddress[middlevb1_s] : r777_4 -# 778| r778_3(glval) = FunctionAddress[~String] : -# 778| v778_4(void) = Call : func:r778_3, this:r778_2 -# 778| mu778_5(unknown) = ^CallSideEffect : ~m? -# 778| r778_6(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : r777_4 -# 778| r778_7(glval) = FunctionAddress[~Base] : -# 778| v778_8(void) = Call : func:r778_7, this:r778_6 -# 778| mu778_9(unknown) = ^CallSideEffect : ~m? -# 777| v777_5(void) = ReturnVoid : -# 777| v777_6(void) = AliasedUse : ~m? -# 777| v777_7(void) = ExitFunction : +# 777| v777_1(void) = EnterFunction : +# 777| mu777_2(unknown) = AliasedDefinition : +# 777| mu777_3(unknown) = InitializeNonLocal : +# 777| r777_4(glval) = VariableAddress[#this] : +# 777| mu777_5(glval) = InitializeParameter[#this] : &:r777_4 +# 777| r777_6(glval) = Load : &:r777_4, ~m? +# 777| mu777_7(MiddleVB1) = InitializeIndirection[#this] : &:r777_6 +# 778| v778_1(void) = NoOp : +# 778| r778_2(glval) = FieldAddress[middlevb1_s] : mu777_5 +# 778| r778_3(glval) = FunctionAddress[~String] : +# 778| v778_4(void) = Call : func:r778_3, this:r778_2 +# 778| mu778_5(unknown) = ^CallSideEffect : ~m? +# 778| r778_6(glval) = ConvertToNonVirtualBase[MiddleVB1 : Base] : mu777_5 +# 778| r778_7(glval) = FunctionAddress[~Base] : +# 778| v778_8(void) = Call : func:r778_7, this:r778_6 +# 778| mu778_9(unknown) = ^CallSideEffect : ~m? +# 777| v777_8(void) = ReturnVoid : +# 777| v777_9(void) = AliasedUse : ~m? +# 777| v777_10(void) = ExitFunction : # 784| void MiddleVB2::MiddleVB2() # 784| Block 0 -# 784| v784_1(void) = EnterFunction : -# 784| mu784_2(unknown) = AliasedDefinition : -# 784| mu784_3(unknown) = InitializeNonLocal : -# 784| r784_4(glval) = InitializeThis : -# 784| r784_5(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : r784_4 -# 784| r784_6(glval) = FunctionAddress[Base] : -# 784| v784_7(void) = Call : func:r784_6, this:r784_5 -# 784| mu784_8(unknown) = ^CallSideEffect : ~m? -# 784| mu784_9(Base) = ^IndirectMayWriteSideEffect[-1] : &:r784_5 -# 784| r784_10(glval) = FieldAddress[middlevb2_s] : r784_4 -# 784| r784_11(glval) = FunctionAddress[String] : -# 784| v784_12(void) = Call : func:r784_11, this:r784_10 -# 784| mu784_13(unknown) = ^CallSideEffect : ~m? -# 784| mu784_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r784_10 -# 785| v785_1(void) = NoOp : -# 784| v784_15(void) = ReturnVoid : -# 784| v784_16(void) = AliasedUse : ~m? -# 784| v784_17(void) = ExitFunction : +# 784| v784_1(void) = EnterFunction : +# 784| mu784_2(unknown) = AliasedDefinition : +# 784| mu784_3(unknown) = InitializeNonLocal : +# 784| r784_4(glval) = VariableAddress[#this] : +# 784| mu784_5(glval) = InitializeParameter[#this] : &:r784_4 +# 784| r784_6(glval) = Load : &:r784_4, ~m? +# 784| mu784_7(MiddleVB2) = InitializeIndirection[#this] : &:r784_6 +# 784| r784_8(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : mu784_5 +# 784| r784_9(glval) = FunctionAddress[Base] : +# 784| v784_10(void) = Call : func:r784_9, this:r784_8 +# 784| mu784_11(unknown) = ^CallSideEffect : ~m? +# 784| mu784_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r784_8 +# 784| r784_13(glval) = FieldAddress[middlevb2_s] : mu784_5 +# 784| r784_14(glval) = FunctionAddress[String] : +# 784| v784_15(void) = Call : func:r784_14, this:r784_13 +# 784| mu784_16(unknown) = ^CallSideEffect : ~m? +# 784| mu784_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r784_13 +# 785| v785_1(void) = NoOp : +# 784| v784_18(void) = ReturnVoid : +# 784| v784_19(void) = AliasedUse : ~m? +# 784| v784_20(void) = ExitFunction : # 786| void MiddleVB2::~MiddleVB2() # 786| Block 0 -# 786| v786_1(void) = EnterFunction : -# 786| mu786_2(unknown) = AliasedDefinition : -# 786| mu786_3(unknown) = InitializeNonLocal : -# 786| r786_4(glval) = InitializeThis : -# 787| v787_1(void) = NoOp : -# 787| r787_2(glval) = FieldAddress[middlevb2_s] : r786_4 -# 787| r787_3(glval) = FunctionAddress[~String] : -# 787| v787_4(void) = Call : func:r787_3, this:r787_2 -# 787| mu787_5(unknown) = ^CallSideEffect : ~m? -# 787| r787_6(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : r786_4 -# 787| r787_7(glval) = FunctionAddress[~Base] : -# 787| v787_8(void) = Call : func:r787_7, this:r787_6 -# 787| mu787_9(unknown) = ^CallSideEffect : ~m? -# 786| v786_5(void) = ReturnVoid : -# 786| v786_6(void) = AliasedUse : ~m? -# 786| v786_7(void) = ExitFunction : +# 786| v786_1(void) = EnterFunction : +# 786| mu786_2(unknown) = AliasedDefinition : +# 786| mu786_3(unknown) = InitializeNonLocal : +# 786| r786_4(glval) = VariableAddress[#this] : +# 786| mu786_5(glval) = InitializeParameter[#this] : &:r786_4 +# 786| r786_6(glval) = Load : &:r786_4, ~m? +# 786| mu786_7(MiddleVB2) = InitializeIndirection[#this] : &:r786_6 +# 787| v787_1(void) = NoOp : +# 787| r787_2(glval) = FieldAddress[middlevb2_s] : mu786_5 +# 787| r787_3(glval) = FunctionAddress[~String] : +# 787| v787_4(void) = Call : func:r787_3, this:r787_2 +# 787| mu787_5(unknown) = ^CallSideEffect : ~m? +# 787| r787_6(glval) = ConvertToNonVirtualBase[MiddleVB2 : Base] : mu786_5 +# 787| r787_7(glval) = FunctionAddress[~Base] : +# 787| v787_8(void) = Call : func:r787_7, this:r787_6 +# 787| mu787_9(unknown) = ^CallSideEffect : ~m? +# 786| v786_8(void) = ReturnVoid : +# 786| v786_9(void) = AliasedUse : ~m? +# 786| v786_10(void) = ExitFunction : # 793| void DerivedVB::DerivedVB() # 793| Block 0 # 793| v793_1(void) = EnterFunction : # 793| mu793_2(unknown) = AliasedDefinition : # 793| mu793_3(unknown) = InitializeNonLocal : -# 793| r793_4(glval) = InitializeThis : -# 793| r793_5(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : r793_4 -# 793| r793_6(glval) = FunctionAddress[Base] : -# 793| v793_7(void) = Call : func:r793_6, this:r793_5 -# 793| mu793_8(unknown) = ^CallSideEffect : ~m? -# 793| mu793_9(Base) = ^IndirectMayWriteSideEffect[-1] : &:r793_5 -# 793| r793_10(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB1] : r793_4 -# 793| r793_11(glval) = FunctionAddress[MiddleVB1] : -# 793| v793_12(void) = Call : func:r793_11, this:r793_10 -# 793| mu793_13(unknown) = ^CallSideEffect : ~m? -# 793| mu793_14(MiddleVB1) = ^IndirectMayWriteSideEffect[-1] : &:r793_10 -# 793| r793_15(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB2] : r793_4 -# 793| r793_16(glval) = FunctionAddress[MiddleVB2] : -# 793| v793_17(void) = Call : func:r793_16, this:r793_15 -# 793| mu793_18(unknown) = ^CallSideEffect : ~m? -# 793| mu793_19(MiddleVB2) = ^IndirectMayWriteSideEffect[-1] : &:r793_15 -# 793| r793_20(glval) = FieldAddress[derivedvb_s] : r793_4 -# 793| r793_21(glval) = FunctionAddress[String] : -# 793| v793_22(void) = Call : func:r793_21, this:r793_20 -# 793| mu793_23(unknown) = ^CallSideEffect : ~m? -# 793| mu793_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r793_20 +# 793| r793_4(glval) = VariableAddress[#this] : +# 793| mu793_5(glval) = InitializeParameter[#this] : &:r793_4 +# 793| r793_6(glval) = Load : &:r793_4, ~m? +# 793| mu793_7(DerivedVB) = InitializeIndirection[#this] : &:r793_6 +# 793| r793_8(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : mu793_5 +# 793| r793_9(glval) = FunctionAddress[Base] : +# 793| v793_10(void) = Call : func:r793_9, this:r793_8 +# 793| mu793_11(unknown) = ^CallSideEffect : ~m? +# 793| mu793_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r793_8 +# 793| r793_13(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB1] : mu793_5 +# 793| r793_14(glval) = FunctionAddress[MiddleVB1] : +# 793| v793_15(void) = Call : func:r793_14, this:r793_13 +# 793| mu793_16(unknown) = ^CallSideEffect : ~m? +# 793| mu793_17(MiddleVB1) = ^IndirectMayWriteSideEffect[-1] : &:r793_13 +# 793| r793_18(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB2] : mu793_5 +# 793| r793_19(glval) = FunctionAddress[MiddleVB2] : +# 793| v793_20(void) = Call : func:r793_19, this:r793_18 +# 793| mu793_21(unknown) = ^CallSideEffect : ~m? +# 793| mu793_22(MiddleVB2) = ^IndirectMayWriteSideEffect[-1] : &:r793_18 +# 793| r793_23(glval) = FieldAddress[derivedvb_s] : mu793_5 +# 793| r793_24(glval) = FunctionAddress[String] : +# 793| v793_25(void) = Call : func:r793_24, this:r793_23 +# 793| mu793_26(unknown) = ^CallSideEffect : ~m? +# 793| mu793_27(String) = ^IndirectMayWriteSideEffect[-1] : &:r793_23 # 794| v794_1(void) = NoOp : -# 793| v793_25(void) = ReturnVoid : -# 793| v793_26(void) = AliasedUse : ~m? -# 793| v793_27(void) = ExitFunction : +# 793| v793_28(void) = ReturnVoid : +# 793| v793_29(void) = AliasedUse : ~m? +# 793| v793_30(void) = ExitFunction : # 795| void DerivedVB::~DerivedVB() # 795| Block 0 # 795| v795_1(void) = EnterFunction : # 795| mu795_2(unknown) = AliasedDefinition : # 795| mu795_3(unknown) = InitializeNonLocal : -# 795| r795_4(glval) = InitializeThis : +# 795| r795_4(glval) = VariableAddress[#this] : +# 795| mu795_5(glval) = InitializeParameter[#this] : &:r795_4 +# 795| r795_6(glval) = Load : &:r795_4, ~m? +# 795| mu795_7(DerivedVB) = InitializeIndirection[#this] : &:r795_6 # 796| v796_1(void) = NoOp : -# 796| r796_2(glval) = FieldAddress[derivedvb_s] : r795_4 +# 796| r796_2(glval) = FieldAddress[derivedvb_s] : mu795_5 # 796| r796_3(glval) = FunctionAddress[~String] : # 796| v796_4(void) = Call : func:r796_3, this:r796_2 # 796| mu796_5(unknown) = ^CallSideEffect : ~m? -# 796| r796_6(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB2] : r795_4 +# 796| r796_6(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB2] : mu795_5 # 796| r796_7(glval) = FunctionAddress[~MiddleVB2] : # 796| v796_8(void) = Call : func:r796_7, this:r796_6 # 796| mu796_9(unknown) = ^CallSideEffect : ~m? -# 796| r796_10(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB1] : r795_4 +# 796| r796_10(glval) = ConvertToNonVirtualBase[DerivedVB : MiddleVB1] : mu795_5 # 796| r796_11(glval) = FunctionAddress[~MiddleVB1] : # 796| v796_12(void) = Call : func:r796_11, this:r796_10 # 796| mu796_13(unknown) = ^CallSideEffect : ~m? -# 796| r796_14(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : r795_4 +# 796| r796_14(glval) = ConvertToNonVirtualBase[DerivedVB : Base] : mu795_5 # 796| r796_15(glval) = FunctionAddress[~Base] : # 796| v796_16(void) = Call : func:r796_15, this:r796_14 # 796| mu796_17(unknown) = ^CallSideEffect : ~m? -# 795| v795_5(void) = ReturnVoid : -# 795| v795_6(void) = AliasedUse : ~m? -# 795| v795_7(void) = ExitFunction : +# 795| v795_8(void) = ReturnVoid : +# 795| v795_9(void) = AliasedUse : ~m? +# 795| v795_10(void) = ExitFunction : # 799| void HierarchyConversions() # 799| Block 0 @@ -4653,45 +4743,54 @@ ir.cpp: # 842| void PolymorphicBase::PolymorphicBase() # 842| Block 0 -# 842| v842_1(void) = EnterFunction : -# 842| mu842_2(unknown) = AliasedDefinition : -# 842| mu842_3(unknown) = InitializeNonLocal : -# 842| r842_4(glval) = InitializeThis : -# 842| v842_5(void) = NoOp : -# 842| v842_6(void) = ReturnVoid : -# 842| v842_7(void) = AliasedUse : ~m? -# 842| v842_8(void) = ExitFunction : +# 842| v842_1(void) = EnterFunction : +# 842| mu842_2(unknown) = AliasedDefinition : +# 842| mu842_3(unknown) = InitializeNonLocal : +# 842| r842_4(glval) = VariableAddress[#this] : +# 842| mu842_5(glval) = InitializeParameter[#this] : &:r842_4 +# 842| r842_6(glval) = Load : &:r842_4, ~m? +# 842| mu842_7(PolymorphicBase) = InitializeIndirection[#this] : &:r842_6 +# 842| v842_8(void) = NoOp : +# 842| v842_9(void) = ReturnVoid : +# 842| v842_10(void) = AliasedUse : ~m? +# 842| v842_11(void) = ExitFunction : # 846| void PolymorphicDerived::PolymorphicDerived() # 846| Block 0 -# 846| v846_1(void) = EnterFunction : -# 846| mu846_2(unknown) = AliasedDefinition : -# 846| mu846_3(unknown) = InitializeNonLocal : -# 846| r846_4(glval) = InitializeThis : -# 846| r846_5(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : r846_4 -# 846| r846_6(glval) = FunctionAddress[PolymorphicBase] : -# 846| v846_7(void) = Call : func:r846_6, this:r846_5 -# 846| mu846_8(unknown) = ^CallSideEffect : ~m? -# 846| mu846_9(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r846_5 -# 846| v846_10(void) = NoOp : -# 846| v846_11(void) = ReturnVoid : -# 846| v846_12(void) = AliasedUse : ~m? -# 846| v846_13(void) = ExitFunction : +# 846| v846_1(void) = EnterFunction : +# 846| mu846_2(unknown) = AliasedDefinition : +# 846| mu846_3(unknown) = InitializeNonLocal : +# 846| r846_4(glval) = VariableAddress[#this] : +# 846| mu846_5(glval) = InitializeParameter[#this] : &:r846_4 +# 846| r846_6(glval) = Load : &:r846_4, ~m? +# 846| mu846_7(PolymorphicDerived) = InitializeIndirection[#this] : &:r846_6 +# 846| r846_8(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : mu846_5 +# 846| r846_9(glval) = FunctionAddress[PolymorphicBase] : +# 846| v846_10(void) = Call : func:r846_9, this:r846_8 +# 846| mu846_11(unknown) = ^CallSideEffect : ~m? +# 846| mu846_12(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r846_8 +# 846| v846_13(void) = NoOp : +# 846| v846_14(void) = ReturnVoid : +# 846| v846_15(void) = AliasedUse : ~m? +# 846| v846_16(void) = ExitFunction : # 846| void PolymorphicDerived::~PolymorphicDerived() # 846| Block 0 -# 846| v846_1(void) = EnterFunction : -# 846| mu846_2(unknown) = AliasedDefinition : -# 846| mu846_3(unknown) = InitializeNonLocal : -# 846| r846_4(glval) = InitializeThis : -#-----| v0_1(void) = NoOp : -# 846| r846_5(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : r846_4 -# 846| r846_6(glval) = FunctionAddress[~PolymorphicBase] : -# 846| v846_7(void) = Call : func:r846_6, this:r846_5 -# 846| mu846_8(unknown) = ^CallSideEffect : ~m? -# 846| v846_9(void) = ReturnVoid : -# 846| v846_10(void) = AliasedUse : ~m? -# 846| v846_11(void) = ExitFunction : +# 846| v846_1(void) = EnterFunction : +# 846| mu846_2(unknown) = AliasedDefinition : +# 846| mu846_3(unknown) = InitializeNonLocal : +# 846| r846_4(glval) = VariableAddress[#this] : +# 846| mu846_5(glval) = InitializeParameter[#this] : &:r846_4 +# 846| r846_6(glval) = Load : &:r846_4, ~m? +# 846| mu846_7(PolymorphicDerived) = InitializeIndirection[#this] : &:r846_6 +#-----| v0_1(void) = NoOp : +# 846| r846_8(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : mu846_5 +# 846| r846_9(glval) = FunctionAddress[~PolymorphicBase] : +# 846| v846_10(void) = Call : func:r846_9, this:r846_8 +# 846| mu846_11(unknown) = ^CallSideEffect : ~m? +# 846| v846_12(void) = ReturnVoid : +# 846| v846_13(void) = AliasedUse : ~m? +# 846| v846_14(void) = ExitFunction : # 849| void DynamicCast() # 849| Block 0 @@ -4758,19 +4857,22 @@ ir.cpp: # 867| v867_1(void) = EnterFunction : # 867| mu867_2(unknown) = AliasedDefinition : # 867| mu867_3(unknown) = InitializeNonLocal : -# 867| r867_4(glval) = InitializeThis : +# 867| r867_4(glval) = VariableAddress[#this] : +# 867| mu867_5(glval) = InitializeParameter[#this] : &:r867_4 +# 867| r867_6(glval) = Load : &:r867_4, ~m? +# 867| mu867_7(String) = InitializeIndirection[#this] : &:r867_6 # 868| r868_1(glval) = FunctionAddress[String] : # 868| r868_2(glval) = StringConstant[""] : # 868| r868_3(char *) = Convert : r868_2 -# 868| v868_4(void) = Call : func:r868_1, this:r867_4, 0:r868_3 +# 868| v868_4(void) = Call : func:r868_1, this:mu867_5, 0:r868_3 # 868| mu868_5(unknown) = ^CallSideEffect : ~m? -# 868| mu868_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r867_4 +# 868| mu868_6(String) = ^IndirectMayWriteSideEffect[-1] : &:mu867_5 # 868| v868_7(void) = ^BufferReadSideEffect[0] : &:r868_3, ~m? # 868| mu868_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r868_3 # 869| v869_1(void) = NoOp : -# 867| v867_5(void) = ReturnVoid : -# 867| v867_6(void) = AliasedUse : ~m? -# 867| v867_7(void) = ExitFunction : +# 867| v867_8(void) = ReturnVoid : +# 867| v867_9(void) = AliasedUse : ~m? +# 867| v867_10(void) = ExitFunction : # 871| void ArrayConversions() # 871| Block 0 @@ -5507,28 +5609,34 @@ ir.cpp: # 1038| void (lambda [] type at line 1038, col. 12)::operator()() const # 1038| Block 0 -# 1038| v1038_1(void) = EnterFunction : -# 1038| mu1038_2(unknown) = AliasedDefinition : -# 1038| mu1038_3(unknown) = InitializeNonLocal : -# 1038| r1038_4(glval) = InitializeThis : -# 1038| v1038_5(void) = NoOp : -# 1038| v1038_6(void) = ReturnVoid : -# 1038| v1038_7(void) = AliasedUse : ~m? -# 1038| v1038_8(void) = ExitFunction : +# 1038| v1038_1(void) = EnterFunction : +# 1038| mu1038_2(unknown) = AliasedDefinition : +# 1038| mu1038_3(unknown) = InitializeNonLocal : +# 1038| r1038_4(glval) = VariableAddress[#this] : +# 1038| mu1038_5(glval) = InitializeParameter[#this] : &:r1038_4 +# 1038| r1038_6(glval) = Load : &:r1038_4, ~m? +# 1038| mu1038_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1038_6 +# 1038| v1038_8(void) = NoOp : +# 1038| v1038_9(void) = ReturnVoid : +# 1038| v1038_10(void) = AliasedUse : ~m? +# 1038| v1038_11(void) = ExitFunction : # 1038| void(* (lambda [] type at line 1038, col. 12)::operator void (*)()() const)() # 1038| Block 0 -# 1038| v1038_1(void) = EnterFunction : -# 1038| mu1038_2(unknown) = AliasedDefinition : -# 1038| mu1038_3(unknown) = InitializeNonLocal : -# 1038| r1038_4(glval) = InitializeThis : -# 1038| r1038_5(glval<..(*)(..)>) = VariableAddress[#return] : -# 1038| r1038_6(..(*)(..)) = FunctionAddress[_FUN] : -# 1038| mu1038_7(..(*)(..)) = Store : &:r1038_5, r1038_6 -# 1038| r1038_8(glval<..(*)(..)>) = VariableAddress[#return] : -# 1038| v1038_9(void) = ReturnValue : &:r1038_8, ~m? -# 1038| v1038_10(void) = AliasedUse : ~m? -# 1038| v1038_11(void) = ExitFunction : +# 1038| v1038_1(void) = EnterFunction : +# 1038| mu1038_2(unknown) = AliasedDefinition : +# 1038| mu1038_3(unknown) = InitializeNonLocal : +# 1038| r1038_4(glval) = VariableAddress[#this] : +# 1038| mu1038_5(glval) = InitializeParameter[#this] : &:r1038_4 +# 1038| r1038_6(glval) = Load : &:r1038_4, ~m? +# 1038| mu1038_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1038_6 +# 1038| r1038_8(glval<..(*)(..)>) = VariableAddress[#return] : +# 1038| r1038_9(..(*)(..)) = FunctionAddress[_FUN] : +# 1038| mu1038_10(..(*)(..)) = Store : &:r1038_8, r1038_9 +# 1038| r1038_11(glval<..(*)(..)>) = VariableAddress[#return] : +# 1038| v1038_12(void) = ReturnValue : &:r1038_11, ~m? +# 1038| v1038_13(void) = AliasedUse : ~m? +# 1038| v1038_14(void) = ExitFunction : # 1040| void Lambda(int, String const&) # 1040| Block 0 @@ -5699,239 +5807,281 @@ ir.cpp: # 1041| char (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::operator()(float) const # 1041| Block 0 -# 1041| v1041_1(void) = EnterFunction : -# 1041| mu1041_2(unknown) = AliasedDefinition : -# 1041| mu1041_3(unknown) = InitializeNonLocal : -# 1041| r1041_4(glval) = InitializeThis : -# 1041| r1041_5(glval) = VariableAddress[f] : -# 1041| mu1041_6(float) = InitializeParameter[f] : &:r1041_5 -# 1041| r1041_7(glval) = VariableAddress[#return] : -# 1041| r1041_8(char) = Constant[65] : -# 1041| mu1041_9(char) = Store : &:r1041_7, r1041_8 -# 1041| r1041_10(glval) = VariableAddress[#return] : -# 1041| v1041_11(void) = ReturnValue : &:r1041_10, ~m? -# 1041| v1041_12(void) = AliasedUse : ~m? -# 1041| v1041_13(void) = ExitFunction : +# 1041| v1041_1(void) = EnterFunction : +# 1041| mu1041_2(unknown) = AliasedDefinition : +# 1041| mu1041_3(unknown) = InitializeNonLocal : +# 1041| r1041_4(glval) = VariableAddress[#this] : +# 1041| mu1041_5(glval) = InitializeParameter[#this] : &:r1041_4 +# 1041| r1041_6(glval) = Load : &:r1041_4, ~m? +# 1041| mu1041_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1041_6 +# 1041| r1041_8(glval) = VariableAddress[f] : +# 1041| mu1041_9(float) = InitializeParameter[f] : &:r1041_8 +# 1041| r1041_10(glval) = VariableAddress[#return] : +# 1041| r1041_11(char) = Constant[65] : +# 1041| mu1041_12(char) = Store : &:r1041_10, r1041_11 +# 1041| r1041_13(glval) = VariableAddress[#return] : +# 1041| v1041_14(void) = ReturnValue : &:r1041_13, ~m? +# 1041| v1041_15(void) = AliasedUse : ~m? +# 1041| v1041_16(void) = ExitFunction : # 1041| char(* (void Lambda(int, String const&))::(lambda [] type at line 1041, col. 23)::operator char (*)(float)() const)(float) # 1041| Block 0 -# 1041| v1041_1(void) = EnterFunction : -# 1041| mu1041_2(unknown) = AliasedDefinition : -# 1041| mu1041_3(unknown) = InitializeNonLocal : -# 1041| r1041_4(glval) = InitializeThis : -# 1041| r1041_5(glval<..(*)(..)>) = VariableAddress[#return] : -# 1041| r1041_6(..(*)(..)) = FunctionAddress[_FUN] : -# 1041| mu1041_7(..(*)(..)) = Store : &:r1041_5, r1041_6 -# 1041| r1041_8(glval<..(*)(..)>) = VariableAddress[#return] : -# 1041| v1041_9(void) = ReturnValue : &:r1041_8, ~m? -# 1041| v1041_10(void) = AliasedUse : ~m? -# 1041| v1041_11(void) = ExitFunction : +# 1041| v1041_1(void) = EnterFunction : +# 1041| mu1041_2(unknown) = AliasedDefinition : +# 1041| mu1041_3(unknown) = InitializeNonLocal : +# 1041| r1041_4(glval) = VariableAddress[#this] : +# 1041| mu1041_5(glval) = InitializeParameter[#this] : &:r1041_4 +# 1041| r1041_6(glval) = Load : &:r1041_4, ~m? +# 1041| mu1041_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1041_6 +# 1041| r1041_8(glval<..(*)(..)>) = VariableAddress[#return] : +# 1041| r1041_9(..(*)(..)) = FunctionAddress[_FUN] : +# 1041| mu1041_10(..(*)(..)) = Store : &:r1041_8, r1041_9 +# 1041| r1041_11(glval<..(*)(..)>) = VariableAddress[#return] : +# 1041| v1041_12(void) = ReturnValue : &:r1041_11, ~m? +# 1041| v1041_13(void) = AliasedUse : ~m? +# 1041| v1041_14(void) = ExitFunction : # 1043| char (void Lambda(int, String const&))::(lambda [] type at line 1043, col. 21)::operator()(float) const # 1043| Block 0 # 1043| v1043_1(void) = EnterFunction : # 1043| mu1043_2(unknown) = AliasedDefinition : # 1043| mu1043_3(unknown) = InitializeNonLocal : -# 1043| r1043_4(glval) = InitializeThis : -# 1043| r1043_5(glval) = VariableAddress[f] : -# 1043| mu1043_6(float) = InitializeParameter[f] : &:r1043_5 -# 1043| r1043_7(glval) = VariableAddress[#return] : -#-----| r0_1(lambda [] type at line 1043, col. 21 *) = CopyValue : r1043_4 -#-----| r0_2(glval) = FieldAddress[s] : r0_1 -#-----| r0_3(String &) = Load : &:r0_2, ~m? -# 1043| r1043_8(glval) = CopyValue : r0_3 -# 1043| r1043_9(glval) = FunctionAddress[c_str] : -# 1043| r1043_10(char *) = Call : func:r1043_9, this:r1043_8 -# 1043| mu1043_11(unknown) = ^CallSideEffect : ~m? -# 1043| v1043_12(void) = ^BufferReadSideEffect[-1] : &:r1043_8, ~m? -# 1043| mu1043_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1043_8 -#-----| r0_4(lambda [] type at line 1043, col. 21 *) = CopyValue : r1043_4 -#-----| r0_5(glval) = FieldAddress[x] : r0_4 -#-----| r0_6(int &) = Load : &:r0_5, ~m? -# 1043| r1043_14(int) = Load : &:r0_6, ~m? -# 1043| r1043_15(glval) = PointerAdd[1] : r1043_10, r1043_14 -# 1043| r1043_16(char) = Load : &:r1043_15, ~m? -# 1043| mu1043_17(char) = Store : &:r1043_7, r1043_16 -# 1043| r1043_18(glval) = VariableAddress[#return] : -# 1043| v1043_19(void) = ReturnValue : &:r1043_18, ~m? -# 1043| v1043_20(void) = AliasedUse : ~m? -# 1043| v1043_21(void) = ExitFunction : +# 1043| r1043_4(glval) = VariableAddress[#this] : +# 1043| mu1043_5(glval) = InitializeParameter[#this] : &:r1043_4 +# 1043| r1043_6(glval) = Load : &:r1043_4, ~m? +# 1043| mu1043_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1043_6 +# 1043| r1043_8(glval) = VariableAddress[f] : +# 1043| mu1043_9(float) = InitializeParameter[f] : &:r1043_8 +# 1043| r1043_10(glval) = VariableAddress[#return] : +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(lambda [] type at line 1043, col. 21 *) = Load : &:r0_1, ~m? +#-----| r0_3(glval) = FieldAddress[s] : r0_2 +#-----| r0_4(String &) = Load : &:r0_3, ~m? +# 1043| r1043_11(glval) = CopyValue : r0_4 +# 1043| r1043_12(glval) = FunctionAddress[c_str] : +# 1043| r1043_13(char *) = Call : func:r1043_12, this:r1043_11 +# 1043| mu1043_14(unknown) = ^CallSideEffect : ~m? +# 1043| v1043_15(void) = ^BufferReadSideEffect[-1] : &:r1043_11, ~m? +# 1043| mu1043_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r1043_11 +#-----| r0_5(glval) = VariableAddress[#this] : +#-----| r0_6(lambda [] type at line 1043, col. 21 *) = Load : &:r0_5, ~m? +#-----| r0_7(glval) = FieldAddress[x] : r0_6 +#-----| r0_8(int &) = Load : &:r0_7, ~m? +# 1043| r1043_17(int) = Load : &:r0_8, ~m? +# 1043| r1043_18(glval) = PointerAdd[1] : r1043_13, r1043_17 +# 1043| r1043_19(char) = Load : &:r1043_18, ~m? +# 1043| mu1043_20(char) = Store : &:r1043_10, r1043_19 +# 1043| r1043_21(glval) = VariableAddress[#return] : +# 1043| v1043_22(void) = ReturnValue : &:r1043_21, ~m? +# 1043| v1043_23(void) = AliasedUse : ~m? +# 1043| v1043_24(void) = ExitFunction : # 1045| void (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::~() # 1045| Block 0 -# 1045| v1045_1(void) = EnterFunction : -# 1045| mu1045_2(unknown) = AliasedDefinition : -# 1045| mu1045_3(unknown) = InitializeNonLocal : -# 1045| r1045_4(glval) = InitializeThis : -#-----| v0_1(void) = NoOp : -# 1045| r1045_5(glval) = FieldAddress[s] : r1045_4 -# 1045| r1045_6(glval) = FunctionAddress[~String] : -# 1045| v1045_7(void) = Call : func:r1045_6, this:r1045_5 -# 1045| mu1045_8(unknown) = ^CallSideEffect : ~m? -# 1045| v1045_9(void) = ReturnVoid : -# 1045| v1045_10(void) = AliasedUse : ~m? -# 1045| v1045_11(void) = ExitFunction : +# 1045| v1045_1(void) = EnterFunction : +# 1045| mu1045_2(unknown) = AliasedDefinition : +# 1045| mu1045_3(unknown) = InitializeNonLocal : +# 1045| r1045_4(glval) = VariableAddress[#this] : +# 1045| mu1045_5(glval) = InitializeParameter[#this] : &:r1045_4 +# 1045| r1045_6(glval) = Load : &:r1045_4, ~m? +# 1045| mu1045_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1045_6 +#-----| v0_1(void) = NoOp : +# 1045| r1045_8(glval) = FieldAddress[s] : mu1045_5 +# 1045| r1045_9(glval) = FunctionAddress[~String] : +# 1045| v1045_10(void) = Call : func:r1045_9, this:r1045_8 +# 1045| mu1045_11(unknown) = ^CallSideEffect : ~m? +# 1045| v1045_12(void) = ReturnVoid : +# 1045| v1045_13(void) = AliasedUse : ~m? +# 1045| v1045_14(void) = ExitFunction : # 1045| char (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 21)::operator()(float) const # 1045| Block 0 # 1045| v1045_1(void) = EnterFunction : # 1045| mu1045_2(unknown) = AliasedDefinition : # 1045| mu1045_3(unknown) = InitializeNonLocal : -# 1045| r1045_4(glval) = InitializeThis : -# 1045| r1045_5(glval) = VariableAddress[f] : -# 1045| mu1045_6(float) = InitializeParameter[f] : &:r1045_5 -# 1045| r1045_7(glval) = VariableAddress[#return] : -#-----| r0_1(lambda [] type at line 1045, col. 21 *) = CopyValue : r1045_4 -#-----| r0_2(glval) = FieldAddress[s] : r0_1 -# 1045| r1045_8(glval) = FunctionAddress[c_str] : -# 1045| r1045_9(char *) = Call : func:r1045_8, this:r0_2 -# 1045| mu1045_10(unknown) = ^CallSideEffect : ~m? -#-----| v0_3(void) = ^BufferReadSideEffect[-1] : &:r0_2, ~m? -#-----| mu0_4(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_2 -#-----| r0_5(lambda [] type at line 1045, col. 21 *) = CopyValue : r1045_4 -#-----| r0_6(glval) = FieldAddress[x] : r0_5 -#-----| r0_7(int) = Load : &:r0_6, ~m? -# 1045| r1045_11(glval) = PointerAdd[1] : r1045_9, r0_7 -# 1045| r1045_12(char) = Load : &:r1045_11, ~m? -# 1045| mu1045_13(char) = Store : &:r1045_7, r1045_12 -# 1045| r1045_14(glval) = VariableAddress[#return] : -# 1045| v1045_15(void) = ReturnValue : &:r1045_14, ~m? -# 1045| v1045_16(void) = AliasedUse : ~m? -# 1045| v1045_17(void) = ExitFunction : +# 1045| r1045_4(glval) = VariableAddress[#this] : +# 1045| mu1045_5(glval) = InitializeParameter[#this] : &:r1045_4 +# 1045| r1045_6(glval) = Load : &:r1045_4, ~m? +# 1045| mu1045_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1045_6 +# 1045| r1045_8(glval) = VariableAddress[f] : +# 1045| mu1045_9(float) = InitializeParameter[f] : &:r1045_8 +# 1045| r1045_10(glval) = VariableAddress[#return] : +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(lambda [] type at line 1045, col. 21 *) = Load : &:r0_1, ~m? +#-----| r0_3(glval) = FieldAddress[s] : r0_2 +# 1045| r1045_11(glval) = FunctionAddress[c_str] : +# 1045| r1045_12(char *) = Call : func:r1045_11, this:r0_3 +# 1045| mu1045_13(unknown) = ^CallSideEffect : ~m? +#-----| v0_4(void) = ^BufferReadSideEffect[-1] : &:r0_3, ~m? +#-----| mu0_5(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_3 +#-----| r0_6(glval) = VariableAddress[#this] : +#-----| r0_7(lambda [] type at line 1045, col. 21 *) = Load : &:r0_6, ~m? +#-----| r0_8(glval) = FieldAddress[x] : r0_7 +#-----| r0_9(int) = Load : &:r0_8, ~m? +# 1045| r1045_14(glval) = PointerAdd[1] : r1045_12, r0_9 +# 1045| r1045_15(char) = Load : &:r1045_14, ~m? +# 1045| mu1045_16(char) = Store : &:r1045_10, r1045_15 +# 1045| r1045_17(glval) = VariableAddress[#return] : +# 1045| v1045_18(void) = ReturnValue : &:r1045_17, ~m? +# 1045| v1045_19(void) = AliasedUse : ~m? +# 1045| v1045_20(void) = ExitFunction : # 1047| char (void Lambda(int, String const&))::(lambda [] type at line 1047, col. 30)::operator()(float) const # 1047| Block 0 # 1047| v1047_1(void) = EnterFunction : # 1047| mu1047_2(unknown) = AliasedDefinition : # 1047| mu1047_3(unknown) = InitializeNonLocal : -# 1047| r1047_4(glval) = InitializeThis : -# 1047| r1047_5(glval) = VariableAddress[f] : -# 1047| mu1047_6(float) = InitializeParameter[f] : &:r1047_5 -# 1047| r1047_7(glval) = VariableAddress[#return] : -#-----| r0_1(lambda [] type at line 1047, col. 30 *) = CopyValue : r1047_4 -#-----| r0_2(glval) = FieldAddress[s] : r0_1 -#-----| r0_3(String &) = Load : &:r0_2, ~m? -# 1047| r1047_8(glval) = CopyValue : r0_3 -# 1047| r1047_9(glval) = FunctionAddress[c_str] : -# 1047| r1047_10(char *) = Call : func:r1047_9, this:r1047_8 -# 1047| mu1047_11(unknown) = ^CallSideEffect : ~m? -# 1047| v1047_12(void) = ^BufferReadSideEffect[-1] : &:r1047_8, ~m? -# 1047| mu1047_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1047_8 -# 1047| r1047_14(int) = Constant[0] : -# 1047| r1047_15(glval) = PointerAdd[1] : r1047_10, r1047_14 -# 1047| r1047_16(char) = Load : &:r1047_15, ~m? -# 1047| mu1047_17(char) = Store : &:r1047_7, r1047_16 -# 1047| r1047_18(glval) = VariableAddress[#return] : -# 1047| v1047_19(void) = ReturnValue : &:r1047_18, ~m? -# 1047| v1047_20(void) = AliasedUse : ~m? -# 1047| v1047_21(void) = ExitFunction : +# 1047| r1047_4(glval) = VariableAddress[#this] : +# 1047| mu1047_5(glval) = InitializeParameter[#this] : &:r1047_4 +# 1047| r1047_6(glval) = Load : &:r1047_4, ~m? +# 1047| mu1047_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1047_6 +# 1047| r1047_8(glval) = VariableAddress[f] : +# 1047| mu1047_9(float) = InitializeParameter[f] : &:r1047_8 +# 1047| r1047_10(glval) = VariableAddress[#return] : +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(lambda [] type at line 1047, col. 30 *) = Load : &:r0_1, ~m? +#-----| r0_3(glval) = FieldAddress[s] : r0_2 +#-----| r0_4(String &) = Load : &:r0_3, ~m? +# 1047| r1047_11(glval) = CopyValue : r0_4 +# 1047| r1047_12(glval) = FunctionAddress[c_str] : +# 1047| r1047_13(char *) = Call : func:r1047_12, this:r1047_11 +# 1047| mu1047_14(unknown) = ^CallSideEffect : ~m? +# 1047| v1047_15(void) = ^BufferReadSideEffect[-1] : &:r1047_11, ~m? +# 1047| mu1047_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r1047_11 +# 1047| r1047_17(int) = Constant[0] : +# 1047| r1047_18(glval) = PointerAdd[1] : r1047_13, r1047_17 +# 1047| r1047_19(char) = Load : &:r1047_18, ~m? +# 1047| mu1047_20(char) = Store : &:r1047_10, r1047_19 +# 1047| r1047_21(glval) = VariableAddress[#return] : +# 1047| v1047_22(void) = ReturnValue : &:r1047_21, ~m? +# 1047| v1047_23(void) = AliasedUse : ~m? +# 1047| v1047_24(void) = ExitFunction : # 1049| void (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::~() # 1049| Block 0 -# 1049| v1049_1(void) = EnterFunction : -# 1049| mu1049_2(unknown) = AliasedDefinition : -# 1049| mu1049_3(unknown) = InitializeNonLocal : -# 1049| r1049_4(glval) = InitializeThis : -#-----| v0_1(void) = NoOp : -# 1049| r1049_5(glval) = FieldAddress[s] : r1049_4 -# 1049| r1049_6(glval) = FunctionAddress[~String] : -# 1049| v1049_7(void) = Call : func:r1049_6, this:r1049_5 -# 1049| mu1049_8(unknown) = ^CallSideEffect : ~m? -# 1049| v1049_9(void) = ReturnVoid : -# 1049| v1049_10(void) = AliasedUse : ~m? -# 1049| v1049_11(void) = ExitFunction : +# 1049| v1049_1(void) = EnterFunction : +# 1049| mu1049_2(unknown) = AliasedDefinition : +# 1049| mu1049_3(unknown) = InitializeNonLocal : +# 1049| r1049_4(glval) = VariableAddress[#this] : +# 1049| mu1049_5(glval) = InitializeParameter[#this] : &:r1049_4 +# 1049| r1049_6(glval) = Load : &:r1049_4, ~m? +# 1049| mu1049_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1049_6 +#-----| v0_1(void) = NoOp : +# 1049| r1049_8(glval) = FieldAddress[s] : mu1049_5 +# 1049| r1049_9(glval) = FunctionAddress[~String] : +# 1049| v1049_10(void) = Call : func:r1049_9, this:r1049_8 +# 1049| mu1049_11(unknown) = ^CallSideEffect : ~m? +# 1049| v1049_12(void) = ReturnVoid : +# 1049| v1049_13(void) = AliasedUse : ~m? +# 1049| v1049_14(void) = ExitFunction : # 1049| char (void Lambda(int, String const&))::(lambda [] type at line 1049, col. 30)::operator()(float) const # 1049| Block 0 # 1049| v1049_1(void) = EnterFunction : # 1049| mu1049_2(unknown) = AliasedDefinition : # 1049| mu1049_3(unknown) = InitializeNonLocal : -# 1049| r1049_4(glval) = InitializeThis : -# 1049| r1049_5(glval) = VariableAddress[f] : -# 1049| mu1049_6(float) = InitializeParameter[f] : &:r1049_5 -# 1049| r1049_7(glval) = VariableAddress[#return] : -#-----| r0_1(lambda [] type at line 1049, col. 30 *) = CopyValue : r1049_4 -#-----| r0_2(glval) = FieldAddress[s] : r0_1 -# 1049| r1049_8(glval) = FunctionAddress[c_str] : -# 1049| r1049_9(char *) = Call : func:r1049_8, this:r0_2 -# 1049| mu1049_10(unknown) = ^CallSideEffect : ~m? -#-----| v0_3(void) = ^BufferReadSideEffect[-1] : &:r0_2, ~m? -#-----| mu0_4(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_2 -# 1049| r1049_11(int) = Constant[0] : -# 1049| r1049_12(glval) = PointerAdd[1] : r1049_9, r1049_11 -# 1049| r1049_13(char) = Load : &:r1049_12, ~m? -# 1049| mu1049_14(char) = Store : &:r1049_7, r1049_13 -# 1049| r1049_15(glval) = VariableAddress[#return] : -# 1049| v1049_16(void) = ReturnValue : &:r1049_15, ~m? -# 1049| v1049_17(void) = AliasedUse : ~m? -# 1049| v1049_18(void) = ExitFunction : +# 1049| r1049_4(glval) = VariableAddress[#this] : +# 1049| mu1049_5(glval) = InitializeParameter[#this] : &:r1049_4 +# 1049| r1049_6(glval) = Load : &:r1049_4, ~m? +# 1049| mu1049_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1049_6 +# 1049| r1049_8(glval) = VariableAddress[f] : +# 1049| mu1049_9(float) = InitializeParameter[f] : &:r1049_8 +# 1049| r1049_10(glval) = VariableAddress[#return] : +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(lambda [] type at line 1049, col. 30 *) = Load : &:r0_1, ~m? +#-----| r0_3(glval) = FieldAddress[s] : r0_2 +# 1049| r1049_11(glval) = FunctionAddress[c_str] : +# 1049| r1049_12(char *) = Call : func:r1049_11, this:r0_3 +# 1049| mu1049_13(unknown) = ^CallSideEffect : ~m? +#-----| v0_4(void) = ^BufferReadSideEffect[-1] : &:r0_3, ~m? +#-----| mu0_5(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_3 +# 1049| r1049_14(int) = Constant[0] : +# 1049| r1049_15(glval) = PointerAdd[1] : r1049_12, r1049_14 +# 1049| r1049_16(char) = Load : &:r1049_15, ~m? +# 1049| mu1049_17(char) = Store : &:r1049_10, r1049_16 +# 1049| r1049_18(glval) = VariableAddress[#return] : +# 1049| v1049_19(void) = ReturnValue : &:r1049_18, ~m? +# 1049| v1049_20(void) = AliasedUse : ~m? +# 1049| v1049_21(void) = ExitFunction : # 1051| char (void Lambda(int, String const&))::(lambda [] type at line 1051, col. 32)::operator()(float) const # 1051| Block 0 # 1051| v1051_1(void) = EnterFunction : # 1051| mu1051_2(unknown) = AliasedDefinition : # 1051| mu1051_3(unknown) = InitializeNonLocal : -# 1051| r1051_4(glval) = InitializeThis : -# 1051| r1051_5(glval) = VariableAddress[f] : -# 1051| mu1051_6(float) = InitializeParameter[f] : &:r1051_5 -# 1051| r1051_7(glval) = VariableAddress[#return] : -#-----| r0_1(lambda [] type at line 1051, col. 32 *) = CopyValue : r1051_4 -#-----| r0_2(glval) = FieldAddress[s] : r0_1 -#-----| r0_3(String &) = Load : &:r0_2, ~m? -# 1051| r1051_8(glval) = CopyValue : r0_3 -# 1051| r1051_9(glval) = FunctionAddress[c_str] : -# 1051| r1051_10(char *) = Call : func:r1051_9, this:r1051_8 -# 1051| mu1051_11(unknown) = ^CallSideEffect : ~m? -# 1051| v1051_12(void) = ^BufferReadSideEffect[-1] : &:r1051_8, ~m? -# 1051| mu1051_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1051_8 -#-----| r0_4(lambda [] type at line 1051, col. 32 *) = CopyValue : r1051_4 -#-----| r0_5(glval) = FieldAddress[x] : r0_4 -#-----| r0_6(int) = Load : &:r0_5, ~m? -# 1051| r1051_14(glval) = PointerAdd[1] : r1051_10, r0_6 -# 1051| r1051_15(char) = Load : &:r1051_14, ~m? -# 1051| mu1051_16(char) = Store : &:r1051_7, r1051_15 -# 1051| r1051_17(glval) = VariableAddress[#return] : -# 1051| v1051_18(void) = ReturnValue : &:r1051_17, ~m? -# 1051| v1051_19(void) = AliasedUse : ~m? -# 1051| v1051_20(void) = ExitFunction : +# 1051| r1051_4(glval) = VariableAddress[#this] : +# 1051| mu1051_5(glval) = InitializeParameter[#this] : &:r1051_4 +# 1051| r1051_6(glval) = Load : &:r1051_4, ~m? +# 1051| mu1051_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1051_6 +# 1051| r1051_8(glval) = VariableAddress[f] : +# 1051| mu1051_9(float) = InitializeParameter[f] : &:r1051_8 +# 1051| r1051_10(glval) = VariableAddress[#return] : +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(lambda [] type at line 1051, col. 32 *) = Load : &:r0_1, ~m? +#-----| r0_3(glval) = FieldAddress[s] : r0_2 +#-----| r0_4(String &) = Load : &:r0_3, ~m? +# 1051| r1051_11(glval) = CopyValue : r0_4 +# 1051| r1051_12(glval) = FunctionAddress[c_str] : +# 1051| r1051_13(char *) = Call : func:r1051_12, this:r1051_11 +# 1051| mu1051_14(unknown) = ^CallSideEffect : ~m? +# 1051| v1051_15(void) = ^BufferReadSideEffect[-1] : &:r1051_11, ~m? +# 1051| mu1051_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r1051_11 +#-----| r0_5(glval) = VariableAddress[#this] : +#-----| r0_6(lambda [] type at line 1051, col. 32 *) = Load : &:r0_5, ~m? +#-----| r0_7(glval) = FieldAddress[x] : r0_6 +#-----| r0_8(int) = Load : &:r0_7, ~m? +# 1051| r1051_17(glval) = PointerAdd[1] : r1051_13, r0_8 +# 1051| r1051_18(char) = Load : &:r1051_17, ~m? +# 1051| mu1051_19(char) = Store : &:r1051_10, r1051_18 +# 1051| r1051_20(glval) = VariableAddress[#return] : +# 1051| v1051_21(void) = ReturnValue : &:r1051_20, ~m? +# 1051| v1051_22(void) = AliasedUse : ~m? +# 1051| v1051_23(void) = ExitFunction : # 1054| char (void Lambda(int, String const&))::(lambda [] type at line 1054, col. 23)::operator()(float) const # 1054| Block 0 -# 1054| v1054_1(void) = EnterFunction : -# 1054| mu1054_2(unknown) = AliasedDefinition : -# 1054| mu1054_3(unknown) = InitializeNonLocal : -# 1054| r1054_4(glval) = InitializeThis : -# 1054| r1054_5(glval) = VariableAddress[f] : -# 1054| mu1054_6(float) = InitializeParameter[f] : &:r1054_5 -# 1054| r1054_7(glval) = VariableAddress[#return] : -#-----| r0_1(lambda [] type at line 1054, col. 23 *) = CopyValue : r1054_4 -#-----| r0_2(glval) = FieldAddress[s] : r0_1 -#-----| r0_3(String &) = Load : &:r0_2, ~m? -# 1054| r1054_8(glval) = CopyValue : r0_3 -# 1054| r1054_9(glval) = FunctionAddress[c_str] : -# 1054| r1054_10(char *) = Call : func:r1054_9, this:r1054_8 -# 1054| mu1054_11(unknown) = ^CallSideEffect : ~m? -# 1054| v1054_12(void) = ^BufferReadSideEffect[-1] : &:r1054_8, ~m? -# 1054| mu1054_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1054_8 -#-----| r0_4(lambda [] type at line 1054, col. 23 *) = CopyValue : r1054_4 -#-----| r0_5(glval) = FieldAddress[x] : r0_4 -#-----| r0_6(int) = Load : &:r0_5, ~m? -#-----| r0_7(lambda [] type at line 1054, col. 23 *) = CopyValue : r1054_4 -# 1054| r1054_14(glval) = FieldAddress[i] : r0_7 -# 1054| r1054_15(int) = Load : &:r1054_14, ~m? -# 1054| r1054_16(int) = Add : r0_6, r1054_15 -#-----| r0_8(lambda [] type at line 1054, col. 23 *) = CopyValue : r1054_4 -# 1054| r1054_17(glval) = FieldAddress[j] : r0_8 -# 1054| r1054_18(int &) = Load : &:r1054_17, ~m? -# 1054| r1054_19(int) = Load : &:r1054_18, ~m? -# 1054| r1054_20(int) = Sub : r1054_16, r1054_19 -# 1054| r1054_21(glval) = PointerAdd[1] : r1054_10, r1054_20 -# 1054| r1054_22(char) = Load : &:r1054_21, ~m? -# 1054| mu1054_23(char) = Store : &:r1054_7, r1054_22 -# 1054| r1054_24(glval) = VariableAddress[#return] : -# 1054| v1054_25(void) = ReturnValue : &:r1054_24, ~m? -# 1054| v1054_26(void) = AliasedUse : ~m? -# 1054| v1054_27(void) = ExitFunction : +# 1054| v1054_1(void) = EnterFunction : +# 1054| mu1054_2(unknown) = AliasedDefinition : +# 1054| mu1054_3(unknown) = InitializeNonLocal : +# 1054| r1054_4(glval) = VariableAddress[#this] : +# 1054| mu1054_5(glval) = InitializeParameter[#this] : &:r1054_4 +# 1054| r1054_6(glval) = Load : &:r1054_4, ~m? +# 1054| mu1054_7(decltype([...](...){...})) = InitializeIndirection[#this] : &:r1054_6 +# 1054| r1054_8(glval) = VariableAddress[f] : +# 1054| mu1054_9(float) = InitializeParameter[f] : &:r1054_8 +# 1054| r1054_10(glval) = VariableAddress[#return] : +#-----| r0_1(glval) = VariableAddress[#this] : +#-----| r0_2(lambda [] type at line 1054, col. 23 *) = Load : &:r0_1, ~m? +#-----| r0_3(glval) = FieldAddress[s] : r0_2 +#-----| r0_4(String &) = Load : &:r0_3, ~m? +# 1054| r1054_11(glval) = CopyValue : r0_4 +# 1054| r1054_12(glval) = FunctionAddress[c_str] : +# 1054| r1054_13(char *) = Call : func:r1054_12, this:r1054_11 +# 1054| mu1054_14(unknown) = ^CallSideEffect : ~m? +# 1054| v1054_15(void) = ^BufferReadSideEffect[-1] : &:r1054_11, ~m? +# 1054| mu1054_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r1054_11 +#-----| r0_5(glval) = VariableAddress[#this] : +#-----| r0_6(lambda [] type at line 1054, col. 23 *) = Load : &:r0_5, ~m? +#-----| r0_7(glval) = FieldAddress[x] : r0_6 +#-----| r0_8(int) = Load : &:r0_7, ~m? +#-----| r0_9(glval) = VariableAddress[#this] : +#-----| r0_10(lambda [] type at line 1054, col. 23 *) = Load : &:r0_9, ~m? +# 1054| r1054_17(glval) = FieldAddress[i] : r0_10 +# 1054| r1054_18(int) = Load : &:r1054_17, ~m? +# 1054| r1054_19(int) = Add : r0_8, r1054_18 +#-----| r0_11(glval) = VariableAddress[#this] : +#-----| r0_12(lambda [] type at line 1054, col. 23 *) = Load : &:r0_11, ~m? +# 1054| r1054_20(glval) = FieldAddress[j] : r0_12 +# 1054| r1054_21(int &) = Load : &:r1054_20, ~m? +# 1054| r1054_22(int) = Load : &:r1054_21, ~m? +# 1054| r1054_23(int) = Sub : r1054_19, r1054_22 +# 1054| r1054_24(glval) = PointerAdd[1] : r1054_13, r1054_23 +# 1054| r1054_25(char) = Load : &:r1054_24, ~m? +# 1054| mu1054_26(char) = Store : &:r1054_10, r1054_25 +# 1054| r1054_27(glval) = VariableAddress[#return] : +# 1054| v1054_28(void) = ReturnValue : &:r1054_27, ~m? +# 1054| v1054_29(void) = AliasedUse : ~m? +# 1054| v1054_30(void) = ExitFunction : # 1077| void RangeBasedFor(vector const&) # 1077| Block 0 @@ -7222,19 +7372,22 @@ ir.cpp: perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 -# 6| v6_1(void) = EnterFunction : -# 6| mu6_2(unknown) = AliasedDefinition : -# 6| mu6_3(unknown) = InitializeNonLocal : -# 6| r6_4(glval) = InitializeThis : -# 6| r6_5(glval) = FieldAddress[buffer] : r6_4 -# 6| r6_6(int) = Constant[0] : -# 6| r6_7(glval) = PointerAdd[1] : r6_5, r6_6 -# 6| r6_8(unknown[1073741824]) = Constant[0] : -# 6| mu6_9(unknown[1073741824]) = Store : &:r6_7, r6_8 -# 6| v6_10(void) = NoOp : -# 6| v6_11(void) = ReturnVoid : -# 6| v6_12(void) = AliasedUse : ~m? -# 6| v6_13(void) = ExitFunction : +# 6| v6_1(void) = EnterFunction : +# 6| mu6_2(unknown) = AliasedDefinition : +# 6| mu6_3(unknown) = InitializeNonLocal : +# 6| r6_4(glval) = VariableAddress[#this] : +# 6| mu6_5(glval) = InitializeParameter[#this] : &:r6_4 +# 6| r6_6(glval) = Load : &:r6_4, ~m? +# 6| mu6_7(Big) = InitializeIndirection[#this] : &:r6_6 +# 6| r6_8(glval) = FieldAddress[buffer] : mu6_5 +# 6| r6_9(int) = Constant[0] : +# 6| r6_10(glval) = PointerAdd[1] : r6_8, r6_9 +# 6| r6_11(unknown[1073741824]) = Constant[0] : +# 6| mu6_12(unknown[1073741824]) = Store : &:r6_10, r6_11 +# 6| v6_13(void) = NoOp : +# 6| v6_14(void) = ReturnVoid : +# 6| v6_15(void) = AliasedUse : ~m? +# 6| v6_16(void) = ExitFunction : # 9| int main() # 9| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected index dd5c2a1f2861..24b3ee459843 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected @@ -1009,29 +1009,35 @@ ssa.cpp: # 235| void Constructible::Constructible(int) # 235| Block 0 -# 235| v235_1(void) = EnterFunction : -# 235| m235_2(unknown) = AliasedDefinition : -# 235| m235_3(unknown) = InitializeNonLocal : -# 235| m235_4(unknown) = Chi : total:m235_2, partial:m235_3 -# 235| r235_5(glval) = InitializeThis : -# 235| r235_6(glval) = VariableAddress[x] : -# 235| m235_7(int) = InitializeParameter[x] : &:r235_6 -# 235| v235_8(void) = NoOp : -# 235| v235_9(void) = ReturnVoid : -# 235| v235_10(void) = AliasedUse : m235_3 -# 235| v235_11(void) = ExitFunction : +# 235| v235_1(void) = EnterFunction : +# 235| m235_2(unknown) = AliasedDefinition : +# 235| m235_3(unknown) = InitializeNonLocal : +# 235| m235_4(unknown) = Chi : total:m235_2, partial:m235_3 +# 235| r235_5(glval) = VariableAddress[#this] : +# 235| m235_6(glval) = InitializeParameter[#this] : &:r235_5 +# 235| r235_7(glval) = Load : &:r235_5, m235_6 +# 235| m235_8(Constructible) = InitializeIndirection[#this] : &:r235_7 +# 235| r235_9(glval) = VariableAddress[x] : +# 235| m235_10(int) = InitializeParameter[x] : &:r235_9 +# 235| v235_11(void) = NoOp : +# 235| v235_12(void) = ReturnVoid : +# 235| v235_13(void) = AliasedUse : m235_3 +# 235| v235_14(void) = ExitFunction : # 236| void Constructible::g() # 236| Block 0 -# 236| v236_1(void) = EnterFunction : -# 236| m236_2(unknown) = AliasedDefinition : -# 236| m236_3(unknown) = InitializeNonLocal : -# 236| m236_4(unknown) = Chi : total:m236_2, partial:m236_3 -# 236| r236_5(glval) = InitializeThis : -# 236| v236_6(void) = NoOp : -# 236| v236_7(void) = ReturnVoid : -# 236| v236_8(void) = AliasedUse : m236_3 -# 236| v236_9(void) = ExitFunction : +# 236| v236_1(void) = EnterFunction : +# 236| m236_2(unknown) = AliasedDefinition : +# 236| m236_3(unknown) = InitializeNonLocal : +# 236| m236_4(unknown) = Chi : total:m236_2, partial:m236_3 +# 236| r236_5(glval) = VariableAddress[#this] : +# 236| m236_6(glval) = InitializeParameter[#this] : &:r236_5 +# 236| r236_7(glval) = Load : &:r236_5, m236_6 +# 236| m236_8(Constructible) = InitializeIndirection[#this] : &:r236_7 +# 236| v236_9(void) = NoOp : +# 236| v236_10(void) = ReturnVoid : +# 236| v236_11(void) = AliasedUse : m236_3 +# 236| v236_12(void) = ExitFunction : # 239| void ExplicitConstructorCalls() # 239| Block 0 @@ -1290,46 +1296,55 @@ ssa.cpp: # 286| void A::A(int) # 286| Block 0 -# 286| v286_1(void) = EnterFunction : -# 286| m286_2(unknown) = AliasedDefinition : -# 286| m286_3(unknown) = InitializeNonLocal : -# 286| m286_4(unknown) = Chi : total:m286_2, partial:m286_3 -# 286| r286_5(glval) = InitializeThis : -# 286| r286_6(glval) = VariableAddress[x] : -# 286| m286_7(int) = InitializeParameter[x] : &:r286_6 -# 286| v286_8(void) = NoOp : -# 286| v286_9(void) = ReturnVoid : -# 286| v286_10(void) = AliasedUse : m286_3 -# 286| v286_11(void) = ExitFunction : +# 286| v286_1(void) = EnterFunction : +# 286| m286_2(unknown) = AliasedDefinition : +# 286| m286_3(unknown) = InitializeNonLocal : +# 286| m286_4(unknown) = Chi : total:m286_2, partial:m286_3 +# 286| r286_5(glval) = VariableAddress[#this] : +# 286| m286_6(glval) = InitializeParameter[#this] : &:r286_5 +# 286| r286_7(glval) = Load : &:r286_5, m286_6 +# 286| m286_8(A) = InitializeIndirection[#this] : &:r286_7 +# 286| r286_9(glval) = VariableAddress[x] : +# 286| m286_10(int) = InitializeParameter[x] : &:r286_9 +# 286| v286_11(void) = NoOp : +# 286| v286_12(void) = ReturnVoid : +# 286| v286_13(void) = AliasedUse : m286_3 +# 286| v286_14(void) = ExitFunction : # 287| void A::A(A*) # 287| Block 0 -# 287| v287_1(void) = EnterFunction : -# 287| m287_2(unknown) = AliasedDefinition : -# 287| m287_3(unknown) = InitializeNonLocal : -# 287| m287_4(unknown) = Chi : total:m287_2, partial:m287_3 -# 287| r287_5(glval) = InitializeThis : -# 287| r287_6(glval) = VariableAddress[p#0] : -# 287| m287_7(A *) = InitializeParameter[p#0] : &:r287_6 -# 287| r287_8(A *) = Load : &:r287_6, m287_7 -# 287| m287_9(unknown) = InitializeIndirection[p#0] : &:r287_8 -# 287| v287_10(void) = NoOp : -# 287| v287_11(void) = ReturnIndirection[p#0] : &:r287_8, m287_9 -# 287| v287_12(void) = ReturnVoid : -# 287| v287_13(void) = AliasedUse : m287_3 -# 287| v287_14(void) = ExitFunction : +# 287| v287_1(void) = EnterFunction : +# 287| m287_2(unknown) = AliasedDefinition : +# 287| m287_3(unknown) = InitializeNonLocal : +# 287| m287_4(unknown) = Chi : total:m287_2, partial:m287_3 +# 287| r287_5(glval) = VariableAddress[#this] : +# 287| m287_6(glval) = InitializeParameter[#this] : &:r287_5 +# 287| r287_7(glval) = Load : &:r287_5, m287_6 +# 287| m287_8(A) = InitializeIndirection[#this] : &:r287_7 +# 287| r287_9(glval) = VariableAddress[p#0] : +# 287| m287_10(A *) = InitializeParameter[p#0] : &:r287_9 +# 287| r287_11(A *) = Load : &:r287_9, m287_10 +# 287| m287_12(unknown) = InitializeIndirection[p#0] : &:r287_11 +# 287| v287_13(void) = NoOp : +# 287| v287_14(void) = ReturnIndirection[p#0] : &:r287_11, m287_12 +# 287| v287_15(void) = ReturnVoid : +# 287| v287_16(void) = AliasedUse : m287_3 +# 287| v287_17(void) = ExitFunction : # 288| void A::A() # 288| Block 0 -# 288| v288_1(void) = EnterFunction : -# 288| m288_2(unknown) = AliasedDefinition : -# 288| m288_3(unknown) = InitializeNonLocal : -# 288| m288_4(unknown) = Chi : total:m288_2, partial:m288_3 -# 288| r288_5(glval) = InitializeThis : -# 288| v288_6(void) = NoOp : -# 288| v288_7(void) = ReturnVoid : -# 288| v288_8(void) = AliasedUse : m288_3 -# 288| v288_9(void) = ExitFunction : +# 288| v288_1(void) = EnterFunction : +# 288| m288_2(unknown) = AliasedDefinition : +# 288| m288_3(unknown) = InitializeNonLocal : +# 288| m288_4(unknown) = Chi : total:m288_2, partial:m288_3 +# 288| r288_5(glval) = VariableAddress[#this] : +# 288| m288_6(glval) = InitializeParameter[#this] : &:r288_5 +# 288| r288_7(glval) = Load : &:r288_5, m288_6 +# 288| m288_8(A) = InitializeIndirection[#this] : &:r288_7 +# 288| v288_9(void) = NoOp : +# 288| v288_10(void) = ReturnVoid : +# 288| v288_11(void) = AliasedUse : m288_3 +# 288| v288_12(void) = ExitFunction : # 291| Point* NewAliasing(int) # 291| Block 0 @@ -1463,3 +1478,27 @@ ssa.cpp: # 301| v301_14(void) = ReturnValue : &:r301_13, m304_7 # 301| v301_15(void) = AliasedUse : ~m303_11 # 301| v301_16(void) = ExitFunction : + +# 310| void ThisAliasTest::setX(int) +# 310| Block 0 +# 310| v310_1(void) = EnterFunction : +# 310| m310_2(unknown) = AliasedDefinition : +# 310| m310_3(unknown) = InitializeNonLocal : +# 310| m310_4(unknown) = Chi : total:m310_2, partial:m310_3 +# 310| r310_5(glval) = VariableAddress[#this] : +# 310| m310_6(glval) = InitializeParameter[#this] : &:r310_5 +# 310| r310_7(glval) = Load : &:r310_5, m310_6 +# 310| m310_8(ThisAliasTest) = InitializeIndirection[#this] : &:r310_7 +# 310| r310_9(glval) = VariableAddress[arg] : +# 310| m310_10(int) = InitializeParameter[arg] : &:r310_9 +# 311| r311_1(glval) = VariableAddress[arg] : +# 311| r311_2(int) = Load : &:r311_1, m310_10 +# 311| r311_3(glval) = VariableAddress[#this] : +# 311| r311_4(ThisAliasTest *) = Load : &:r311_3, m310_6 +# 311| r311_5(glval) = FieldAddress[x] : r311_4 +# 311| m311_6(int) = Store : &:r311_5, r311_2 +# 311| m311_7(unknown) = Chi : total:m310_8, partial:m311_6 +# 312| v312_1(void) = NoOp : +# 310| v310_11(void) = ReturnVoid : +# 310| v310_12(void) = AliasedUse : m310_3 +# 310| v310_13(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected index e20e499a12bd..e0fd0e59d7de 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir_unsound.expected @@ -1002,29 +1002,35 @@ ssa.cpp: # 235| void Constructible::Constructible(int) # 235| Block 0 -# 235| v235_1(void) = EnterFunction : -# 235| m235_2(unknown) = AliasedDefinition : -# 235| m235_3(unknown) = InitializeNonLocal : -# 235| m235_4(unknown) = Chi : total:m235_2, partial:m235_3 -# 235| r235_5(glval) = InitializeThis : -# 235| r235_6(glval) = VariableAddress[x] : -# 235| m235_7(int) = InitializeParameter[x] : &:r235_6 -# 235| v235_8(void) = NoOp : -# 235| v235_9(void) = ReturnVoid : -# 235| v235_10(void) = AliasedUse : m235_3 -# 235| v235_11(void) = ExitFunction : +# 235| v235_1(void) = EnterFunction : +# 235| m235_2(unknown) = AliasedDefinition : +# 235| m235_3(unknown) = InitializeNonLocal : +# 235| m235_4(unknown) = Chi : total:m235_2, partial:m235_3 +# 235| r235_5(glval) = VariableAddress[#this] : +# 235| m235_6(glval) = InitializeParameter[#this] : &:r235_5 +# 235| r235_7(glval) = Load : &:r235_5, m235_6 +# 235| m235_8(Constructible) = InitializeIndirection[#this] : &:r235_7 +# 235| r235_9(glval) = VariableAddress[x] : +# 235| m235_10(int) = InitializeParameter[x] : &:r235_9 +# 235| v235_11(void) = NoOp : +# 235| v235_12(void) = ReturnVoid : +# 235| v235_13(void) = AliasedUse : m235_3 +# 235| v235_14(void) = ExitFunction : # 236| void Constructible::g() # 236| Block 0 -# 236| v236_1(void) = EnterFunction : -# 236| m236_2(unknown) = AliasedDefinition : -# 236| m236_3(unknown) = InitializeNonLocal : -# 236| m236_4(unknown) = Chi : total:m236_2, partial:m236_3 -# 236| r236_5(glval) = InitializeThis : -# 236| v236_6(void) = NoOp : -# 236| v236_7(void) = ReturnVoid : -# 236| v236_8(void) = AliasedUse : m236_3 -# 236| v236_9(void) = ExitFunction : +# 236| v236_1(void) = EnterFunction : +# 236| m236_2(unknown) = AliasedDefinition : +# 236| m236_3(unknown) = InitializeNonLocal : +# 236| m236_4(unknown) = Chi : total:m236_2, partial:m236_3 +# 236| r236_5(glval) = VariableAddress[#this] : +# 236| m236_6(glval) = InitializeParameter[#this] : &:r236_5 +# 236| r236_7(glval) = Load : &:r236_5, m236_6 +# 236| m236_8(Constructible) = InitializeIndirection[#this] : &:r236_7 +# 236| v236_9(void) = NoOp : +# 236| v236_10(void) = ReturnVoid : +# 236| v236_11(void) = AliasedUse : m236_3 +# 236| v236_12(void) = ExitFunction : # 239| void ExplicitConstructorCalls() # 239| Block 0 @@ -1278,46 +1284,55 @@ ssa.cpp: # 286| void A::A(int) # 286| Block 0 -# 286| v286_1(void) = EnterFunction : -# 286| m286_2(unknown) = AliasedDefinition : -# 286| m286_3(unknown) = InitializeNonLocal : -# 286| m286_4(unknown) = Chi : total:m286_2, partial:m286_3 -# 286| r286_5(glval) = InitializeThis : -# 286| r286_6(glval) = VariableAddress[x] : -# 286| m286_7(int) = InitializeParameter[x] : &:r286_6 -# 286| v286_8(void) = NoOp : -# 286| v286_9(void) = ReturnVoid : -# 286| v286_10(void) = AliasedUse : m286_3 -# 286| v286_11(void) = ExitFunction : +# 286| v286_1(void) = EnterFunction : +# 286| m286_2(unknown) = AliasedDefinition : +# 286| m286_3(unknown) = InitializeNonLocal : +# 286| m286_4(unknown) = Chi : total:m286_2, partial:m286_3 +# 286| r286_5(glval) = VariableAddress[#this] : +# 286| m286_6(glval) = InitializeParameter[#this] : &:r286_5 +# 286| r286_7(glval) = Load : &:r286_5, m286_6 +# 286| m286_8(A) = InitializeIndirection[#this] : &:r286_7 +# 286| r286_9(glval) = VariableAddress[x] : +# 286| m286_10(int) = InitializeParameter[x] : &:r286_9 +# 286| v286_11(void) = NoOp : +# 286| v286_12(void) = ReturnVoid : +# 286| v286_13(void) = AliasedUse : m286_3 +# 286| v286_14(void) = ExitFunction : # 287| void A::A(A*) # 287| Block 0 -# 287| v287_1(void) = EnterFunction : -# 287| m287_2(unknown) = AliasedDefinition : -# 287| m287_3(unknown) = InitializeNonLocal : -# 287| m287_4(unknown) = Chi : total:m287_2, partial:m287_3 -# 287| r287_5(glval) = InitializeThis : -# 287| r287_6(glval) = VariableAddress[p#0] : -# 287| m287_7(A *) = InitializeParameter[p#0] : &:r287_6 -# 287| r287_8(A *) = Load : &:r287_6, m287_7 -# 287| m287_9(unknown) = InitializeIndirection[p#0] : &:r287_8 -# 287| v287_10(void) = NoOp : -# 287| v287_11(void) = ReturnIndirection[p#0] : &:r287_8, m287_9 -# 287| v287_12(void) = ReturnVoid : -# 287| v287_13(void) = AliasedUse : m287_3 -# 287| v287_14(void) = ExitFunction : +# 287| v287_1(void) = EnterFunction : +# 287| m287_2(unknown) = AliasedDefinition : +# 287| m287_3(unknown) = InitializeNonLocal : +# 287| m287_4(unknown) = Chi : total:m287_2, partial:m287_3 +# 287| r287_5(glval) = VariableAddress[#this] : +# 287| m287_6(glval) = InitializeParameter[#this] : &:r287_5 +# 287| r287_7(glval) = Load : &:r287_5, m287_6 +# 287| m287_8(A) = InitializeIndirection[#this] : &:r287_7 +# 287| r287_9(glval) = VariableAddress[p#0] : +# 287| m287_10(A *) = InitializeParameter[p#0] : &:r287_9 +# 287| r287_11(A *) = Load : &:r287_9, m287_10 +# 287| m287_12(unknown) = InitializeIndirection[p#0] : &:r287_11 +# 287| v287_13(void) = NoOp : +# 287| v287_14(void) = ReturnIndirection[p#0] : &:r287_11, m287_12 +# 287| v287_15(void) = ReturnVoid : +# 287| v287_16(void) = AliasedUse : m287_3 +# 287| v287_17(void) = ExitFunction : # 288| void A::A() # 288| Block 0 -# 288| v288_1(void) = EnterFunction : -# 288| m288_2(unknown) = AliasedDefinition : -# 288| m288_3(unknown) = InitializeNonLocal : -# 288| m288_4(unknown) = Chi : total:m288_2, partial:m288_3 -# 288| r288_5(glval) = InitializeThis : -# 288| v288_6(void) = NoOp : -# 288| v288_7(void) = ReturnVoid : -# 288| v288_8(void) = AliasedUse : m288_3 -# 288| v288_9(void) = ExitFunction : +# 288| v288_1(void) = EnterFunction : +# 288| m288_2(unknown) = AliasedDefinition : +# 288| m288_3(unknown) = InitializeNonLocal : +# 288| m288_4(unknown) = Chi : total:m288_2, partial:m288_3 +# 288| r288_5(glval) = VariableAddress[#this] : +# 288| m288_6(glval) = InitializeParameter[#this] : &:r288_5 +# 288| r288_7(glval) = Load : &:r288_5, m288_6 +# 288| m288_8(A) = InitializeIndirection[#this] : &:r288_7 +# 288| v288_9(void) = NoOp : +# 288| v288_10(void) = ReturnVoid : +# 288| v288_11(void) = AliasedUse : m288_3 +# 288| v288_12(void) = ExitFunction : # 291| Point* NewAliasing(int) # 291| Block 0 @@ -1450,3 +1465,27 @@ ssa.cpp: # 301| v301_13(void) = ReturnValue : &:r301_12, m304_7 # 301| v301_14(void) = AliasedUse : ~m303_8 # 301| v301_15(void) = ExitFunction : + +# 310| void ThisAliasTest::setX(int) +# 310| Block 0 +# 310| v310_1(void) = EnterFunction : +# 310| m310_2(unknown) = AliasedDefinition : +# 310| m310_3(unknown) = InitializeNonLocal : +# 310| m310_4(unknown) = Chi : total:m310_2, partial:m310_3 +# 310| r310_5(glval) = VariableAddress[#this] : +# 310| m310_6(glval) = InitializeParameter[#this] : &:r310_5 +# 310| r310_7(glval) = Load : &:r310_5, m310_6 +# 310| m310_8(ThisAliasTest) = InitializeIndirection[#this] : &:r310_7 +# 310| r310_9(glval) = VariableAddress[arg] : +# 310| m310_10(int) = InitializeParameter[arg] : &:r310_9 +# 311| r311_1(glval) = VariableAddress[arg] : +# 311| r311_2(int) = Load : &:r311_1, m310_10 +# 311| r311_3(glval) = VariableAddress[#this] : +# 311| r311_4(ThisAliasTest *) = Load : &:r311_3, m310_6 +# 311| r311_5(glval) = FieldAddress[x] : r311_4 +# 311| m311_6(int) = Store : &:r311_5, r311_2 +# 311| m311_7(unknown) = Chi : total:m310_8, partial:m311_6 +# 312| v312_1(void) = NoOp : +# 310| v310_11(void) = ReturnVoid : +# 310| v310_12(void) = AliasedUse : m310_3 +# 310| v310_13(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ssa/ssa.cpp b/cpp/ql/test/library-tests/ir/ssa/ssa.cpp index 5ea3ef77968d..b8788c5c6aae 100644 --- a/cpp/ql/test/library-tests/ir/ssa/ssa.cpp +++ b/cpp/ql/test/library-tests/ir/ssa/ssa.cpp @@ -302,4 +302,12 @@ int main(int argc, char **argv) { unknownFunction(argc, argv); unknownFunction(argc, argv); return **argv; // Chi chain goes through side effects from unknownFunction -} \ No newline at end of file +} + +class ThisAliasTest { + int x, y; + + void setX(int arg) { + this->x = arg; + } +}; \ No newline at end of file diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected index d0200ae0d8f4..3180c9211a5e 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected @@ -937,27 +937,33 @@ ssa.cpp: # 235| void Constructible::Constructible(int) # 235| Block 0 -# 235| v235_1(void) = EnterFunction : -# 235| mu235_2(unknown) = AliasedDefinition : -# 235| mu235_3(unknown) = InitializeNonLocal : -# 235| r235_4(glval) = InitializeThis : -# 235| r235_5(glval) = VariableAddress[x] : -# 235| m235_6(int) = InitializeParameter[x] : &:r235_5 -# 235| v235_7(void) = NoOp : -# 235| v235_8(void) = ReturnVoid : -# 235| v235_9(void) = AliasedUse : ~m? -# 235| v235_10(void) = ExitFunction : +# 235| v235_1(void) = EnterFunction : +# 235| mu235_2(unknown) = AliasedDefinition : +# 235| mu235_3(unknown) = InitializeNonLocal : +# 235| r235_4(glval) = VariableAddress[#this] : +# 235| m235_5(glval) = InitializeParameter[#this] : &:r235_4 +# 235| r235_6(glval) = Load : &:r235_4, m235_5 +# 235| mu235_7(Constructible) = InitializeIndirection[#this] : &:r235_6 +# 235| r235_8(glval) = VariableAddress[x] : +# 235| m235_9(int) = InitializeParameter[x] : &:r235_8 +# 235| v235_10(void) = NoOp : +# 235| v235_11(void) = ReturnVoid : +# 235| v235_12(void) = AliasedUse : ~m? +# 235| v235_13(void) = ExitFunction : # 236| void Constructible::g() # 236| Block 0 -# 236| v236_1(void) = EnterFunction : -# 236| mu236_2(unknown) = AliasedDefinition : -# 236| mu236_3(unknown) = InitializeNonLocal : -# 236| r236_4(glval) = InitializeThis : -# 236| v236_5(void) = NoOp : -# 236| v236_6(void) = ReturnVoid : -# 236| v236_7(void) = AliasedUse : ~m? -# 236| v236_8(void) = ExitFunction : +# 236| v236_1(void) = EnterFunction : +# 236| mu236_2(unknown) = AliasedDefinition : +# 236| mu236_3(unknown) = InitializeNonLocal : +# 236| r236_4(glval) = VariableAddress[#this] : +# 236| m236_5(glval) = InitializeParameter[#this] : &:r236_4 +# 236| r236_6(glval) = Load : &:r236_4, m236_5 +# 236| mu236_7(Constructible) = InitializeIndirection[#this] : &:r236_6 +# 236| v236_8(void) = NoOp : +# 236| v236_9(void) = ReturnVoid : +# 236| v236_10(void) = AliasedUse : ~m? +# 236| v236_11(void) = ExitFunction : # 239| void ExplicitConstructorCalls() # 239| Block 0 @@ -1182,43 +1188,52 @@ ssa.cpp: # 286| void A::A(int) # 286| Block 0 -# 286| v286_1(void) = EnterFunction : -# 286| mu286_2(unknown) = AliasedDefinition : -# 286| mu286_3(unknown) = InitializeNonLocal : -# 286| r286_4(glval) = InitializeThis : -# 286| r286_5(glval) = VariableAddress[x] : -# 286| m286_6(int) = InitializeParameter[x] : &:r286_5 -# 286| v286_7(void) = NoOp : -# 286| v286_8(void) = ReturnVoid : -# 286| v286_9(void) = AliasedUse : ~m? -# 286| v286_10(void) = ExitFunction : +# 286| v286_1(void) = EnterFunction : +# 286| mu286_2(unknown) = AliasedDefinition : +# 286| mu286_3(unknown) = InitializeNonLocal : +# 286| r286_4(glval) = VariableAddress[#this] : +# 286| m286_5(glval) = InitializeParameter[#this] : &:r286_4 +# 286| r286_6(glval) = Load : &:r286_4, m286_5 +# 286| mu286_7(A) = InitializeIndirection[#this] : &:r286_6 +# 286| r286_8(glval) = VariableAddress[x] : +# 286| m286_9(int) = InitializeParameter[x] : &:r286_8 +# 286| v286_10(void) = NoOp : +# 286| v286_11(void) = ReturnVoid : +# 286| v286_12(void) = AliasedUse : ~m? +# 286| v286_13(void) = ExitFunction : # 287| void A::A(A*) # 287| Block 0 -# 287| v287_1(void) = EnterFunction : -# 287| mu287_2(unknown) = AliasedDefinition : -# 287| mu287_3(unknown) = InitializeNonLocal : -# 287| r287_4(glval) = InitializeThis : -# 287| r287_5(glval) = VariableAddress[p#0] : -# 287| m287_6(A *) = InitializeParameter[p#0] : &:r287_5 -# 287| r287_7(A *) = Load : &:r287_5, m287_6 -# 287| mu287_8(unknown) = InitializeIndirection[p#0] : &:r287_7 -# 287| v287_9(void) = NoOp : -# 287| v287_10(void) = ReturnIndirection[p#0] : &:r287_7, ~m? -# 287| v287_11(void) = ReturnVoid : -# 287| v287_12(void) = AliasedUse : ~m? -# 287| v287_13(void) = ExitFunction : +# 287| v287_1(void) = EnterFunction : +# 287| mu287_2(unknown) = AliasedDefinition : +# 287| mu287_3(unknown) = InitializeNonLocal : +# 287| r287_4(glval) = VariableAddress[#this] : +# 287| m287_5(glval) = InitializeParameter[#this] : &:r287_4 +# 287| r287_6(glval) = Load : &:r287_4, m287_5 +# 287| mu287_7(A) = InitializeIndirection[#this] : &:r287_6 +# 287| r287_8(glval) = VariableAddress[p#0] : +# 287| m287_9(A *) = InitializeParameter[p#0] : &:r287_8 +# 287| r287_10(A *) = Load : &:r287_8, m287_9 +# 287| mu287_11(unknown) = InitializeIndirection[p#0] : &:r287_10 +# 287| v287_12(void) = NoOp : +# 287| v287_13(void) = ReturnIndirection[p#0] : &:r287_10, ~m? +# 287| v287_14(void) = ReturnVoid : +# 287| v287_15(void) = AliasedUse : ~m? +# 287| v287_16(void) = ExitFunction : # 288| void A::A() # 288| Block 0 -# 288| v288_1(void) = EnterFunction : -# 288| mu288_2(unknown) = AliasedDefinition : -# 288| mu288_3(unknown) = InitializeNonLocal : -# 288| r288_4(glval) = InitializeThis : -# 288| v288_5(void) = NoOp : -# 288| v288_6(void) = ReturnVoid : -# 288| v288_7(void) = AliasedUse : ~m? -# 288| v288_8(void) = ExitFunction : +# 288| v288_1(void) = EnterFunction : +# 288| mu288_2(unknown) = AliasedDefinition : +# 288| mu288_3(unknown) = InitializeNonLocal : +# 288| r288_4(glval) = VariableAddress[#this] : +# 288| m288_5(glval) = InitializeParameter[#this] : &:r288_4 +# 288| r288_6(glval) = Load : &:r288_4, m288_5 +# 288| mu288_7(A) = InitializeIndirection[#this] : &:r288_6 +# 288| v288_8(void) = NoOp : +# 288| v288_9(void) = ReturnVoid : +# 288| v288_10(void) = AliasedUse : ~m? +# 288| v288_11(void) = ExitFunction : # 291| Point* NewAliasing(int) # 291| Block 0 @@ -1333,3 +1348,25 @@ ssa.cpp: # 301| v301_12(void) = ReturnValue : &:r301_11, m304_7 # 301| v301_13(void) = AliasedUse : ~m? # 301| v301_14(void) = ExitFunction : + +# 310| void ThisAliasTest::setX(int) +# 310| Block 0 +# 310| v310_1(void) = EnterFunction : +# 310| mu310_2(unknown) = AliasedDefinition : +# 310| mu310_3(unknown) = InitializeNonLocal : +# 310| r310_4(glval) = VariableAddress[#this] : +# 310| m310_5(glval) = InitializeParameter[#this] : &:r310_4 +# 310| r310_6(glval) = Load : &:r310_4, m310_5 +# 310| mu310_7(ThisAliasTest) = InitializeIndirection[#this] : &:r310_6 +# 310| r310_8(glval) = VariableAddress[arg] : +# 310| m310_9(int) = InitializeParameter[arg] : &:r310_8 +# 311| r311_1(glval) = VariableAddress[arg] : +# 311| r311_2(int) = Load : &:r311_1, m310_9 +# 311| r311_3(glval) = VariableAddress[#this] : +# 311| r311_4(ThisAliasTest *) = Load : &:r311_3, m310_5 +# 311| r311_5(glval) = FieldAddress[x] : r311_4 +# 311| mu311_6(int) = Store : &:r311_5, r311_2 +# 312| v312_1(void) = NoOp : +# 310| v310_10(void) = ReturnVoid : +# 310| v310_11(void) = AliasedUse : ~m? +# 310| v310_12(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected index d0200ae0d8f4..3180c9211a5e 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir_unsound.expected @@ -937,27 +937,33 @@ ssa.cpp: # 235| void Constructible::Constructible(int) # 235| Block 0 -# 235| v235_1(void) = EnterFunction : -# 235| mu235_2(unknown) = AliasedDefinition : -# 235| mu235_3(unknown) = InitializeNonLocal : -# 235| r235_4(glval) = InitializeThis : -# 235| r235_5(glval) = VariableAddress[x] : -# 235| m235_6(int) = InitializeParameter[x] : &:r235_5 -# 235| v235_7(void) = NoOp : -# 235| v235_8(void) = ReturnVoid : -# 235| v235_9(void) = AliasedUse : ~m? -# 235| v235_10(void) = ExitFunction : +# 235| v235_1(void) = EnterFunction : +# 235| mu235_2(unknown) = AliasedDefinition : +# 235| mu235_3(unknown) = InitializeNonLocal : +# 235| r235_4(glval) = VariableAddress[#this] : +# 235| m235_5(glval) = InitializeParameter[#this] : &:r235_4 +# 235| r235_6(glval) = Load : &:r235_4, m235_5 +# 235| mu235_7(Constructible) = InitializeIndirection[#this] : &:r235_6 +# 235| r235_8(glval) = VariableAddress[x] : +# 235| m235_9(int) = InitializeParameter[x] : &:r235_8 +# 235| v235_10(void) = NoOp : +# 235| v235_11(void) = ReturnVoid : +# 235| v235_12(void) = AliasedUse : ~m? +# 235| v235_13(void) = ExitFunction : # 236| void Constructible::g() # 236| Block 0 -# 236| v236_1(void) = EnterFunction : -# 236| mu236_2(unknown) = AliasedDefinition : -# 236| mu236_3(unknown) = InitializeNonLocal : -# 236| r236_4(glval) = InitializeThis : -# 236| v236_5(void) = NoOp : -# 236| v236_6(void) = ReturnVoid : -# 236| v236_7(void) = AliasedUse : ~m? -# 236| v236_8(void) = ExitFunction : +# 236| v236_1(void) = EnterFunction : +# 236| mu236_2(unknown) = AliasedDefinition : +# 236| mu236_3(unknown) = InitializeNonLocal : +# 236| r236_4(glval) = VariableAddress[#this] : +# 236| m236_5(glval) = InitializeParameter[#this] : &:r236_4 +# 236| r236_6(glval) = Load : &:r236_4, m236_5 +# 236| mu236_7(Constructible) = InitializeIndirection[#this] : &:r236_6 +# 236| v236_8(void) = NoOp : +# 236| v236_9(void) = ReturnVoid : +# 236| v236_10(void) = AliasedUse : ~m? +# 236| v236_11(void) = ExitFunction : # 239| void ExplicitConstructorCalls() # 239| Block 0 @@ -1182,43 +1188,52 @@ ssa.cpp: # 286| void A::A(int) # 286| Block 0 -# 286| v286_1(void) = EnterFunction : -# 286| mu286_2(unknown) = AliasedDefinition : -# 286| mu286_3(unknown) = InitializeNonLocal : -# 286| r286_4(glval) = InitializeThis : -# 286| r286_5(glval) = VariableAddress[x] : -# 286| m286_6(int) = InitializeParameter[x] : &:r286_5 -# 286| v286_7(void) = NoOp : -# 286| v286_8(void) = ReturnVoid : -# 286| v286_9(void) = AliasedUse : ~m? -# 286| v286_10(void) = ExitFunction : +# 286| v286_1(void) = EnterFunction : +# 286| mu286_2(unknown) = AliasedDefinition : +# 286| mu286_3(unknown) = InitializeNonLocal : +# 286| r286_4(glval) = VariableAddress[#this] : +# 286| m286_5(glval) = InitializeParameter[#this] : &:r286_4 +# 286| r286_6(glval) = Load : &:r286_4, m286_5 +# 286| mu286_7(A) = InitializeIndirection[#this] : &:r286_6 +# 286| r286_8(glval) = VariableAddress[x] : +# 286| m286_9(int) = InitializeParameter[x] : &:r286_8 +# 286| v286_10(void) = NoOp : +# 286| v286_11(void) = ReturnVoid : +# 286| v286_12(void) = AliasedUse : ~m? +# 286| v286_13(void) = ExitFunction : # 287| void A::A(A*) # 287| Block 0 -# 287| v287_1(void) = EnterFunction : -# 287| mu287_2(unknown) = AliasedDefinition : -# 287| mu287_3(unknown) = InitializeNonLocal : -# 287| r287_4(glval) = InitializeThis : -# 287| r287_5(glval) = VariableAddress[p#0] : -# 287| m287_6(A *) = InitializeParameter[p#0] : &:r287_5 -# 287| r287_7(A *) = Load : &:r287_5, m287_6 -# 287| mu287_8(unknown) = InitializeIndirection[p#0] : &:r287_7 -# 287| v287_9(void) = NoOp : -# 287| v287_10(void) = ReturnIndirection[p#0] : &:r287_7, ~m? -# 287| v287_11(void) = ReturnVoid : -# 287| v287_12(void) = AliasedUse : ~m? -# 287| v287_13(void) = ExitFunction : +# 287| v287_1(void) = EnterFunction : +# 287| mu287_2(unknown) = AliasedDefinition : +# 287| mu287_3(unknown) = InitializeNonLocal : +# 287| r287_4(glval) = VariableAddress[#this] : +# 287| m287_5(glval) = InitializeParameter[#this] : &:r287_4 +# 287| r287_6(glval) = Load : &:r287_4, m287_5 +# 287| mu287_7(A) = InitializeIndirection[#this] : &:r287_6 +# 287| r287_8(glval) = VariableAddress[p#0] : +# 287| m287_9(A *) = InitializeParameter[p#0] : &:r287_8 +# 287| r287_10(A *) = Load : &:r287_8, m287_9 +# 287| mu287_11(unknown) = InitializeIndirection[p#0] : &:r287_10 +# 287| v287_12(void) = NoOp : +# 287| v287_13(void) = ReturnIndirection[p#0] : &:r287_10, ~m? +# 287| v287_14(void) = ReturnVoid : +# 287| v287_15(void) = AliasedUse : ~m? +# 287| v287_16(void) = ExitFunction : # 288| void A::A() # 288| Block 0 -# 288| v288_1(void) = EnterFunction : -# 288| mu288_2(unknown) = AliasedDefinition : -# 288| mu288_3(unknown) = InitializeNonLocal : -# 288| r288_4(glval) = InitializeThis : -# 288| v288_5(void) = NoOp : -# 288| v288_6(void) = ReturnVoid : -# 288| v288_7(void) = AliasedUse : ~m? -# 288| v288_8(void) = ExitFunction : +# 288| v288_1(void) = EnterFunction : +# 288| mu288_2(unknown) = AliasedDefinition : +# 288| mu288_3(unknown) = InitializeNonLocal : +# 288| r288_4(glval) = VariableAddress[#this] : +# 288| m288_5(glval) = InitializeParameter[#this] : &:r288_4 +# 288| r288_6(glval) = Load : &:r288_4, m288_5 +# 288| mu288_7(A) = InitializeIndirection[#this] : &:r288_6 +# 288| v288_8(void) = NoOp : +# 288| v288_9(void) = ReturnVoid : +# 288| v288_10(void) = AliasedUse : ~m? +# 288| v288_11(void) = ExitFunction : # 291| Point* NewAliasing(int) # 291| Block 0 @@ -1333,3 +1348,25 @@ ssa.cpp: # 301| v301_12(void) = ReturnValue : &:r301_11, m304_7 # 301| v301_13(void) = AliasedUse : ~m? # 301| v301_14(void) = ExitFunction : + +# 310| void ThisAliasTest::setX(int) +# 310| Block 0 +# 310| v310_1(void) = EnterFunction : +# 310| mu310_2(unknown) = AliasedDefinition : +# 310| mu310_3(unknown) = InitializeNonLocal : +# 310| r310_4(glval) = VariableAddress[#this] : +# 310| m310_5(glval) = InitializeParameter[#this] : &:r310_4 +# 310| r310_6(glval) = Load : &:r310_4, m310_5 +# 310| mu310_7(ThisAliasTest) = InitializeIndirection[#this] : &:r310_6 +# 310| r310_8(glval) = VariableAddress[arg] : +# 310| m310_9(int) = InitializeParameter[arg] : &:r310_8 +# 311| r311_1(glval) = VariableAddress[arg] : +# 311| r311_2(int) = Load : &:r311_1, m310_9 +# 311| r311_3(glval) = VariableAddress[#this] : +# 311| r311_4(ThisAliasTest *) = Load : &:r311_3, m310_5 +# 311| r311_5(glval) = FieldAddress[x] : r311_4 +# 311| mu311_6(int) = Store : &:r311_5, r311_2 +# 312| v312_1(void) = NoOp : +# 310| v310_10(void) = ReturnVoid : +# 310| v310_11(void) = AliasedUse : ~m? +# 310| v310_12(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected index 55bea2a11be1..baac8513f47f 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/dataflow-ir-consistency.expected @@ -635,8 +635,6 @@ uniqueNodeToString | duff.c:3:14:3:14 | x | Node should have one toString but has 2. | | duff.c:4:13:4:13 | i | Node should have one toString but has 2. | | duff.c:4:13:4:13 | x | Node should have one toString but has 2. | -| ir.cpp:888:6:888:16 | (no string representation) | Node should have one toString but has 0. | -| misc.c:197:6:197:9 | (no string representation) | Node should have one toString but has 0. | | newexpr.cpp:3:9:3:9 | i | Node should have one toString but has 2. | | newexpr.cpp:3:9:3:9 | x | Node should have one toString but has 2. | | newexpr.cpp:3:16:3:16 | j | Node should have one toString but has 2. | @@ -654,7 +652,6 @@ uniqueNodeToString | switchstmt.c:2:14:2:14 | i | Node should have one toString but has 2. | | switchstmt.c:2:14:2:14 | x | Node should have one toString but has 2. | missingToString -| Nodes without toString: 2 | parameterCallable localFlowIsLocal compatibleTypesReflexive diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/IRVariable.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/IRVariable.qll index 0d5e7fe595c7..9f2a0d4ea281 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/IRVariable.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/IRVariable.qll @@ -223,6 +223,15 @@ class IREllipsisVariable extends IRTempVariable { final override string toString() { result = "#ellipsis" } } +/** + * A temporary variable generated to hold the `this` pointer. + */ +class IRThisVariable extends IRTempVariable { + IRThisVariable() { tag = ThisTempVar() } + + final override string toString() { result = "#this" } +} + /** * A variable generated to represent the contents of a string literal. This variable acts much like * a read-only global variable. diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/IRVariable.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/IRVariable.qll index 0d5e7fe595c7..9f2a0d4ea281 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/IRVariable.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/IRVariable.qll @@ -223,6 +223,15 @@ class IREllipsisVariable extends IRTempVariable { final override string toString() { result = "#ellipsis" } } +/** + * A temporary variable generated to hold the `this` pointer. + */ +class IRThisVariable extends IRTempVariable { + IRThisVariable() { tag = ThisTempVar() } + + final override string toString() { result = "#this" } +} + /** * A variable generated to represent the contents of a string literal. This variable acts much like * a read-only global variable. diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll index c19a34fe0532..1612e0065b77 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll @@ -204,7 +204,7 @@ private predicate isArgumentForParameter(CallInstruction ci, Operand operand, In init.(InitializeParameterInstruction).getParameter() = f.getParameter(operand.(PositionalArgumentOperand).getIndex()) or - init instanceof InitializeThisInstruction and + init.(InitializeParameterInstruction).getIRVariable() instanceof IRThisVariable and init.getEnclosingFunction() = f and operand instanceof ThisArgumentOperand ) and diff --git a/csharp/ql/src/semmle/code/csharp/ir/internal/TempVariableTag.qll b/csharp/ql/src/semmle/code/csharp/ir/internal/TempVariableTag.qll index dec457bcec74..8950c2cd8a88 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/internal/TempVariableTag.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/internal/TempVariableTag.qll @@ -8,7 +8,8 @@ newtype TTempVariableTag = ForeachEnumTempVar() or LockedVarTemp() or LockWasTakenTemp() or - EllipsisTempVar() + EllipsisTempVar() or + ThisTempVar() string getTempVariableTagId(TTempVariableTag tag) { tag = ConditionValueTempVar() and result = "CondVal" @@ -26,4 +27,6 @@ string getTempVariableTagId(TTempVariableTag tag) { tag = LockWasTakenTemp() and result = "LockWasTakenTemp" or tag = EllipsisTempVar() and result = "Ellipsis" + or + tag = ThisTempVar() and result = "This" }