diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll b/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll index eaa1581078bd..0eb1f700194c 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/EscapesTree.qll @@ -83,6 +83,8 @@ private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) { or pointerIn.getConversion() = pointerOut.(ParenthesisExpr) or + pointerIn.getConversion() = pointerOut.(TemporaryObjectExpr) + or pointerIn = pointerOut.(ConditionalExpr).getThen().getFullyConverted() or pointerIn = pointerOut.(ConditionalExpr).getElse().getFullyConverted() diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll b/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll index f9677a0654b7..0ef286e8ab5a 100644 --- a/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll +++ b/cpp/ql/src/semmle/code/cpp/dataflow/internal/AddressFlow.qll @@ -81,6 +81,8 @@ private predicate pointerToPointerStep(Expr pointerIn, Expr pointerOut) { or pointerIn.getConversion() = pointerOut.(ParenthesisExpr) or + pointerIn.getConversion() = pointerOut.(TemporaryObjectExpr) + or pointerIn = pointerOut.(ConditionalExpr).getThen().getFullyConverted() or pointerIn = pointerOut.(ConditionalExpr).getElse().getFullyConverted() diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll b/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll index e06ed095d401..ebe88ddf71c7 100644 --- a/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll +++ b/cpp/ql/src/semmle/code/cpp/exprs/Cast.qll @@ -840,6 +840,28 @@ class ArrayToPointerConversion extends Conversion, @array_to_pointer { override predicate mayBeGloballyImpure() { none() } } +/** + * A node representing a temporary object created as part of an expression. + * + * This is most commonly seen in the following cases: + * ```c++ + * // when binding a reference to a prvalue + * const std::string& r = std::string("text"); + * + * // when performing member access on a class prvalue + * strlen(std::string("text").c_str()); + * + * // when a prvalue of a type with a destructor is discarded + * s.substr(0, 5); // Return value is discarded but requires destruction + * ``` + */ +class TemporaryObjectExpr extends Conversion, @temp_init { + /** Gets a textual representation of this conversion. */ + override string toString() { result = "temporary object" } + + override string getAPrimaryQlClass() { result = "TemporaryObjectExpr" } +} + /** * A node representing the Cast sub-class of entity `cast`. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll index 78fd5acc175b..5129078545c2 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll @@ -83,7 +83,7 @@ private class DefaultTaintTrackingCfg extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { exists(adjustedSink(sink)) } override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { - instructionTaintStep(n1.asInstruction(), n2.asInstruction()) + commonTaintStep(n1, n2) } override predicate isBarrier(DataFlow::Node node) { nodeIsBarrier(node) } @@ -101,7 +101,7 @@ private class ToGlobalVarTaintTrackingCfg extends DataFlow::Configuration { } override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { - instructionTaintStep(n1.asInstruction(), n2.asInstruction()) + commonTaintStep(n1, n2) or writesVariable(n1.asInstruction(), n2.asVariable().(GlobalOrNamespaceVariable)) or @@ -125,7 +125,7 @@ private class FromGlobalVarTaintTrackingCfg extends DataFlow2::Configuration { override predicate isSink(DataFlow::Node sink) { exists(adjustedSink(sink)) } override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { - instructionTaintStep(n1.asInstruction(), n2.asInstruction()) + commonTaintStep(n1, n2) or // Additional step for flow out of variables. There is no flow _into_ // variables in this configuration, so this step only serves to take flow @@ -215,19 +215,62 @@ private predicate nodeIsBarrierIn(DataFlow::Node node) { } cached -private predicate instructionTaintStep(Instruction i1, Instruction i2) { +private predicate commonTaintStep(DataFlow::Node fromNode, DataFlow::Node toNode) { + instructionToInstructionTaintStep(fromNode.asInstruction(), toNode.asInstruction()) + or + operandToInstructionTaintStep(fromNode.asOperand(), toNode.asInstruction()) + or + operandToOperandTaintStep(fromNode.asOperand(), toNode.asOperand()) +} + +private predicate operandToOperandTaintStep(Operand fromOperand, Operand toOperand) { + exists(ReadSideEffectInstruction readInstr | + fromOperand = readInstr.getArgumentOperand() and + toOperand = readInstr.getSideEffectOperand() + ) +} + +private predicate operandToInstructionTaintStep(Operand fromOperand, Instruction toInstr) { // Expressions computed from tainted data are also tainted - exists(CallInstruction call, int argIndex | call = i2 | + exists(CallInstruction call, int argIndex | call = toInstr | isPureFunction(call.getStaticCallTarget().getName()) and - i1 = getACallArgumentOrIndirection(call, argIndex) and - forall(Instruction arg | arg = call.getAnArgument() | - arg = getACallArgumentOrIndirection(call, argIndex) or predictableInstruction(arg) + fromOperand = getACallArgumentOrIndirection(call, argIndex) and + forall(Operand argOperand | argOperand = call.getAnArgumentOperand() | + argOperand = getACallArgumentOrIndirection(call, argIndex) or + predictableInstruction(argOperand.getAnyDef()) ) and // flow through `strlen` tends to cause dubious results, if the length is // bounded. not call.getStaticCallTarget().getName() = "strlen" ) or + // Flow from argument to return value + toInstr = + any(CallInstruction call | + exists(int indexIn | + modelTaintToReturnValue(call.getStaticCallTarget(), indexIn) and + fromOperand = getACallArgumentOrIndirection(call, indexIn) and + not predictableOnlyFlow(call.getStaticCallTarget().getName()) + ) + ) + or + // Flow from input argument to output argument + // TODO: This won't work in practice as long as all aliased memory is tracked + // together in a single virtual variable. + // TODO: Will this work on the test for `TaintedPath.ql`, where the output arg + // is a pointer addition expression? + toInstr = + any(WriteSideEffectInstruction outInstr | + exists(CallInstruction call, int indexIn, int indexOut | + modelTaintToParameter(call.getStaticCallTarget(), indexIn, indexOut) and + fromOperand = getACallArgumentOrIndirection(call, indexIn) and + outInstr.getIndex() = indexOut and + outInstr.getPrimaryInstruction() = call + ) + ) +} + +private predicate instructionToInstructionTaintStep(Instruction i1, Instruction i2) { // Flow through pointer dereference i2.(LoadInstruction).getSourceAddress() = i1 or @@ -291,29 +334,6 @@ private predicate instructionTaintStep(Instruction i1, Instruction i2) { read.getAnOperand().(SideEffectOperand).getAnyDef() = i1 and read.getArgumentDef() = i2 ) - or - // Flow from argument to return value - i2 = - any(CallInstruction call | - exists(int indexIn | - modelTaintToReturnValue(call.getStaticCallTarget(), indexIn) and - i1 = getACallArgumentOrIndirection(call, indexIn) and - not predictableOnlyFlow(call.getStaticCallTarget().getName()) - ) - ) - or - // Flow from input argument to output argument - // TODO: Will this work on the test for `TaintedPath.ql`, where the output arg - // is a pointer addition expression? - i2 = - any(WriteSideEffectInstruction outNode | - exists(CallInstruction call, int indexIn, int indexOut | - modelTaintToParameter(call.getStaticCallTarget(), indexIn, indexOut) and - i1 = getACallArgumentOrIndirection(call, indexIn) and - outNode.getIndex() = indexOut and - outNode.getPrimaryInstruction() = call - ) - ) } pragma[noinline] @@ -329,15 +349,25 @@ private InitializeParameterInstruction getInitializeParameter(IRFunction f, Para } /** - * Get an instruction that goes into argument `argumentIndex` of `call`. This + * Returns the index of the side effect instruction corresponding to the specified function output, + * if one exists. + */ +private int getWriteSideEffectIndex(FunctionOutput output) { + output.isParameterDeref(result) + or + output.isQualifierObject() and result = -1 +} + +/** + * Get an operand that goes into argument `argumentIndex` of `call`. This * can be either directly or through one pointer indirection. */ -private Instruction getACallArgumentOrIndirection(CallInstruction call, int argumentIndex) { - result = call.getPositionalArgument(argumentIndex) +private Operand getACallArgumentOrIndirection(CallInstruction call, int argumentIndex) { + result = call.getPositionalArgumentOperand(argumentIndex) or exists(ReadSideEffectInstruction readSE | // TODO: why are read side effect operands imprecise? - result = readSE.getSideEffectOperand().getAnyDef() and + result = readSE.getSideEffectOperand() and readSE.getPrimaryInstruction() = call and readSE.getIndex() = argumentIndex ) @@ -351,7 +381,7 @@ private predicate modelTaintToParameter(Function f, int parameterIn, int paramet f.(TaintFunction).hasTaintFlow(modelIn, modelOut) ) and (modelIn.isParameter(parameterIn) or modelIn.isParameterDeref(parameterIn)) and - modelOut.isParameterDeref(parameterOut) + parameterOut = getWriteSideEffectIndex(modelOut) ) } @@ -540,7 +570,7 @@ module TaintedWithPath { } override predicate isAdditionalFlowStep(DataFlow::Node n1, DataFlow::Node n2) { - instructionTaintStep(n1.asInstruction(), n2.asInstruction()) + commonTaintStep(n1, n2) or exists(TaintTrackingConfiguration cfg | cfg.taintThroughGlobals() | writesVariable(n1.asInstruction(), n2.asVariable().(GlobalOrNamespaceVariable)) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll index 821bf94709a8..576743154f1d 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll @@ -8,6 +8,16 @@ private import TranslatedElement private import TranslatedExpr private import TranslatedFunction +/** + * Gets the `CallInstruction` from the `TranslatedCallExpr` for the specified expression. + */ +private CallInstruction getTranslatedCallInstruction(Call call) { + exists(TranslatedCallExpr translatedCall | + translatedCall.getExpr() = call and + result = translatedCall.getInstruction(CallTag()) + ) +} + /** * The IR translation of a call to a function. The call may be from an actual * call in the source code, or could be a call that is part of the translation @@ -388,7 +398,7 @@ class TranslatedAllocationSideEffects extends TranslatedSideEffects, tag = OnlyInstructionTag() and if expr instanceof NewOrNewArrayExpr then result = getTranslatedAllocatorCall(expr).getInstruction(CallTag()) - else result = getTranslatedExpr(expr).getInstruction(CallTag()) + else result = getTranslatedCallInstruction(expr) } } @@ -409,7 +419,7 @@ class TranslatedCallSideEffects extends TranslatedSideEffects, TTranslatedCallSi override Instruction getPrimaryInstructionForSideEffect(InstructionTag tag) { tag = OnlyInstructionTag() and - result = getTranslatedExpr(expr).getInstruction(CallTag()) + result = getTranslatedCallInstruction(expr) } } @@ -599,7 +609,7 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff override Instruction getPrimaryInstructionForSideEffect(InstructionTag tag) { tag = OnlyInstructionTag() and - result = getTranslatedExpr(call).getInstruction(CallTag()) + result = getTranslatedCallInstruction(call) } final override int getInstructionIndex(InstructionTag 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 f3c8816c19d6..9a1b21f9a791 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 @@ -227,6 +227,125 @@ private predicate usedAsCondition(Expr expr) { ) } +/** + * Holds if `conv` is an `InheritanceConversion` that requires a `TranslatedLoad`, despite not being + * marked as having an lvalue-to-rvalue conversion. + * + * This is necessary for an `InheritanceConversion` that is originally modeled as a + * prvalue-to-prvalue conversion, since we transform it into a glvalue-to-glvalue conversion. If it + * is actually consumed as a prvalue, such as on the right hand side of an assignment, we need to + * load the resulting glvalue. + */ +private predicate isInheritanceConversionWithImplicitLoad(InheritanceConversion conv) { + // Must have originally been a prvalue-to-prvalue conversion. + isClassPRValue(conv.getExpr()) and + not conv.hasLValueToRValueConversion() and + // Exclude that case where this will be consumed as a glvalue, such as when used as the qualifier + // of a field access. + not isPRValueConversionOnGLValue(conv) +} + +/** + * Holds if `expr` is the result of a field access whose qualifier was a prvalue and whose result is + * a prvalue. These accesses are not marked as having loads, but we do need a load in the IR. + */ +private predicate isPRValueFieldAccessWithImplicitLoad(Expr expr) { + expr instanceof ValueFieldAccess and + expr.isPRValueCategory() and + // No need to do a load if we're replacing the result with a constant anyway. + not isIRConstant(expr) and + // Model an array prvalue as the address of the array, just like an array glvalue. + not expr.getUnspecifiedType() instanceof ArrayType +} + +/** + * Holds if `expr` is a prvalue of class type. + * + * This same test is used in several places. + */ +pragma[inline] +private predicate isClassPRValue(Expr expr) { + expr.isPRValueCategory() and + expr.getUnspecifiedType() instanceof Class +} + +/** + * Holds if `expr` is consumed as a glvalue by its parent. If `expr` is actually a prvalue, it will + * have any lvalue-to-rvalue conversion ignored. If it does not have an lvalue-to-rvalue conversion, + * it will be materialized into a temporary object. + */ +private predicate consumedAsGLValue(Expr expr) { + isClassPRValue(expr) and + ( + // Qualifier of a field access. + expr = any(FieldAccess a).getQualifier().getFullyConverted() + or + // Qualifier of a member function call. + expr = any(Call c).getQualifier().getFullyConverted() + or + // The operand of an inheritance conversion. + expr = any(InheritanceConversion c).getExpr() + ) +} + +/** + * Holds if `expr` is a conversion that is originally a prvalue-to-prvalue conversion, but which is + * applied to a prvalue that will actually be consumed as a glvalue. + */ +predicate isPRValueConversionOnGLValue(Conversion conv) { + exists(Expr consumed | + consumedAsGLValue(consumed) and + isClassPRValue(conv.getExpr()) and + ( + // Example: The conversion of `std::string` to `const std::string` when evaluating + // `std::string("foo").c_str()`. + conv instanceof PrvalueAdjustmentConversion + or + // Parentheses are transparent. + conv instanceof ParenthesisExpr + or + // Example: The base class conversion in `f().m()`, when `m` is member function of a base + // class of the return type of `f()`. + conv instanceof InheritanceConversion + ) and + ( + // Base case: The conversion is consumed directly. + conv = consumed + or + // Recursive case: The conversion is the operand of another prvalue conversion. + isPRValueConversionOnGLValue(conv.getConversion()) + ) + ) +} + +/** + * Holds if `expr` is a prvalue of class type that is used in a context that requires a glvalue. + * + * Any conversions between `expr` and the ancestor that consumes the glvalue will also be treated + * as glvalues, but are not part of this relation. + * + * For example: + * ```c++ + * std::string("s").c_str(); + * ``` + * The object for the qualifier is a prvalue(load) of type `std::string`, but the actual + * fully-converted qualifier of the call to `c_str()` is a prvalue adjustment conversion that + * converts the type to `const std::string` to match the type of the `this` pointer of the + * member function. In this case, `mustTransformToGLValue()` will hold for the temporary + * `std::string` object, but not the prvalue adjustment on top of it. + * `isPRValueConversionOnGLValue()` would hold for the prvalue adjustment. + */ +private predicate mustTransformToGLValue(Expr expr) { + not isPRValueConversionOnGLValue(expr) and + ( + // The expression is the fully converted qualifier, with no prvalue adjustments on top. + consumedAsGLValue(expr) + or + // The expression has conversions on top, but they are all prvalue adjustments. + isPRValueConversionOnGLValue(expr.getConversion()) + ) +} + /** * Holds if `expr` has an lvalue-to-rvalue conversion that should be ignored * when generating IR. This occurs for conversion from an lvalue of function type @@ -234,15 +353,24 @@ private predicate usedAsCondition(Expr expr) { * AST as an lvalue-to-rvalue conversion, but the IR represents both a function * lvalue and a function pointer prvalue the same. */ -private predicate ignoreLoad(Expr expr) { +predicate ignoreLoad(Expr expr) { expr.hasLValueToRValueConversion() and ( - expr instanceof ThisExpr or - expr instanceof FunctionAccess or + expr instanceof ThisExpr + or + expr instanceof FunctionAccess + or expr.(PointerDereferenceExpr).getOperand().getFullyConverted().getType().getUnspecifiedType() - instanceof FunctionPointerType or + instanceof FunctionPointerType + or expr.(ReferenceDereferenceExpr).getExpr().getType().getUnspecifiedType() instanceof FunctionReferenceType + or + // The extractor represents the qualifier of a field access or member function call as a load of + // the temporary object if the original qualifier was a prvalue. For IR purposes, we always want + // to use the address of the temporary object as the qualifier of a field access or the `this` + // argument to a member function call. + mustTransformToGLValue(expr) ) } @@ -257,6 +385,17 @@ private predicate needsLoadForParentExpr(Expr expr) { exists(CrementOperation crement | expr = crement.getOperand().getFullyConverted()) or exists(AssignOperation ao | expr = ao.getLValue().getFullyConverted()) + or + // For arguments that are passed by value but require a constructor call, the extractor emits a + // `TemporaryObjectExpr` as the argument, and marks it as a glvalue. This is roughly how a code- + // generating compiler would implement this, passing the address of the temporary so that the + // callee is using the exact same memory location allocated by the caller. We don't fully model + // this yet, though, so we'll synthesize a load so that we appear to be passing the temporary + // object via a bitwise copy. + exists(Call call | + expr = call.getAnArgument().getFullyConverted().(TemporaryObjectExpr) and + expr.isGLValueCategory() + ) } /** @@ -267,6 +406,10 @@ predicate hasTranslatedLoad(Expr expr) { expr.hasLValueToRValueConversion() or needsLoadForParentExpr(expr) + or + isPRValueFieldAccessWithImplicitLoad(expr) + or + isInheritanceConversionWithImplicitLoad(expr) ) and not ignoreExpr(expr) and not isNativeCondition(expr) and @@ -274,6 +417,16 @@ predicate hasTranslatedLoad(Expr expr) { not ignoreLoad(expr) } +/** + * Holds if `expr` should have a `TranslatedSyntheticTemporaryObject` on it. + */ +predicate hasTranslatedSyntheticTemporaryObject(Expr expr) { + not ignoreExpr(expr) and + mustTransformToGLValue(expr) and + // If it's a load, we'll just ignore the load in `ignoreLoad()`. + not expr.hasLValueToRValueConversion() +} + /** * Holds if the specified `DeclarationEntry` needs an IR translation. An IR translation is only * necessary for automatic local variables, or for static local variables with dynamic @@ -304,6 +457,9 @@ newtype TTranslatedElement = // A separate element to handle the lvalue-to-rvalue conversion step of an // expression. TTranslatedLoad(Expr expr) { hasTranslatedLoad(expr) } or + // A temporary object that we had to synthesize ourselves, so that we could do a field access or + // method call on a prvalue. + TTranslatedSyntheticTemporaryObject(Expr expr) { hasTranslatedSyntheticTemporaryObject(expr) } or // For expressions that would not otherwise generate an instruction. TTranslatedResultCopy(Expr expr) { not ignoreExpr(expr) and @@ -351,6 +507,7 @@ newtype TTranslatedElement = exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) or exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) or exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) or + exists(TemporaryObjectExpr temp | temp.getExpr() = expr) or exists(LambdaExpression lambda | lambda.getInitializer().getFullyConverted() = expr) ) } or 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 6da9193fd580..a9f408bf161e 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 @@ -15,8 +15,9 @@ private import TranslatedStmt import TranslatedCall /** - * Gets the TranslatedExpr for the specified expression. If `expr` is a load, - * the result is the TranslatedExpr for the load portion. + * Gets the TranslatedExpr for the specified expression. If `expr` is a load or synthesized + * temporary object, the result is the TranslatedExpr for the load or synthetic temporary object + * portion. */ TranslatedExpr getTranslatedExpr(Expr expr) { result.getExpr() = expr and @@ -107,12 +108,17 @@ abstract class TranslatedCoreExpr extends TranslatedExpr { // If this TranslatedExpr doesn't produce the result, then it must represent // a glvalue that is then loaded by a TranslatedLoad. hasTranslatedLoad(expr) + or + // The expression should be treated as a glvalue because its operand was forced to be a glvalue, + // such as for the qualifier of a member access. + isPRValueConversionOnGLValue(expr) } final override predicate producesExprResult() { - // If there's no load, then this is the only TranslatedExpr for this + // If there's no load or temp object, then this is the only TranslatedExpr for this // expression. not hasTranslatedLoad(expr) and + not hasTranslatedSyntheticTemporaryObject(expr) and // If there's a result copy, then this expression's result is the copy. not exprNeedsCopyIfNotLoaded(expr) } @@ -246,19 +252,35 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext, private TranslatedCondition getCondition() { result = getTranslatedCondition(expr) } } +/** + * The IR translation of a node synthesized to adjust the value category of its operand. + * One of: + * - `TranslatedLoad` - Convert from glvalue to prvalue by loading from the location. + * - `TranslatedSyntheticTemporaryObject` - Convert from prvalue to glvalue by storing to a + * temporary variable. + */ +abstract class TranslatedValueCategoryAdjustment extends TranslatedExpr { + final override Instruction getFirstInstruction() { result = getOperand().getFirstInstruction() } + + final override TranslatedElement getChild(int id) { id = 0 and result = getOperand() } + + final override predicate producesExprResult() { + // A temp object always produces the result of the expression. + any() + } + + final TranslatedCoreExpr getOperand() { result.getExpr() = expr } +} + /** * IR translation of an implicit lvalue-to-rvalue conversion on the result of * an expression. */ -class TranslatedLoad extends TranslatedExpr, TTranslatedLoad { +class TranslatedLoad extends TranslatedValueCategoryAdjustment, TTranslatedLoad { TranslatedLoad() { this = TTranslatedLoad(expr) } override string toString() { result = "Load of " + expr.toString() } - override Instruction getFirstInstruction() { result = getOperand().getFirstInstruction() } - - override TranslatedElement getChild(int id) { id = 0 and result = getOperand() } - override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { tag = LoadTag() and opcode instanceof Opcode::Load and @@ -286,18 +308,75 @@ class TranslatedLoad extends TranslatedExpr, TTranslatedLoad { result = getOperand().getResult() ) } +} - final override predicate producesExprResult() { - // A load always produces the result of the expression. - any() +/** + * The IR translation of a temporary object synthesized by the IR to hold a class prvalue on which + * a member access is going to be performed. This differs from `TranslatedTemporaryObjectExpr` in + * that instances of `TranslatedSyntheticTemporaryObject` are synthesized during IR construction, + * whereas `TranslatedTemporaryObjectExpr` instances are created from `TemporaryObjectExpr` nodes + * from the AST. + */ +class TranslatedSyntheticTemporaryObject extends TranslatedValueCategoryAdjustment, + TTranslatedSyntheticTemporaryObject { + TranslatedSyntheticTemporaryObject() { this = TTranslatedSyntheticTemporaryObject(expr) } + + override string toString() { result = "Temporary materialization of " + expr.toString() } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + tag = InitializerVariableAddressTag() and + opcode instanceof Opcode::VariableAddress and + resultType = getTypeForGLValue(expr.getType()) + or + tag = InitializerStoreTag() and + opcode instanceof Opcode::Store and + resultType = getTypeForPRValue(expr.getType()) } - TranslatedCoreExpr getOperand() { result.getExpr() = expr } + override predicate isResultGLValue() { any() } + + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { + tag = InitializerVariableAddressTag() and + result = getInstruction(InitializerStoreTag()) and + kind instanceof GotoEdge + or + tag = InitializerStoreTag() and + result = getParent().getChildSuccessor(this) and + kind instanceof GotoEdge + } + + override Instruction getChildSuccessor(TranslatedElement child) { + child = getOperand() and result = getInstruction(InitializerVariableAddressTag()) + } + + override Instruction getResult() { result = getInstruction(InitializerVariableAddressTag()) } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + tag = InitializerStoreTag() and + ( + operandTag instanceof AddressOperandTag and + result = getInstruction(InitializerVariableAddressTag()) + or + operandTag instanceof StoreValueOperandTag and + result = getOperand().getResult() + ) + } + + final override predicate hasTempVariable(TempVariableTag tag, CppType type) { + tag = TempObjectTempVar() and + type = getTypeForPRValue(expr.getType()) + } + + final override IRVariable getInstructionVariable(InstructionTag tag) { + tag = InitializerVariableAddressTag() and + result = getIRTempVariable(expr, TempObjectTempVar()) + } } /** - * IR translation of an implicit lvalue-to-rvalue conversion on the result of - * an expression. + * IR translation of an expression that simply returns its result. We generate an otherwise useless + * `CopyValue` instruction for these expressions so that there is at least one instruction + * associated with the expression. */ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy { TranslatedResultCopy() { this = TTranslatedResultCopy(expr) } @@ -2049,6 +2128,38 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr { } } +/** + * IR translation of the materialization of a temporary object. + * + * This translation allocates a temporary variable, and initializes it treating `expr.getExpr()` as + * its initializer. + */ +class TranslatedTemporaryObjectExpr extends TranslatedNonConstantExpr, + TranslatedVariableInitialization { + override TemporaryObjectExpr expr; + + final override predicate hasTempVariable(TempVariableTag tag, CppType type) { + tag = TempObjectTempVar() and + type = getTypeForPRValue(expr.getType()) + } + + override Type getTargetType() { result = expr.getType() } + + final override TranslatedInitialization getInitialization() { + result = getTranslatedInitialization(expr.getExpr()) + } + + final override IRVariable getIRVariable() { + result = getIRTempVariable(expr, TempObjectTempVar()) + } + + final override Instruction getInitializationSuccessor() { + result = getParent().getChildSuccessor(this) + } + + final override Instruction getResult() { result = getTargetAddress() } +} + /** * IR translation of a `throw` expression. */ diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } 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 c33280512867..e9fd299da456 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/internal/TempVariableTag.qll @@ -4,7 +4,8 @@ newtype TTempVariableTag = ThrowTempVar() or LambdaTempVar() or EllipsisTempVar() or - ThisTempVar() + ThisTempVar() or + TempObjectTempVar() string getTempVariableTagId(TTempVariableTag tag) { tag = ConditionValueTempVar() and result = "CondVal" @@ -18,4 +19,6 @@ string getTempVariableTagId(TTempVariableTag tag) { tag = EllipsisTempVar() and result = "Ellipsis" or tag = ThisTempVar() and result = "This" + or + tag = TempObjectTempVar() and result = "Temp" } diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll index 0e4812cc25cc..70bf37a96d38 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/MemberFunction.qll @@ -35,7 +35,11 @@ class ConversionConstructorModel extends Constructor, TaintFunction { class CopyConstructorModel extends CopyConstructor, DataFlowFunction { override predicate hasDataFlow(FunctionInput input, FunctionOutput output) { // data flow from the first constructor argument to the returned object - input.isParameter(0) and + ( + input.isParameter(0) + or + input.isParameterDeref(0) + ) and ( output.isReturnValue() or @@ -50,7 +54,11 @@ class CopyConstructorModel extends CopyConstructor, DataFlowFunction { class MoveConstructorModel extends MoveConstructor, DataFlowFunction { override predicate hasDataFlow(FunctionInput input, FunctionOutput output) { // data flow from the first constructor argument to the returned object - input.isParameter(0) and + ( + input.isParameter(0) + or + input.isParameterDeref(0) + ) and ( output.isReturnValue() or diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll index 30a0fdfb34bb..c2226224e8f0 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/SmartPointer.qll @@ -17,7 +17,11 @@ class MakeUniqueOrShared extends TaintFunction { // Exclude the specializations of `std::make_shared` and `std::make_unique` that allocate arrays // since these just take a size argument, which we don't want to propagate taint through. not this.isArray() and - input.isParameter([0 .. getNumberOfParameters() - 1]) and + ( + input.isParameter([0 .. getNumberOfParameters() - 1]) + or + input.isParameterDeref([0 .. getNumberOfParameters() - 1]) + ) and output.isReturnValue() } diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll index 61be0550012a..fbc8515b5ca1 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/StdPair.qll @@ -4,6 +4,36 @@ import semmle.code.cpp.models.interfaces.Taint +/** + * An instantiation of `std::pair`. + */ +class StdPairClass extends ClassTemplateInstantiation { + StdPairClass() { getTemplate().hasQualifiedName("std", "pair") } +} + +/** + * Any of the single-parameter constructors of `std::pair` that takes a reference to an + * instantiation of `std::pair`. These constructors allow conversion between pair types when the + * underlying element types are convertible. + */ +class StdPairCopyishConstructor extends Constructor, TaintFunction { + StdPairCopyishConstructor() { + this.getDeclaringType() instanceof StdPairClass and + this.getNumberOfParameters() = 1 and + this.getParameter(0).getUnspecifiedType().(ReferenceType).getBaseType() instanceof StdPairClass + } + + override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { + // taint flow from the source object to the constructed object + input.isParameterDeref(0) and + ( + output.isReturnValue() + or + output.isQualifierObject() + ) + } +} + /** * Additional model for `std::pair` constructors. */ diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll index 06e8be4c4a41..5dd4100fbff0 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/StdSet.qll @@ -61,7 +61,7 @@ class StdSetEmplace extends TaintFunction { // flow from any parameter to qualifier and return value // (here we assume taint flow from any constructor parameter to the constructed object) // (where the return value is a pair, this should really flow just to the first part of it) - input.isParameter([0 .. getNumberOfParameters() - 1]) and + input.isParameterDeref([0 .. getNumberOfParameters() - 1]) and ( output.isQualifierObject() or output.isReturnValue() diff --git a/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll b/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll index b8a000b963ea..d2b52a65058e 100644 --- a/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll +++ b/cpp/ql/src/semmle/code/cpp/models/implementations/StdString.qll @@ -30,10 +30,19 @@ class StdStringConstructor extends Constructor, TaintFunction { * character). */ int getAStringParameterIndex() { - getParameter(result).getType() instanceof PointerType or // e.g. `std::basic_string::CharT *` - getParameter(result).getType() instanceof ReferenceType or // e.g. `std::basic_string &` - getParameter(result).getUnspecifiedType() = - getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType() // i.e. `std::basic_string::CharT` + exists(Type paramType | paramType = getParameter(result).getUnspecifiedType() | + // e.g. `std::basic_string::CharT *` + paramType instanceof PointerType + or + // e.g. `std::basic_string &`, avoiding `const Allocator&` + paramType instanceof ReferenceType and + not paramType.(ReferenceType).getBaseType() = + getDeclaringType().getTemplateArgument(2).(Type).getUnspecifiedType() + or + // i.e. `std::basic_string::CharT` + getParameter(result).getUnspecifiedType() = + getDeclaringType().getTemplateArgument(0).(Type).getUnspecifiedType() + ) } /** diff --git a/cpp/ql/src/semmlecode.cpp.dbscheme b/cpp/ql/src/semmlecode.cpp.dbscheme index ef73d8cf906d..c82db4c596b8 100644 --- a/cpp/ql/src/semmlecode.cpp.dbscheme +++ b/cpp/ql/src/semmlecode.cpp.dbscheme @@ -1171,6 +1171,7 @@ conversionkinds( | @parexpr | @reference_to | @ref_indirect + | @temp_init ; /* @@ -1673,6 +1674,7 @@ case @expr.kind of | 326 = @spaceshipexpr | 327 = @co_await | 328 = @co_yield +| 329 = @temp_init ; @var_args_expr = @vastartexpr diff --git a/cpp/ql/src/semmlecode.cpp.dbscheme.stats b/cpp/ql/src/semmlecode.cpp.dbscheme.stats index eb699cba62e0..61a31212bfa0 100644 --- a/cpp/ql/src/semmlecode.cpp.dbscheme.stats +++ b/cpp/ql/src/semmlecode.cpp.dbscheme.stats @@ -1,7 +1,7 @@ @compilation -9552 +9440 @externalDataElement @@ -9,7 +9,7 @@ @duplication -185064 +185333 @similarity @@ -17,7 +17,7 @@ @external_package -120 +119 @svnentry @@ -25,67 +25,67 @@ @location_default -8813832 +8719593 @location_stmt -2176409 +2179578 @location_expr -9755082 +9756708 @diagnostic -68699 +67893 @file -60023 +59320 @folder -10945 +10817 @macroinvocation -35580051 +34675701 @function -3468314 +3658482 @fun_decl -3540621 +3730234 @var_decl -5360115 +5296821 @type_decl -1332162 +1316547 @namespace_decl -136871 +135267 @using -291444 +287692 @static_assert -130658 +130452 @parameter -4627983 +4572935 @membervariable -305691 +302107 @globalvariable @@ -93,59 +93,59 @@ @localvariable -521215 +520392 @enumconstant -93839 +93691 @builtintype -515 +509 @derivedtype -4463123 +4408457 @decltype -47005 +46454 @usertype -4193942 +4144306 @mangledname -483689 +478020 @type_mention -1677532 +1674881 @routinetype -430487 +421539 @ptrtomember -12634 +12486 @specifier -504 +498 @gnuattribute -413727 +414234 @stdattribute -364 +363 @declspec -57827 +57736 @msattribute @@ -153,7 +153,7 @@ @alignas -1743 +1723 @attribute_arg_empty @@ -161,11 +161,11 @@ @attribute_arg_token -15725 +15700 @attribute_arg_constant -146275 +146454 @attribute_arg_type @@ -173,19 +173,19 @@ @derivation -390270 +385706 @frienddecl -240347 +237444 @comment -1580341 +1561817 @namespace -7688 +7597 @specialnamequalifyingelement @@ -193,19 +193,19 @@ @namequalifier -1114410 +1119060 @value -8774612 +8774622 @initialiser -1664806 +1662175 @errorexpr -48716 +48145 @address_of @@ -213,15 +213,15 @@ @reference_to -1057914 +1045861 @indirect -294271 +294699 @ref_indirect -1253867 +1239321 @array_to_pointer @@ -229,15 +229,15 @@ @vacuous_destructor_call -5121 +5061 @assume -3285 +3280 @parexpr -2996445 +3000807 @arithnegexpr @@ -245,15 +245,15 @@ @unaryplusexpr -186 +184 @complementexpr -27992 +28032 @notexpr -337994 +338408 @conjugation @@ -269,43 +269,43 @@ @postincrexpr -42985 +43048 @postdecrexpr -5394 +5402 @preincrexpr -62524 +61791 @predecrexpr -24797 +24506 @conditionalexpr -154261 +154485 @addexpr -246477 +246779 @subexpr -134811 +135008 @mulexpr -140469 +140641 @divexpr -63654 +63732 @remexpr -4533 +4539 @jmulexpr @@ -333,59 +333,59 @@ @paddexpr -87143 +87270 @psubexpr -21943 +21970 @pdiffexpr -25082 +24788 @lshiftexpr -350147 +350576 @rshiftexpr -71701 +71789 @andexpr -257683 +257998 @orexpr -143371 +143145 @xorexpr -37259 +37313 @eqexpr -212356 +212665 @neexpr -88346 +88475 @gtexpr -43881 +43945 @ltexpr -51732 +51329 @geexpr -22333 +22366 @leexpr -213633 +213944 @minexpr @@ -397,7 +397,7 @@ @assignexpr -550951 +551753 @assignaddexpr @@ -409,19 +409,19 @@ @assignmulexpr -6909 +6828 @assigndivexpr -2072 +2048 @assignremexpr -274 +270 @assignlshiftexpr -597 +598 @assignrshiftexpr @@ -429,39 +429,39 @@ @assignandexpr -7182 +7190 @assignorexpr -17554 +17576 @assignxorexpr -21965 +21997 @assignpaddexpr -13045 +13024 @assignpsubexpr -576 +577 @andlogicalexpr -130795 +130955 @orlogicalexpr -74561 +74652 @commaexpr -10726 +10611 @subscriptexpr -165977 +166218 @virtfunptrexpr @@ -469,19 +469,19 @@ @callexpr -226781 +224123 @vastartexpr -3663 +3657 @vaargexpr -987 +975 @vaendexpr -490 +491 @vacopyexpr @@ -489,63 +489,63 @@ @varaccess -5318202 +5309798 @thisaccess -1167110 +1165266 @new_expr -32134 +31757 @delete_expr -5966 +5896 @throw_expr -22318 +22056 @condition_decl -7008 +6947 @braced_init_list -120 +119 @type_id -4419 +4368 @runtime_sizeof -278884 +279225 @runtime_alignof -1558 +1561 @sizeof_pack -471 +466 @expr_stmt -156383 +156574 @routineexpr -2265785 +2239747 @type_operand -123307 +123457 @offsetofexpr -33600 +33641 @hasassignexpr @@ -593,7 +593,7 @@ @isbaseofexpr -39 +38 @isclassexpr @@ -605,7 +605,7 @@ @isemptyexpr -164 +162 @isenumexpr @@ -613,7 +613,7 @@ @ispodexpr -603 +596 @ispolyexpr @@ -625,7 +625,7 @@ @typescompexpr -44853 +44908 @intaddrexpr @@ -633,27 +633,27 @@ @hastrivialdestructor -109 +108 @literal -4380627 +4380637 @uuidof -845 +844 @aggregateliteral -915581 +915561 @delete_array_expr -1348 +1333 @new_array_expr -5296 +5287 @foldexpr @@ -661,47 +661,47 @@ @ctordirectinit -90194 +89137 @ctorvirtualinit -6229 +6156 @ctorfieldinit -196051 +193753 @ctordelegatinginit -734 +726 @dtordirectdestruct -29140 +28798 @dtorvirtualdestruct -2434 +2406 @dtorfielddestruct -29907 +29557 @static_cast -214761 +212243 @reinterpret_cast -30807 +30758 @const_cast -5308 +5245 @dynamic_cast -987 +975 @c_style_cast @@ -709,15 +709,15 @@ @lambdaexpr -12680 +12660 @param_ref -85895 +84888 @noopexpr -39 +38 @istriviallyconstructibleexpr @@ -753,7 +753,7 @@ @istriviallycopyableexpr -2357 +2330 @isliteraltypeexpr @@ -813,11 +813,11 @@ @isfinalexpr -164 +162 @noexceptexpr -17525 +17320 @builtinshufflevector @@ -825,11 +825,11 @@ @builtinchooseexpr -7396 +7405 @builtinaddressof -3970 +3923 @vec_fill @@ -856,68 +856,72 @@ 1 +@temp_init +241259 + + @lambdacapture -21652 +21618 @stmt_expr -1269727 +1267720 @stmt_if -523910 +524673 @stmt_while -30993 +30641 @stmt_goto -111306 +111468 @stmt_label -81478 +81577 @stmt_return -1130211 +1116898 @stmt_block -1325121 +1309643 @stmt_end_test_while -149713 +149931 @stmt_for -32153 +32103 @stmt_switch_case -271389 +271721 @stmt_switch -53243 +53308 @stmt_asm -241253 +241548 @stmt_try_block -17964 +17753 @stmt_microsoft_try -169 +168 @stmt_decl -613092 +605017 @stmt_set_vla_size @@ -929,19 +933,19 @@ @stmt_assigned_goto -9126 +9139 @stmt_empty -102356 +102194 @stmt_continue -8070 +8080 @stmt_break -223842 +224116 @stmt_range_based_for @@ -949,7 +953,7 @@ @stmt_handler -21646 +21612 @stmt_constexpr_if @@ -961,43 +965,43 @@ @ppd_if -156097 +154267 @ppd_ifdef -61087 +60371 @ppd_ifndef -83329 +82352 @ppd_elif -20629 +20387 @ppd_else -57665 +56990 @ppd_endif -300514 +296991 @ppd_plain_include -290764 +287356 @ppd_define -318073 +314344 @ppd_undef -19247 +19021 @ppd_line -12477 +12495 @ppd_error @@ -1005,7 +1009,7 @@ @ppd_pragma -36565 +36507 @ppd_objc_import @@ -1013,7 +1017,7 @@ @ppd_include_next -87 +86 @ppd_warning @@ -1021,7 +1025,7 @@ @link_target -581 +574 @xmldtd @@ -1050,11 +1054,11 @@ compilations -9552 +9440 id -9552 +9440 cwd @@ -1072,7 +1076,7 @@ 1 2 -9552 +9440 @@ -1098,11 +1102,11 @@ compilation_args -375669 +376128 id -4318 +4323 num @@ -1110,7 +1114,7 @@ arg -18602 +18625 @@ -1124,7 +1128,7 @@ 13 77 -323 +324 85 @@ -1134,7 +1138,7 @@ 89 90 -3198 +3202 90 @@ -1144,12 +1148,12 @@ 92 96 -266 +267 99 101 -297 +298 @@ -1165,7 +1169,7 @@ 13 77 -323 +324 82 @@ -1175,12 +1179,12 @@ 88 89 -3200 +3204 89 90 -157 +158 90 @@ -1358,12 +1362,12 @@ 1 2 -17701 +17722 2 2654 -901 +902 @@ -1379,12 +1383,12 @@ 1 2 -18264 +18286 2 55 -338 +339 @@ -1394,11 +1398,11 @@ compilation_compiling_files -9552 +9440 id -9552 +9440 num @@ -1406,7 +1410,7 @@ file -4847 +4790 @@ -1420,7 +1424,7 @@ 1 2 -9552 +9440 @@ -1436,7 +1440,7 @@ 1 2 -9552 +9440 @@ -1484,12 +1488,12 @@ 1 2 -274 +270 2 3 -4551 +4498 3 @@ -1510,7 +1514,7 @@ 1 2 -4847 +4790 @@ -1520,11 +1524,11 @@ compilation_time -38122 +37675 id -9530 +9418 num @@ -1536,7 +1540,7 @@ seconds -12700 +11868 @@ -1550,7 +1554,7 @@ 1 2 -9530 +9418 @@ -1566,7 +1570,7 @@ 4 5 -9530 +9418 @@ -1580,19 +1584,14 @@ 12 -2 -3 -21 - - 3 4 -2599 +2850 4 5 -6909 +6568 @@ -1638,8 +1637,8 @@ 12 -1158 -1159 +1095 +1096 10 @@ -1691,18 +1690,18 @@ 10 -13 -14 +12 +13 10 -590 -591 +579 +580 10 -694 -695 +647 +648 10 @@ -1719,22 +1718,22 @@ 1 2 -8653 +8053 2 3 -2588 +2254 3 5 -1074 +997 5 -629 -383 +632 +563 @@ -1750,7 +1749,7 @@ 1 2 -12700 +11868 @@ -1766,17 +1765,17 @@ 1 2 -11131 +10253 2 3 -1535 +1604 3 4 -32 +10 @@ -1786,15 +1785,15 @@ diagnostic_for -847112 +837183 diagnostic -68699 +67893 compilation -9223 +9115 file_number @@ -1802,7 +1801,7 @@ file_number_diagnostic_number -6503 +6427 @@ -1816,17 +1815,17 @@ 1 2 -9256 +9147 2 3 -56744 +56079 254 840 -2697 +2666 @@ -1842,7 +1841,7 @@ 1 2 -68699 +67893 @@ -1858,7 +1857,7 @@ 1 2 -68699 +67893 @@ -1879,27 +1878,27 @@ 7 8 -5812 +5744 8 9 -603 +596 247 248 -1864 +1842 263 444 -723 +715 446 594 -197 +195 @@ -1915,7 +1914,7 @@ 1 2 -9223 +9115 @@ -1936,27 +1935,27 @@ 7 8 -5812 +5744 8 9 -603 +596 247 248 -1864 +1842 263 444 -723 +715 446 594 -197 +195 @@ -2020,22 +2019,22 @@ 1 2 -2676 +2644 2 5 -581 +574 5 6 -954 +942 7 14 -515 +509 15 @@ -2045,22 +2044,22 @@ 17 18 -570 +563 18 23 -438 +433 26 40 -526 +520 42 842 -186 +184 @@ -2076,17 +2075,17 @@ 4 9 -559 +552 10 11 -954 +942 14 27 -515 +509 30 @@ -2096,32 +2095,32 @@ 34 35 -570 +563 36 45 -438 +433 52 79 -526 +520 84 85 -175 +173 254 255 -2621 +2590 309 842 -87 +86 @@ -2137,7 +2136,7 @@ 1 2 -6503 +6427 @@ -2147,19 +2146,19 @@ compilation_finished -9552 +9440 id -9552 +9440 cpu_seconds -8093 +7619 elapsed_seconds -219 +195 @@ -2173,7 +2172,7 @@ 1 2 -9552 +9440 @@ -2189,7 +2188,7 @@ 1 2 -9552 +9440 @@ -2205,17 +2204,17 @@ 1 2 -6931 +6449 2 3 -954 +856 3 -7 -208 +11 +314 @@ -2231,12 +2230,12 @@ 1 2 -7764 +7045 2 3 -329 +574 @@ -2255,18 +2254,13 @@ 54 -2 -3 -21 - - 3 4 -10 +21 -5 -6 +6 +7 10 @@ -2275,13 +2269,8 @@ 10 -9 -10 -10 - - -11 -12 +8 +9 10 @@ -2290,38 +2279,38 @@ 10 -41 -42 +26 +27 10 -46 -47 +34 +35 10 -47 -48 +124 +125 10 -86 -87 +125 +126 10 -157 -158 +140 +141 10 -183 -184 +174 +175 10 -250 -251 +199 +200 10 @@ -2341,18 +2330,13 @@ 54 -2 -3 -21 - - 3 4 -10 +21 -5 -6 +6 +7 10 @@ -2361,13 +2345,8 @@ 10 -9 -10 -10 - - -11 -12 +8 +9 10 @@ -2376,38 +2355,38 @@ 10 -40 -41 +26 +27 10 -44 -45 +34 +35 10 -46 -47 +95 +96 10 -73 -74 +106 +107 10 -150 -151 +118 +119 10 -164 -165 +148 +149 10 -190 -191 +180 +181 10 @@ -2418,7 +2397,7 @@ externalData -131 +130 id @@ -2434,7 +2413,7 @@ value -131 +130 @@ -2592,7 +2571,7 @@ 1 2 -131 +130 @@ -2608,7 +2587,7 @@ 1 2 -131 +130 @@ -2624,7 +2603,7 @@ 1 2 -131 +130 @@ -2656,19 +2635,19 @@ duplicateCode -185064 +185333 id -185064 +185333 relativePath -761 +762 equivClass -76489 +76600 @@ -2682,7 +2661,7 @@ 1 2 -185064 +185333 @@ -2698,7 +2677,7 @@ 1 2 -185064 +185333 @@ -2759,7 +2738,7 @@ 59 19902 -42 +43 @@ -2780,7 +2759,7 @@ 2 3 -128 +129 3 @@ -2826,32 +2805,32 @@ 1 2 -20437 +20466 2 3 -32595 +32642 3 4 -10691 +10706 4 5 -6008 +6017 5 9 -5947 +5955 9 11 -810 +811 @@ -2867,12 +2846,12 @@ 1 2 -75636 +75746 2 7 -853 +854 @@ -3178,31 +3157,31 @@ tokens -39551564 +39609146 id -278633 +279039 offset -21143 +21173 beginLine -784457 +785599 beginColumn -1301 +1303 endLine -784457 +785599 endColumn -1313 +1315 @@ -3216,72 +3195,72 @@ 100 101 -8561 +8573 101 102 -27556 +27596 102 105 -22609 +22642 105 108 -24457 +24492 108 111 -13735 +13755 111 114 -23782 +23816 114 116 -22622 +22655 116 124 -23628 +23663 124 132 -21615 +21647 132 154 -21357 +21388 154 186 -21265 +21296 186 202 -23389 +23423 202 416 -20909 +20940 416 3446 -3142 +3146 @@ -3297,52 +3276,52 @@ 4 5 -1399 +1401 5 6 -109618 +109777 6 7 -15380 +15402 7 8 -28360 +28401 8 12 -23597 +23632 12 17 -22738 +22771 17 19 -18872 +18899 19 22 -22763 +22796 22 28 -21376 +21407 28 151 -14526 +14548 @@ -3358,42 +3337,42 @@ 2 26 -22867 +22900 26 31 -22290 +22323 31 32 -2639 +2642 32 33 -163368 +163606 33 51 -21167 +21198 51 61 -22407 +22439 61 80 -21032 +21063 80 132 -2859 +2864 @@ -3409,52 +3388,52 @@ 4 5 -1399 +1401 5 6 -109618 +109777 6 7 -15380 +15402 7 8 -28360 +28401 8 12 -23597 +23632 12 17 -22738 +22771 17 19 -18872 +18899 19 22 -22763 +22796 22 28 -21376 +21407 28 151 -14526 +14548 @@ -3470,42 +3449,42 @@ 2 26 -21603 +21634 26 31 -24322 +24357 31 32 -1620 +1622 32 33 -163657 +163895 33 54 -21959 +21991 54 64 -22609 +22642 64 86 -21124 +21155 86 133 -1736 +1739 @@ -3521,57 +3500,57 @@ 2 3 -4553 +4560 4 5 -1337 +1339 6 7 -2589 +2593 8 9 -822 +823 11 12 -1607 +1610 13 23 -1853 +1856 24 62 -1620 +1622 64 130 -1644 +1647 141 250 -1595 +1598 251 982 -1589 +1591 986 45401 -1927 +1929 @@ -3587,62 +3566,62 @@ 2 3 -4553 +4560 4 5 -1337 +1339 6 7 -2589 +2593 8 9 -822 +823 11 12 -1607 +1610 13 23 -1853 +1856 24 62 -1620 +1622 64 130 -1644 +1647 141 246 -1595 +1598 247 964 -1589 +1591 969 32533 -1589 +1591 32544 33826 -337 +338 @@ -3658,52 +3637,52 @@ 1 2 -5891 +5900 2 3 -3412 +3417 3 4 -1607 +1610 4 7 -1884 +1886 7 12 -1835 +1837 12 15 -1632 +1634 15 23 -1595 +1598 23 68 -1607 +1610 68 161 -1589 +1591 161 171 -85 +86 @@ -3719,62 +3698,62 @@ 2 3 -4553 +4560 4 5 -1337 +1339 6 7 -2589 +2593 8 9 -822 +823 11 12 -1607 +1610 13 23 -1853 +1856 24 62 -1620 +1622 64 130 -1644 +1647 141 246 -1595 +1598 247 964 -1589 +1591 969 32533 -1589 +1591 32544 33826 -337 +338 @@ -3790,47 +3769,47 @@ 1 2 -5891 +5900 2 3 -3412 +3417 3 4 -1607 +1610 4 7 -1908 +1911 7 12 -1822 +1825 12 15 -1607 +1610 15 24 -1657 +1659 24 73 -1607 +1610 73 167 -1595 +1598 167 @@ -3851,37 +3830,37 @@ 1 2 -403447 +404035 2 3 -103002 +103152 3 4 -44213 +44277 4 6 -70443 +70546 6 8 -58378 +58462 8 13 -65883 +65979 13 138 -39088 +39145 @@ -3897,52 +3876,52 @@ 1 7 -64730 +64824 7 12 -64232 +64326 12 23 -60053 +60140 23 32 -36633 +36686 32 33 -266935 +267324 33 41 -62612 +62703 41 55 -61280 +61370 55 69 -61477 +61566 69 94 -59096 +59182 94 248 -47404 +47473 @@ -3958,47 +3937,47 @@ 1 5 -64325 +64418 5 9 -62575 +62667 9 15 -62956 +63048 15 29 -59777 +59864 29 32 -9212 +9225 32 33 -348862 +349370 33 37 -61747 +61837 37 42 -61458 +61548 42 122 -53541 +53619 @@ -4014,7 +3993,7 @@ 1 2 -784457 +785599 @@ -4030,47 +4009,47 @@ 1 5 -64202 +64295 5 9 -62557 +62648 9 15 -63085 +63177 15 29 -59679 +59765 29 32 -9212 +9225 32 33 -349862 +350372 33 37 -63447 +63539 37 43 -65221 +65316 43 123 -47189 +47258 @@ -4486,37 +4465,37 @@ 1 2 -403447 +404035 2 3 -103002 +103152 3 4 -44213 +44277 4 6 -70443 +70546 6 8 -58378 +58462 8 13 -65883 +65979 13 138 -39088 +39145 @@ -4532,52 +4511,52 @@ 1 7 -64730 +64824 7 12 -64232 +64326 12 23 -60053 +60140 23 32 -36633 +36686 32 33 -266935 +267324 33 41 -62612 +62703 41 55 -61280 +61370 55 69 -61477 +61566 69 94 -59096 +59182 94 248 -47404 +47473 @@ -4593,7 +4572,7 @@ 1 2 -784457 +785599 @@ -4609,47 +4588,47 @@ 1 5 -64325 +64418 5 9 -62575 +62667 9 15 -62956 +63048 15 29 -59777 +59864 29 32 -9212 +9225 32 33 -348862 +349370 33 37 -61747 +61837 37 42 -61458 +61548 42 122 -53541 +53619 @@ -4665,47 +4644,47 @@ 1 5 -64202 +64295 5 9 -62557 +62648 9 15 -63085 +63177 15 29 -59679 +59765 29 32 -9212 +9225 32 33 -349862 +350372 33 37 -63447 +63539 37 43 -65221 +65316 43 123 -47189 +47258 @@ -5095,11 +5074,11 @@ external_packages -120 +119 id -120 +119 namespace @@ -5107,11 +5086,11 @@ package_name -120 +119 version -120 +119 @@ -5125,7 +5104,7 @@ 1 2 -120 +119 @@ -5141,7 +5120,7 @@ 1 2 -120 +119 @@ -5157,7 +5136,7 @@ 1 2 -120 +119 @@ -5221,7 +5200,7 @@ 1 2 -120 +119 @@ -5237,7 +5216,7 @@ 1 2 -120 +119 @@ -5253,7 +5232,7 @@ 1 2 -120 +119 @@ -5269,7 +5248,7 @@ 1 2 -120 +119 @@ -5285,7 +5264,7 @@ 1 2 -120 +119 @@ -5301,7 +5280,7 @@ 1 2 -120 +119 @@ -5311,15 +5290,15 @@ header_to_external_package -8532 +8432 fileid -8532 +8432 package -120 +119 @@ -5333,7 +5312,7 @@ 1 2 -8532 +8432 @@ -6602,31 +6581,31 @@ locations_default -8813832 +8719593 id -8813832 +8719593 container -70969 +70137 startLine -150635 +148869 startColumn -5461 +5397 endLine -150460 +148696 endColumn -10627 +10502 @@ -6640,7 +6619,7 @@ 1 2 -8813832 +8719593 @@ -6656,7 +6635,7 @@ 1 2 -8813832 +8719593 @@ -6672,7 +6651,7 @@ 1 2 -8813832 +8719593 @@ -6688,7 +6667,7 @@ 1 2 -8813832 +8719593 @@ -6704,7 +6683,7 @@ 1 2 -8813832 +8719593 @@ -6720,62 +6699,62 @@ 1 2 -11526 +11391 2 19 -6097 +6026 19 25 -5483 +5419 25 31 -5516 +5451 31 41 -5823 +5755 41 54 -5527 +5462 54 72 -5604 +5538 72 99 -5417 +5354 99 137 -5384 +5321 137 220 -5330 +5267 220 430 -5330 +5267 430 20913 -3926 +3880 @@ -6791,62 +6770,62 @@ 1 2 -11526 +11391 2 15 -6010 +5939 15 20 -6141 +6069 20 25 -5549 +5484 25 32 -6097 +6026 32 41 -5681 +5614 41 53 -5724 +5657 53 71 -5593 +5527 71 99 -5450 +5386 99 158 -5330 +5267 158 351 -5363 +5300 351 9356 -2500 +2471 @@ -6862,62 +6841,62 @@ 1 2 -11526 +11391 2 4 -6010 +5939 4 8 -6547 +6470 8 11 -5395 +5332 11 14 -5779 +5712 14 18 -6251 +6178 18 23 -5757 +5690 23 29 -5834 +5766 29 37 -5692 +5625 37 50 -5670 +5603 50 78 -5384 +5321 78 168 -1118 +1105 @@ -6933,62 +6912,62 @@ 1 2 -11526 +11391 2 15 -5988 +5917 15 20 -6163 +6091 20 25 -5494 +5430 25 32 -6108 +6037 32 41 -5670 +5603 41 53 -5724 +5657 53 70 -5384 +5321 70 96 -5341 +5278 96 153 -5395 +5332 153 333 -5352 +5289 333 9356 -2818 +2785 @@ -7004,62 +6983,62 @@ 1 2 -11526 +11391 2 14 -5735 +5668 14 19 -6119 +6048 19 23 -5713 +5646 23 28 -6415 +6340 28 33 -5516 +5451 33 40 -5955 +5885 40 47 -5352 +5289 47 57 -5604 +5538 57 69 -5637 +5571 69 91 -5330 +5267 91 336 -2061 +2037 @@ -7075,52 +7054,52 @@ 1 2 -30850 +30489 2 3 -18030 +17818 3 4 -17953 +17742 4 5 -9717 +9603 5 7 -13709 +13548 7 9 -13412 +13255 9 13 -13204 +13049 13 32 -11570 +11434 32 -127 -11307 +128 +11185 -127 +128 6472 -10879 +10741 @@ -7136,42 +7115,42 @@ 1 2 -55658 +55006 2 3 -33439 +33047 3 4 -9903 +9787 4 5 -8433 +8334 5 8 -12908 +12757 8 27 -11493 +11358 27 123 -11340 +11207 123 6472 -7457 +7370 @@ -7187,52 +7166,52 @@ 1 2 -31958 +31584 2 3 -17865 +17656 3 4 -19795 +19563 4 5 -9585 +9473 5 7 -13917 +13754 7 9 -13829 +13667 9 13 -12711 +12562 13 27 -11482 +11348 27 62 -11351 +11218 62 153 -8137 +8042 @@ -7248,22 +7227,22 @@ 1 2 -112973 +111649 2 3 -17416 +17211 3 7 -12535 +12388 7 184 -7709 +7619 @@ -7279,52 +7258,52 @@ 1 2 -31805 +31432 2 3 -17777 +17569 3 4 -18644 +18425 4 5 -9870 +9754 5 7 -13731 +13570 7 9 -13774 +13613 9 13 -12733 +12583 13 29 -11658 +11521 29 74 -11351 +11185 74 258 -9289 +9212 @@ -7340,52 +7319,52 @@ 1 2 -877 +867 2 3 -1008 +997 3 5 -504 +498 5 8 -482 +476 8 16 -438 +433 16 37 -416 +411 37 119 -416 +411 124 512 -416 +411 522 5004 -416 +411 5044 -19249 -416 +19250 +411 19714 @@ -7406,47 +7385,47 @@ 1 2 -2346 +2319 2 3 -493 +487 3 6 -427 +422 6 15 -438 +433 15 55 -416 +411 59 228 -416 +411 231 1213 -416 +411 1274 2356 -416 +411 2555 6472 -87 +86 @@ -7462,57 +7441,57 @@ 1 2 -910 +899 2 3 -998 +986 3 4 -263 +260 4 6 -471 +466 6 10 -427 +422 10 20 -416 +411 20 55 -416 +411 56 194 -416 +411 196 844 -416 +411 863 1976 -416 +411 1976 6604 -307 +303 @@ -7528,57 +7507,57 @@ 1 2 -910 +899 2 3 -998 +986 3 4 -263 +260 4 6 -471 +466 6 10 -427 +422 10 20 -416 +411 20 55 -416 +411 56 194 -416 +411 206 843 -416 +411 863 1977 -416 +411 1980 6583 -307 +303 @@ -7594,42 +7573,42 @@ 1 2 -2478 +2449 2 3 -493 +487 3 7 -493 +487 7 13 -427 +422 13 28 -416 +411 28 49 -427 +422 50 103 -416 +411 105 428 -307 +303 @@ -7645,52 +7624,52 @@ 1 2 -30565 +30207 2 3 -18063 +17851 3 4 -17810 +17602 4 5 -9870 +9754 5 7 -13774 +13613 7 9 -13456 +13299 9 13 -13051 +12898 13 31 -11460 +11326 31 -124 -11296 +125 +11207 -124 +125 6472 -11109 +10936 @@ -7706,42 +7685,42 @@ 1 2 -55373 +54724 2 3 -33340 +32949 3 4 -9870 +9754 4 5 -8543 +8443 5 8 -13105 +12952 8 27 -11329 +11196 27 121 -11296 +11163 121 6472 -7600 +7511 @@ -7757,22 +7736,22 @@ 1 2 -112184 +110869 2 3 -17251 +17049 3 7 -12074 +11933 7 46 -8949 +8844 @@ -7788,57 +7767,57 @@ 1 2 -31651 +31280 2 3 -17942 +17732 3 4 -19741 +19509 4 5 -9607 +9494 5 6 -7863 +7771 6 7 -6130 +6058 7 9 -13840 +13678 9 13 -12711 +12562 13 27 -11493 +11358 27 62 -11351 +11218 62 153 -8126 +8031 @@ -7854,52 +7833,52 @@ 1 2 -31552 +31183 2 3 -17745 +17537 3 4 -18633 +18414 4 5 -9936 +9819 5 7 -13818 +13656 7 9 -13774 +13613 9 13 -12787 +12637 13 29 -11515 +11380 29 74 -11362 +11196 74 258 -9333 +9256 @@ -7915,47 +7894,47 @@ 1 2 -4211 +4151 2 3 -1184 +1159 3 4 -767 +758 4 5 -647 +639 5 9 -877 +867 9 36 -811 +791 36 -282 -800 +256 +791 -298 -7593 -800 +257 +7244 +791 -7763 +7397 25755 -526 +552 @@ -7971,17 +7950,17 @@ 1 2 -4836 +4769 2 3 -1283 +1257 3 4 -954 +953 4 @@ -7991,22 +7970,22 @@ 7 31 -800 +791 32 356 -800 +791 377 2696 -800 +791 2701 6472 -252 +249 @@ -8022,47 +8001,47 @@ 1 2 -4244 +4183 2 3 -1173 +1148 3 4 -800 +791 4 5 -636 +628 5 9 -855 +845 9 34 -811 +791 34 221 -800 +791 233 -1947 -800 +1884 +791 -1953 +1885 4894 -504 +531 @@ -8078,42 +8057,42 @@ 1 2 -4869 +4801 2 3 -1327 +1311 3 4 -943 +942 4 7 -910 +899 7 22 -811 +802 22 45 -800 +791 45 81 -822 +812 81 84 -142 +140 @@ -8129,47 +8108,47 @@ 1 2 -4244 +4183 2 3 -1173 +1148 3 4 -811 +802 4 5 -636 +628 5 9 -855 +845 9 -32 -800 +33 +802 -32 -221 -800 +34 +234 +791 -233 -1952 -800 +240 +1928 +791 -1962 +1951 4895 -504 +509 @@ -8179,31 +8158,31 @@ locations_stmt -2176409 +2179578 id -2176409 +2179578 container -3172 +3177 startLine -296351 +296783 startColumn -1227 +1229 endLine -294553 +294982 endColumn -1491 +1493 @@ -8217,7 +8196,7 @@ 1 2 -2176409 +2179578 @@ -8233,7 +8212,7 @@ 1 2 -2176409 +2179578 @@ -8249,7 +8228,7 @@ 1 2 -2176409 +2179578 @@ -8265,7 +8244,7 @@ 1 2 -2176409 +2179578 @@ -8281,7 +8260,7 @@ 1 2 -2176409 +2179578 @@ -8302,7 +8281,7 @@ 7 17 -257 +258 17 @@ -8459,7 +8438,7 @@ 2 3 -570 +571 3 @@ -8479,7 +8458,7 @@ 14 20 -263 +264 20 @@ -8499,7 +8478,7 @@ 51 63 -263 +264 63 @@ -8540,7 +8519,7 @@ 13 24 -263 +264 24 @@ -8590,7 +8569,7 @@ 1423 38575 -220 +221 @@ -8611,7 +8590,7 @@ 4 7 -257 +258 7 @@ -8636,12 +8615,12 @@ 40 49 -263 +264 49 60 -257 +258 60 @@ -8666,7 +8645,7 @@ 120 172 -128 +129 @@ -8682,37 +8661,37 @@ 1 2 -113656 +113822 2 3 -78643 +78757 3 4 -31281 +31327 4 6 -25169 +25205 6 16 -22505 +22538 16 128 -22315 +22347 128 222 -2780 +2784 @@ -8728,32 +8707,32 @@ 1 2 -175336 +175591 2 3 -51976 +52052 3 5 -22708 +22741 5 13 -22382 +22415 13 125 -22266 +22298 125 176 -1681 +1684 @@ -8769,32 +8748,32 @@ 1 2 -130650 +130841 2 3 -73101 +73207 3 4 -31159 +31204 4 7 -26807 +26846 7 17 -23051 +23085 17 45 -11581 +11597 @@ -8810,27 +8789,27 @@ 1 2 -191440 +191719 2 3 -47699 +47768 3 4 -21695 +21726 4 9 -23168 +23202 9 30 -12348 +12366 @@ -8846,32 +8825,32 @@ 1 2 -155826 +156052 2 3 -62539 +62630 3 4 -21063 +21093 4 9 -24671 +24707 9 31 -22431 +22464 31 73 -9819 +9833 @@ -8968,7 +8947,7 @@ 2 3 -85 +86 3 @@ -9169,7 +9148,7 @@ 2086 -15271 +15270 98 @@ -9201,7 +9180,7 @@ 3 4 -85 +86 4 @@ -9251,7 +9230,7 @@ 131 203 -42 +43 @@ -9267,37 +9246,37 @@ 1 2 -116001 +116170 2 3 -72831 +72937 3 4 -31901 +31948 4 6 -25672 +25709 6 16 -23106 +23140 16 126 -22106 +22138 126 229 -2933 +2937 @@ -9313,27 +9292,27 @@ 1 2 -175048 +175302 2 3 -52173 +52249 3 5 -22174 +22206 5 14 -23487 +23521 14 172 -21670 +21702 @@ -9349,27 +9328,27 @@ 1 2 -193723 +194005 2 3 -42881 +42943 3 4 -20909 +20940 4 8 -22425 +22458 8 32 -14612 +14634 @@ -9385,32 +9364,32 @@ 1 2 -132811 +133004 2 3 -67970 +68069 3 4 -32441 +32489 4 7 -26684 +26723 7 16 -22131 +22163 16 46 -12513 +12532 @@ -9426,32 +9405,32 @@ 1 2 -155721 +155948 2 3 -62404 +62494 3 4 -21370 +21401 4 9 -23855 +23890 9 34 -22382 +22415 34 73 -8819 +8832 @@ -9543,12 +9522,12 @@ 1 2 -214 +215 2 3 -85 +86 3 @@ -9558,7 +9537,7 @@ 6 12 -128 +129 13 @@ -9700,7 +9679,7 @@ 3 4 -85 +86 4 @@ -9710,7 +9689,7 @@ 6 10 -128 +129 10 @@ -9735,7 +9714,7 @@ 31 38 -128 +129 38 @@ -9831,11 +9810,11 @@ locations_expr -9755082 +9756708 id -9755082 +9756708 container @@ -9869,7 +9848,7 @@ 1 2 -9755082 +9756708 @@ -9885,7 +9864,7 @@ 1 2 -9755082 +9756708 @@ -9901,7 +9880,7 @@ 1 2 -9755082 +9756708 @@ -9917,7 +9896,7 @@ 1 2 -9755082 +9756708 @@ -9933,7 +9912,7 @@ 1 2 -9755082 +9756708 @@ -9959,7 +9938,7 @@ 10 34 -270 +269 34 @@ -9969,7 +9948,7 @@ 108 205 -269 +270 205 @@ -9988,12 +9967,12 @@ 746 -1179 +1181 269 -1180 -1848 +1181 +1853 269 @@ -10273,52 +10252,52 @@ 19 43 -285 +284 43 -60 -270 +61 +287 -60 -73 -286 +61 +74 +294 -73 -84 +74 +85 279 -84 -95 -290 +85 +96 +286 -95 -106 -284 +96 +107 +280 -106 -120 +107 +121 280 -120 -138 -278 +121 +139 +274 -138 -166 -270 +139 +167 +271 -166 +167 416 -190 +177 @@ -10379,12 +10358,12 @@ 25 97 -14718 +14716 97 4266 -14507 +14509 @@ -10598,12 +10577,12 @@ 21 61 -14732 +14731 61 184 -14140 +14141 @@ -10667,23 +10646,23 @@ 29 -16137 -46382 +16143 +46384 29 -48761 -86976 +48765 +86984 29 -87194 -224341 +87199 +224328 29 -237386 -712099 +237383 +712891 6 @@ -11044,12 +11023,12 @@ 19 34 -14924 +14922 34 233 -14681 +14683 233 @@ -11258,12 +11237,12 @@ 11 16 -15573 +15572 16 27 -14834 +14835 27 @@ -11328,27 +11307,27 @@ 1667 -5253 +5254 35 -5322 -18552 +5327 +18561 35 -20345 -51675 +20354 +51707 35 -54821 -117773 +54831 +117890 35 -117975 -185967 +117994 +185975 35 @@ -11399,22 +11378,22 @@ 602 -1190 +1192 35 -1207 +1208 1967 35 -1968 +1970 2479 35 2482 -2649 +2650 32 @@ -11470,22 +11449,22 @@ 2070 -5993 +5994 35 -6048 +6052 12974 35 -13161 -20940 +13162 +20941 35 20996 -28029 +28030 35 @@ -11617,22 +11596,22 @@ 2067 -5994 +5995 35 -6037 +6041 12938 35 -13153 -20903 +13154 +20904 35 21020 -28040 +28041 35 @@ -11648,23 +11627,23 @@ numlines -499263 +493411 element_id -492299 +486528 num_lines -9344 +9234 num_code -7293 +7207 num_comment -3937 +3891 @@ -11678,12 +11657,12 @@ 1 2 -485411 +479722 2 7 -6887 +6806 @@ -11699,12 +11678,12 @@ 1 2 -485466 +479776 2 7 -6832 +6752 @@ -11720,12 +11699,12 @@ 1 2 -492222 +486452 2 3 -76 +75 @@ -11741,42 +11720,42 @@ 1 2 -4255 +4205 2 3 -1250 +1235 3 4 -701 +693 4 6 -734 +726 6 12 -701 +693 12 24 -712 +704 24 121 -701 +693 121 7771 -285 +281 @@ -11792,37 +11771,37 @@ 1 2 -4321 +4270 2 3 -1261 +1246 3 4 -712 +704 4 6 -756 +747 6 11 -811 +802 11 18 -734 +726 18 30 -712 +704 30 @@ -11843,37 +11822,37 @@ 1 2 -4310 +4259 2 3 -1261 +1246 3 4 -723 +715 4 6 -767 +758 6 11 -844 +834 11 17 -723 +715 17 27 -712 +704 @@ -11889,42 +11868,42 @@ 1 2 -3180 +3143 2 3 -855 +845 3 4 -625 +617 4 6 -559 +552 6 10 -603 +596 10 22 -592 +585 22 101 -548 +541 101 7978 -329 +325 @@ -11940,42 +11919,42 @@ 1 2 -3202 +3164 2 3 -888 +877 3 4 -636 +628 4 6 -559 +552 6 10 -636 +628 10 21 -614 +606 21 35 -548 +541 35 42 -208 +205 @@ -11991,42 +11970,42 @@ 1 2 -3191 +3154 2 3 -910 +899 3 4 -636 +628 4 6 -537 +531 6 9 -559 +552 9 17 -559 +552 17 27 -581 +574 27 34 -318 +314 @@ -12042,42 +12021,42 @@ 1 2 -1886 +1864 2 3 -405 +401 3 4 -296 +292 4 7 -329 +325 7 13 -329 +325 14 38 -296 +292 39 280 -296 +292 286 36252 -98 +97 @@ -12093,42 +12072,42 @@ 1 2 -1897 +1875 2 3 -416 +411 3 4 -263 +260 4 7 -339 +336 7 13 -329 +325 13 35 -296 +292 35 90 -296 +292 91 119 -98 +97 @@ -12144,42 +12123,42 @@ 1 2 -1897 +1875 2 3 -416 +411 3 4 -274 +270 4 7 -329 +325 7 12 -307 +303 12 33 -296 +292 33 82 -296 +292 82 108 -120 +119 @@ -12189,11 +12168,11 @@ diagnostics -68699 +67893 id -68699 +67893 severity @@ -12201,19 +12180,19 @@ error_tag -76 +75 error_message -98 +97 full_error_message -59486 +58789 location -120 +119 @@ -12227,7 +12206,7 @@ 1 2 -68699 +67893 @@ -12243,7 +12222,7 @@ 1 2 -68699 +67893 @@ -12259,7 +12238,7 @@ 1 2 -68699 +67893 @@ -12275,7 +12254,7 @@ 1 2 -68699 +67893 @@ -12291,7 +12270,7 @@ 1 2 -68699 +67893 @@ -12453,7 +12432,7 @@ 1 2 -76 +75 @@ -12603,7 +12582,7 @@ 1 2 -98 +97 @@ -12619,7 +12598,7 @@ 1 2 -98 +97 @@ -12707,7 +12686,7 @@ 1 2 -59475 +58778 841 @@ -12728,7 +12707,7 @@ 1 2 -59486 +58789 @@ -12744,7 +12723,7 @@ 1 2 -59486 +58789 @@ -12760,7 +12739,7 @@ 1 2 -59486 +58789 @@ -12776,7 +12755,7 @@ 1 2 -59486 +58789 @@ -12792,7 +12771,7 @@ 1 2 -109 +108 6254 @@ -12813,7 +12792,7 @@ 1 2 -120 +119 @@ -12829,7 +12808,7 @@ 1 2 -109 +108 3 @@ -12850,7 +12829,7 @@ 1 2 -109 +108 5 @@ -12871,7 +12850,7 @@ 1 2 -109 +108 5414 @@ -12886,23 +12865,23 @@ files -60023 +59320 id -60023 +59320 name -60023 +59320 simple -41061 +40580 ext -98 +97 fromSource @@ -12920,7 +12899,7 @@ 1 2 -60023 +59320 @@ -12936,7 +12915,7 @@ 1 2 -60023 +59320 @@ -12952,7 +12931,7 @@ 1 2 -60023 +59320 @@ -12968,7 +12947,7 @@ 1 2 -60023 +59320 @@ -12984,7 +12963,7 @@ 1 2 -60023 +59320 @@ -13000,7 +12979,7 @@ 1 2 -60023 +59320 @@ -13016,7 +12995,7 @@ 1 2 -60023 +59320 @@ -13032,7 +13011,7 @@ 1 2 -60023 +59320 @@ -13048,22 +13027,22 @@ 1 2 -31179 +30814 2 3 -6196 +6123 3 7 -3235 +3197 7 42 -449 +444 @@ -13079,22 +13058,22 @@ 1 2 -31179 +30814 2 3 -6196 +6123 3 7 -3235 +3197 7 42 -449 +444 @@ -13110,17 +13089,17 @@ 1 2 -36707 +36277 2 3 -3783 +3739 3 6 -570 +563 @@ -13136,7 +13115,7 @@ 1 2 -41061 +40580 @@ -13320,7 +13299,7 @@ 1 2 -98 +97 @@ -13394,19 +13373,19 @@ folders -10945 +10817 id -10945 +10817 name -10945 +10817 simple -3136 +3099 @@ -13420,7 +13399,7 @@ 1 2 -10945 +10817 @@ -13436,7 +13415,7 @@ 1 2 -10945 +10817 @@ -13452,7 +13431,7 @@ 1 2 -10945 +10817 @@ -13468,7 +13447,7 @@ 1 2 -10945 +10817 @@ -13484,27 +13463,27 @@ 1 2 -1688 +1669 2 3 -669 +661 3 4 -438 +433 4 17 -241 +238 27 121 -98 +97 @@ -13520,27 +13499,27 @@ 1 2 -1688 +1669 2 3 -669 +661 3 4 -438 +433 4 17 -241 +238 27 121 -98 +97 @@ -13550,15 +13529,15 @@ containerparent -70947 +70115 parent -10945 +10817 child -70947 +70115 @@ -13572,42 +13551,42 @@ 1 2 -4990 +4931 2 3 -1403 +1387 3 4 -614 +606 4 6 -1008 +997 6 10 -811 +802 10 14 -866 +856 14 30 -833 +823 30 153 -416 +411 @@ -13623,7 +13602,7 @@ 1 2 -70947 +70115 @@ -13633,11 +13612,11 @@ fileannotations -5150695 +5090321 id -4825 +4769 kind @@ -13645,11 +13624,11 @@ name -54628 +53987 value -44647 +44124 @@ -13663,12 +13642,12 @@ 1 2 -131 +130 2 3 -4693 +4638 @@ -13684,62 +13663,62 @@ 1 100 -361 +357 111 222 -361 +357 224 290 -361 +357 295 448 -361 +357 448 527 -361 +357 533 623 -394 +390 623 713 -361 +357 726 901 -361 +357 901 931 -76 +75 933 934 -1381 +1365 1080 1671 -361 +357 1693 2286 -76 +75 @@ -13755,57 +13734,57 @@ 1 112 -361 +357 117 272 -361 +357 272 360 -361 +357 379 633 -361 +357 634 737 -361 +357 737 952 -361 +357 952 1069 -361 +357 1083 1498 -252 +249 1498 1499 -1381 +1365 1501 1871 -361 +357 1968 4072 -296 +292 @@ -13884,62 +13863,62 @@ 1 2 -8927 +8822 2 3 -6032 +5961 3 6 -4518 +4465 6 8 -4452 +4400 8 14 -4408 +4357 14 18 -3915 +3869 18 21 -4244 +4194 21 34 -4397 +4346 34 128 -4375 +4324 129 236 -4156 +4107 236 395 -4112 +4064 395 440 -1085 +1073 @@ -13955,7 +13934,7 @@ 1 2 -54628 +53987 @@ -13971,62 +13950,62 @@ 1 2 -9980 +9863 2 3 -8049 +7955 3 4 -2489 +2460 4 6 -3959 +3912 6 10 -4880 +4823 10 14 -3487 +3446 14 18 -4496 +4443 18 23 -4200 +4151 23 44 -4397 +4346 44 97 -4156 +4107 97 405 -4101 +4053 421 1907 -427 +422 @@ -14042,67 +14021,67 @@ 1 2 -6898 +6817 2 5 -2171 +2146 5 8 -3235 +3197 8 21 -3432 +3392 21 23 -2467 +2438 23 25 -4024 +3977 25 40 -3235 +3197 40 195 -3520 +3479 195 207 -3509 +3468 207 273 -3663 +3620 273 327 -3366 +3327 328 407 -3838 +3793 407 441 -1283 +1268 @@ -14118,7 +14097,7 @@ 1 2 -44636 +44113 2 @@ -14139,67 +14118,67 @@ 1 2 -6920 +6839 2 5 -2511 +2482 5 8 -3388 +3349 8 16 -3498 +3457 16 18 -3016 +2980 18 21 -3739 +3696 21 31 -3882 +3836 31 41 -3531 +3490 41 54 -3531 +3490 54 80 -3410 +3370 80 108 -3355 +3316 108 130 -3399 +3360 130 149 -460 +455 @@ -14209,15 +14188,15 @@ inmacroexpansion -60858600 +60947411 id -15688133 +15711684 inv -2531842 +2534941 @@ -14231,47 +14210,47 @@ 1 2 -3618145 +3622961 2 3 -2444404 +2447710 3 4 -1897963 +1901765 4 5 -1930660 +1934999 5 6 -1866522 +1869000 6 7 -968680 +969866 7 8 -1531664 +1533539 8 11 -1254546 +1256082 11 6193 -175544 +175759 @@ -14287,52 +14266,52 @@ 1 2 -616466 +617221 2 3 -369750 +370194 3 4 -160127 +158077 4 5 -256553 +257870 5 7 -183475 +184829 7 9 -150757 +150858 9 12 -221729 +222012 12 22 -202905 +203086 22 45 -191199 +191643 45 153127 -178878 +179147 @@ -14342,15 +14321,15 @@ affectedbymacroexpansion -35484578 +35536226 id -4079138 +4085077 inv -3279080 +3283853 @@ -14364,42 +14343,42 @@ 1 2 -1340484 +1342436 2 3 -718487 +719533 3 4 -682062 +683055 4 6 -320606 +321085 6 10 -313180 +313623 10 24 -307675 +308123 24 64 -309559 +310009 64 9803 -87082 +87208 @@ -14415,72 +14394,72 @@ 1 2 -252912 +253292 2 3 -209803 +210096 3 4 -202322 +202616 4 5 -257766 +258141 5 6 -301206 +301644 6 7 -247566 +247926 7 8 -230830 +231166 8 9 -227718 +228049 9 10 -182290 +182555 10 12 -285323 +285738 12 16 -297057 +297490 16 23 -275036 +275437 23 60 -248652 +249014 60 526 -60593 +60681 @@ -14490,19 +14469,19 @@ macroinvocations -35580051 +34675701 id -35580051 +34675701 macro_id -81234 +80282 location -761238 +752316 kind @@ -14520,7 +14499,7 @@ 1 2 -35580051 +34675701 @@ -14536,7 +14515,7 @@ 1 2 -35580051 +34675701 @@ -14552,7 +14531,7 @@ 1 2 -35580051 +34675701 @@ -14568,52 +14547,52 @@ 1 2 -17021 +17136 2 3 -16560 +16778 3 4 -3575 +3761 4 6 -7194 +7034 6 11 -6898 +7392 11 -19 -6174 +21 +6405 -19 -40 -6174 +21 +47 +6188 -40 -105 -6196 +47 +151 +6069 -105 -487 -6108 +151 +1013 +6026 -488 -196960 -5330 +1014 +196742 +3490 @@ -14629,37 +14608,37 @@ 1 2 -43222 +42715 2 3 -10747 +10621 3 4 -5341 +5278 4 6 -6975 +6893 6 13 -6722 +6644 13 66 -6108 +6037 66 3614 -2116 +2091 @@ -14675,12 +14654,12 @@ 1 2 -75092 +74212 2 3 -6141 +6069 @@ -14696,42 +14675,37 @@ 1 2 -284425 +285069 2 3 -177483 +194240 3 4 -43452 +45143 4 5 -58598 +55916 5 -8 -63577 - - -8 -17 -61164 +9 +68457 -17 -80 -57161 +9 +26 +60523 -80 -258137 -15376 +26 +257817 +42964 @@ -14747,12 +14721,12 @@ 1 2 -712533 +704181 2 354 -48705 +48134 @@ -14768,7 +14742,7 @@ 1 2 -761238 +752316 @@ -14782,13 +14756,13 @@ 12 -27686 -27687 +21794 +21795 10 -3216514 -3216515 +3177447 +3177448 10 @@ -14841,15 +14815,15 @@ macroparent -31703249 +31212468 id -31703249 +31212468 parent_id -24680109 +24288060 @@ -14863,7 +14837,7 @@ 1 2 -31703249 +31212468 @@ -14879,17 +14853,17 @@ 1 2 -18989648 +18677382 2 3 -4853131 +4783954 3 88 -837329 +826723 @@ -14899,15 +14873,15 @@ macrolocationbind -4013316 +4019158 id -2798431 +2802505 location -2003411 +2006328 @@ -14921,22 +14895,22 @@ 1 2 -2198258 +2201458 2 3 -338895 +339388 3 7 -231523 +231860 7 57 -29753 +29796 @@ -14952,22 +14926,22 @@ 1 2 -1601798 +1604130 2 3 -170837 +171086 3 8 -155316 +155542 8 723 -75458 +75567 @@ -14977,19 +14951,19 @@ macro_argument_unexpanded -92648459 +91317451 invocation -27419703 +26939874 argument_index -723 +715 text -312677 +309012 @@ -15003,22 +14977,22 @@ 1 2 -7656521 +7463526 2 3 -11466609 +11300240 3 4 -6261428 +6167062 4 67 -2035143 +2009044 @@ -15034,22 +15008,22 @@ 1 2 -7724474 +7530509 2 3 -11620513 +11447007 3 4 -6090010 +6003116 4 67 -1984704 +1959240 @@ -15063,18 +15037,18 @@ 12 -50787 -50788 -636 +50779 +50780 +628 -50989 -185566 +50981 +185359 54 -756484 -2500138 +754342 +2485521 32 @@ -15091,7 +15065,7 @@ 2 3 -636 +628 13 @@ -15117,57 +15091,57 @@ 1 2 -37902 +37588 2 3 -61164 +61759 3 4 -14092 +14252 4 5 -42136 +41761 5 8 -25290 +25416 8 12 -15112 +15466 12 16 -21781 +20918 16 -21 -23941 +23 +25709 -21 -41 -24972 +23 +43 +23205 -41 -121 -23788 +43 +154 +23216 -121 -567376 -22493 +154 +566476 +19715 @@ -15183,17 +15157,17 @@ 1 2 -226068 +223418 2 3 -76310 +75415 3 9 -10298 +10177 @@ -15203,19 +15177,19 @@ macro_argument_expanded -92648459 +91317451 invocation -27419703 +26939874 argument_index -723 +715 text -189448 +187228 @@ -15229,22 +15203,22 @@ 1 2 -7656521 +7463526 2 3 -11466609 +11300240 3 4 -6261428 +6167062 4 67 -2035143 +2009044 @@ -15260,22 +15234,22 @@ 1 2 -11165031 +10915238 2 3 -9894482 +9757326 3 4 -5269844 +5190905 4 9 -1090345 +1076404 @@ -15289,18 +15263,18 @@ 12 -50787 -50788 -636 +50779 +50780 +628 -50989 -185566 +50981 +185359 54 -756484 -2500138 +754342 +2485521 32 @@ -15317,7 +15291,7 @@ 1 2 -625 +617 2 @@ -15343,62 +15317,62 @@ 1 2 -22866 +22717 2 3 -38220 +38694 3 4 -6240 +6449 4 5 -15178 +15293 5 6 -2752 +3468 6 7 -22033 +21883 7 9 -15463 +14599 9 15 -16494 +16225 15 -28 -14257 +31 +14914 -28 -77 -14323 +31 +97 +14198 -77 -337 -14323 +97 +559 +14057 -338 -1133296 -7293 +560 +1126278 +4725 @@ -15414,22 +15388,22 @@ 1 2 -95634 +94513 2 3 -79490 +78559 3 6 -14246 +14079 6 66 -76 +75 @@ -15439,19 +15413,19 @@ functions -3468314 +3658482 id -3468314 +3658482 name -288395 +292298 kind -76 +75 @@ -15465,7 +15439,7 @@ 1 2 -3468314 +3658482 @@ -15481,7 +15455,7 @@ 1 2 -3468314 +3658482 @@ -15497,27 +15471,27 @@ 1 2 -195404 +195541 2 3 -28317 +29091 3 5 -26080 +26912 5 -13 -22164 +12 +21948 -13 -123517 -16428 +12 +123481 +18805 @@ -15533,12 +15507,12 @@ 1 2 -286936 +290304 2 3 -1458 +1994 @@ -15572,18 +15546,18 @@ 10 -45041 -45042 +66392 +66393 10 -114719 -114720 +114718 +114719 10 -146936 -146937 +146882 +146883 10 @@ -15623,8 +15597,8 @@ 10 -2880 -2881 +3603 +3604 10 @@ -15640,15 +15614,15 @@ function_entry_point -1008551 +996664 id -1005633 +993781 entry_point -1008551 +996664 @@ -15662,12 +15636,12 @@ 1 2 -1002990 +991169 2 9 -2643 +2612 @@ -15683,7 +15657,7 @@ 1 2 -1008551 +996664 @@ -15693,15 +15667,15 @@ function_return_type -3478481 +3668529 id -3467843 +3658016 return_type -1023587 +1011394 @@ -15715,12 +15689,12 @@ 1 2 -3457698 +3647990 2 6 -10144 +10025 @@ -15736,17 +15710,17 @@ 1 2 -299165 +295658 2 3 -662708 +654745 3 -84263 -61712 +105613 +60989 @@ -16068,48 +16042,48 @@ purefunctions -20748 +20715 id -20748 +20715 function_deleted -56185 +55526 id -56185 +55526 function_defaulted -12930 +12778 id -12930 +12778 member_function_this_type -523358 +517224 id -523358 +517224 this_type -171374 +169365 @@ -16123,7 +16097,7 @@ 1 2 -523358 +517224 @@ -16139,37 +16113,37 @@ 1 2 -62546 +61813 2 3 -44560 +44037 3 4 -22296 +22035 4 5 -15014 +14838 5 7 -13687 +13526 7 36 -12875 +12724 40 87 -394 +390 @@ -16179,27 +16153,27 @@ fun_decls -3543890 +3733464 id -3540621 +3730234 function -3374862 +3566244 type_id -1010514 +998474 name -256842 +261115 location -795456 +786132 @@ -16213,7 +16187,7 @@ 1 2 -3540621 +3730234 @@ -16229,12 +16203,12 @@ 1 2 -3537638 +3727286 2 4 -2983 +2948 @@ -16250,7 +16224,7 @@ 1 2 -3540621 +3730234 @@ -16266,7 +16240,7 @@ 1 2 -3540621 +3730234 @@ -16282,12 +16256,12 @@ 1 2 -3238835 +3431649 2 9 -136027 +134595 @@ -16303,12 +16277,12 @@ 1 2 -3358203 +3549780 2 6 -16659 +16464 @@ -16324,7 +16298,7 @@ 1 2 -3374862 +3566244 @@ -16340,12 +16314,12 @@ 1 2 -3287222 +3479621 2 9 -87639 +86623 @@ -16361,17 +16335,17 @@ 1 2 -280334 +277048 2 3 -661085 +653141 3 -89606 -69093 +110973 +68283 @@ -16387,17 +16361,17 @@ 1 2 -292168 +288743 2 3 -657433 +649532 3 -83378 -60912 +104729 +60198 @@ -16413,12 +16387,12 @@ 1 2 -943975 +932715 2 -7512 -66538 +8223 +65758 @@ -16434,17 +16408,17 @@ 1 2 -913113 +902215 2 6 -80148 +79209 6 -22467 -17251 +24198 +17049 @@ -16460,32 +16434,37 @@ 1 2 -153552 +154159 2 3 -29304 +30023 3 4 -15935 +16344 4 6 -19521 +20062 6 13 -20201 +20929 13 -123766 -18326 +9944 +19585 + + +123729 +123730 +10 @@ -16501,32 +16480,32 @@ 1 2 -164180 +164672 2 3 -28482 +29264 3 4 -14454 +14827 4 7 -21638 +22349 7 -25 -19642 +23 +19737 -25 -123501 -8444 +23 +123465 +10264 @@ -16542,17 +16521,17 @@ 1 2 -224335 +228903 2 5 -20870 +20669 5 -63265 -11636 +63247 +11543 @@ -16568,27 +16547,27 @@ 1 2 -164673 +168477 2 3 -43463 +43528 3 4 -16439 +16409 4 8 -20574 +20897 8 8921 -11691 +11803 @@ -16604,27 +16583,27 @@ 1 2 -522766 +516530 2 3 -143890 +130379 3 -5 -64860 +4 +50681 -5 -125 -59694 +4 +13 +61358 -125 +13 3043 -4244 +27183 @@ -16640,22 +16619,22 @@ 1 2 -537692 +531281 2 3 -156854 +143190 3 -9 -64345 +7 +65780 -9 +7 3043 -36564 +45880 @@ -16671,17 +16650,17 @@ 1 2 -701807 +681604 2 -4 -61789 +3 +62355 -4 +3 1522 -31859 +42173 @@ -16697,12 +16676,12 @@ 1 2 -770451 +742691 2 134 -25005 +43441 @@ -16712,22 +16691,22 @@ fun_def -1230803 +1230856 id -1230803 +1230856 fun_specialized -6421 +6411 id -6421 +6411 @@ -16745,11 +16724,11 @@ fun_decl_specifiers -485334 +485928 id -260686 +261005 name @@ -16767,17 +16746,17 @@ 1 2 -69262 +69347 2 3 -158199 +158393 3 4 -33224 +33264 @@ -16939,26 +16918,26 @@ fun_decl_empty_throws -1420986 +1620964 fun_decl -1420986 +1620964 fun_decl_noexcept -32912 +32527 fun_decl -32123 +31746 constant -32792 +32407 @@ -16972,12 +16951,12 @@ 1 2 -31333 +30966 2 3 -789 +780 @@ -16993,12 +16972,12 @@ 1 2 -32671 +32288 2 3 -120 +119 @@ -17008,26 +16987,26 @@ fun_decl_empty_noexcept -391959 +401889 fun_decl -391959 +401889 fun_decl_typedef_type -175 +173 fun_decl -175 +173 typedeftype_id -87 +86 @@ -17041,7 +17020,7 @@ 1 2 -175 +173 @@ -17057,7 +17036,7 @@ 2 3 -87 +86 @@ -17067,19 +17046,19 @@ param_decl_bind -4651530 +4596444 id -4651530 +4596444 index -701 +693 fun_decl -3071759 +3035277 @@ -17093,7 +17072,7 @@ 1 2 -4651530 +4596444 @@ -17109,7 +17088,7 @@ 1 2 -4651530 +4596444 @@ -17125,12 +17104,12 @@ 1 2 -350 +346 4 5 -142 +140 6 @@ -17149,7 +17128,7 @@ 14149 -280085 +280041 43 @@ -17166,12 +17145,12 @@ 1 2 -350 +346 4 5 -142 +140 6 @@ -17190,7 +17169,7 @@ 14149 -280085 +280041 43 @@ -17207,22 +17186,22 @@ 1 2 -2195287 +2169165 2 3 -478579 +472882 3 4 -242716 +239871 4 65 -155176 +153357 @@ -17238,22 +17217,22 @@ 1 2 -2195287 +2169165 2 3 -478579 +472882 3 4 -242716 +239871 4 65 -155176 +153357 @@ -17263,27 +17242,27 @@ var_decls -5368966 +5305568 id -5360115 +5296821 variable -5132204 +5071603 type_id -2007769 +1983812 name -126310 +124829 location -1232448 +1218002 @@ -17297,7 +17276,7 @@ 1 2 -5360115 +5296821 @@ -17313,12 +17292,12 @@ 1 2 -5351451 +5288258 2 4 -8664 +8562 @@ -17334,7 +17313,7 @@ 1 2 -5360115 +5296821 @@ -17350,7 +17329,7 @@ 1 2 -5360071 +5296777 2 @@ -17371,12 +17350,12 @@ 1 2 -4944675 +4886293 2 9 -187529 +185309 @@ -17392,12 +17371,12 @@ 1 2 -5096835 +5036670 2 7 -35369 +34933 @@ -17413,12 +17392,12 @@ 1 2 -5114635 +5054239 2 3 -17569 +17363 @@ -17434,12 +17413,12 @@ 1 2 -5023990 +4964657 2 9 -108214 +106945 @@ -17455,22 +17434,22 @@ 1 2 -1580878 +1561936 2 3 -228876 +226215 3 11 -156974 +155091 11 5924 -41039 +40569 @@ -17486,22 +17465,22 @@ 1 2 -1605072 +1585846 2 3 -219641 +217088 3 13 -151129 +149325 13 5424 -31925 +31551 @@ -17517,17 +17496,17 @@ 1 2 -1832906 +1811043 2 5 -151238 +149422 5 772 -23623 +23346 @@ -17543,17 +17522,17 @@ 1 2 -1758515 +1737523 2 4 -154496 +152685 4 3608 -94757 +93603 @@ -17569,42 +17548,42 @@ 1 2 -52160 +51483 2 3 -19236 +19054 3 4 -10890 +10784 4 5 -7688 +7597 5 8 -10517 +10394 8 15 -9508 +9397 15 47 -9530 +9418 47 -165630 -6777 +165594 +6698 @@ -17620,37 +17599,37 @@ 1 2 -54978 +54269 2 3 -18786 +18610 3 4 -11789 +11673 4 6 -11197 +11066 6 11 -10736 +10611 11 27 -9486 +9375 27 -164602 -9333 +164566 +9223 @@ -17666,32 +17645,32 @@ 1 2 -76321 +75405 2 3 -16878 +16702 3 4 -8861 +8757 4 7 -10473 +10350 7 27 -9519 +9408 27 -125807 -4255 +125771 +4205 @@ -17707,32 +17686,32 @@ 1 2 -72822 +71969 2 3 -19028 +18805 3 4 -6975 +6893 4 7 -11186 +11055 7 21 -9749 +9635 21 10073 -6547 +6470 @@ -17748,22 +17727,22 @@ 1 2 -892506 +881958 2 3 -149067 +147406 3 6 -113423 +112104 6 -128450 -77450 +128414 +76532 @@ -17779,22 +17758,22 @@ 1 2 -941266 +930147 2 3 -114487 +113232 3 6 -102664 +101472 6 -128224 -74029 +128188 +73150 @@ -17810,17 +17789,17 @@ 1 2 -1055403 +1043010 2 3 -85095 +84119 3 -118388 -91949 +118352 +90871 @@ -17836,12 +17815,12 @@ 1 2 -1223476 +1209135 2 52 -8971 +8866 @@ -17851,11 +17830,11 @@ var_def -2437554 +2408907 id -2437554 +2408907 @@ -17925,19 +17904,19 @@ type_decls -1332162 +1316547 id -1332162 +1316547 type_id -1300412 +1285169 location -1086846 +1074107 @@ -17951,7 +17930,7 @@ 1 2 -1332162 +1316547 @@ -17967,7 +17946,7 @@ 1 2 -1332162 +1316547 @@ -17983,12 +17962,12 @@ 1 2 -1277315 +1262343 2 24 -23097 +22826 @@ -18004,12 +17983,12 @@ 1 2 -1278609 +1263622 2 24 -21802 +21547 @@ -18025,12 +18004,12 @@ 1 2 -1031384 +1019295 2 506 -55461 +54811 @@ -18046,12 +18025,12 @@ 1 2 -1032865 +1020758 2 506 -53980 +53348 @@ -18061,45 +18040,45 @@ type_def -937746 +926754 id -937746 +926754 type_decl_top -268698 +265548 type_decl -268698 +265548 namespace_decls -136871 +135267 id -136871 +135267 namespace_id -7677 +7587 location -122252 +120819 bodylocation -122581 +121144 @@ -18113,7 +18092,7 @@ 1 2 -136871 +135267 @@ -18129,7 +18108,7 @@ 1 2 -136871 +135267 @@ -18145,7 +18124,7 @@ 1 2 -136871 +135267 @@ -18161,42 +18140,42 @@ 1 2 -3619 +3576 2 3 -1085 +1073 3 4 -416 +411 4 7 -647 +639 7 13 -592 +585 13 27 -592 +585 28 163 -581 +574 172 3743 -142 +140 @@ -18212,42 +18191,42 @@ 1 2 -3619 +3576 2 3 -1085 +1073 3 4 -416 +411 4 7 -647 +639 7 13 -592 +585 13 27 -592 +585 28 163 -581 +574 172 3743 -142 +140 @@ -18263,42 +18242,42 @@ 1 2 -3619 +3576 2 3 -1085 +1073 3 4 -416 +411 4 7 -647 +639 7 13 -592 +585 13 27 -592 +585 28 163 -581 +574 172 3742 -142 +140 @@ -18314,12 +18293,12 @@ 1 2 -113873 +112538 2 8 -8379 +8280 @@ -18335,12 +18314,12 @@ 1 2 -113873 +112538 2 8 -8379 +8280 @@ -18356,12 +18335,12 @@ 1 2 -121506 +120082 2 3 -745 +737 @@ -18377,12 +18356,12 @@ 1 2 -114564 +113221 2 11 -8017 +7923 @@ -18398,12 +18377,12 @@ 1 2 -114564 +113221 2 9 -8017 +7923 @@ -18419,12 +18398,12 @@ 1 2 -122186 +120754 2 5 -394 +390 @@ -18434,19 +18413,19 @@ usings -291444 +287692 id -291444 +287692 element_id -46402 +45522 location -23864 +23574 @@ -18460,7 +18439,7 @@ 1 2 -291444 +287692 @@ -18476,7 +18455,7 @@ 1 2 -291444 +287692 @@ -18492,17 +18471,17 @@ 1 2 -39394 +38596 2 4 -3750 +3706 4 127 -3257 +3219 @@ -18518,17 +18497,17 @@ 1 2 -39394 +38596 2 4 -3750 +3706 4 127 -3257 +3219 @@ -18544,22 +18523,22 @@ 1 2 -18063 +17851 2 3 -2237 +2200 3 18 -1798 +1777 18 382 -1765 +1745 @@ -18575,22 +18554,22 @@ 1 2 -18063 +17851 2 3 -2237 +2200 3 18 -1798 +1777 18 382 -1765 +1745 @@ -18600,15 +18579,15 @@ using_container -458103 +452397 parent -11230 +11022 child -291444 +287692 @@ -18622,42 +18601,42 @@ 1 2 -3213 +3154 2 4 -943 +932 4 6 -427 +411 6 7 -2774 +2698 7 17 -932 +921 19 143 -767 +758 178 179 -1261 +1246 179 202 -844 +834 202 @@ -18678,22 +18657,22 @@ 1 2 -215858 +212991 2 3 -50372 +49782 3 11 -23140 +22869 13 47 -2072 +2048 @@ -18703,27 +18682,27 @@ static_asserts -130658 +130452 id -130658 +130452 condition -130658 +130452 message -29707 +29660 location -16721 +16694 enclosing -1724 +1721 @@ -18737,7 +18716,7 @@ 1 2 -130658 +130452 @@ -18753,7 +18732,7 @@ 1 2 -130658 +130452 @@ -18769,7 +18748,7 @@ 1 2 -130658 +130452 @@ -18785,7 +18764,7 @@ 1 2 -130658 +130452 @@ -18801,7 +18780,7 @@ 1 2 -130658 +130452 @@ -18817,7 +18796,7 @@ 1 2 -130658 +130452 @@ -18833,7 +18812,7 @@ 1 2 -130658 +130452 @@ -18849,7 +18828,7 @@ 1 2 -130658 +130452 @@ -18865,7 +18844,7 @@ 1 2 -22108 +22073 2 @@ -18875,22 +18854,22 @@ 3 4 -2830 +2825 4 11 -1444 +1442 12 17 -2348 +2345 17 513 -553 +552 @@ -18906,7 +18885,7 @@ 1 2 -22108 +22073 2 @@ -18916,22 +18895,22 @@ 3 4 -2830 +2825 4 11 -1444 +1442 12 17 -2348 +2345 17 513 -553 +552 @@ -18947,12 +18926,12 @@ 1 2 -27553 +27510 2 33 -2153 +2150 @@ -18968,27 +18947,27 @@ 1 2 -23513 +23476 2 3 -182 +181 3 4 -2654 +2650 4 11 -1301 +1299 12 21 -2055 +2052 @@ -19004,22 +18983,22 @@ 1 2 -2901 +2897 2 3 -2765 +2760 3 4 -1327 +1325 5 6 -3728 +3722 6 @@ -19029,17 +19008,17 @@ 14 15 -2036 +2033 16 17 -39 +38 17 18 -3402 +3397 19 @@ -19060,22 +19039,22 @@ 1 2 -2901 +2897 2 3 -2765 +2760 3 4 -1327 +1325 5 6 -3728 +3722 6 @@ -19085,17 +19064,17 @@ 14 15 -2036 +2033 16 17 -39 +38 17 18 -3402 +3397 19 @@ -19116,17 +19095,17 @@ 1 2 -4417 +4410 2 3 -5985 +5976 3 4 -6128 +6119 4 @@ -19147,22 +19126,22 @@ 1 2 -3441 +3436 2 3 -6193 +6184 3 4 -1125 +1123 4 5 -3715 +3709 5 @@ -19172,7 +19151,7 @@ 13 14 -2036 +2033 16 @@ -19193,12 +19172,12 @@ 1 2 -1171 +1169 2 3 -130 +129 3 @@ -19213,7 +19192,7 @@ 170 347 -130 +129 348 @@ -19234,12 +19213,12 @@ 1 2 -1171 +1169 2 3 -130 +129 3 @@ -19254,7 +19233,7 @@ 170 347 -130 +129 348 @@ -19275,7 +19254,7 @@ 1 2 -1327 +1325 2 @@ -19285,12 +19264,12 @@ 5 180 -130 +129 211 2870 -130 +129 @@ -19306,7 +19285,7 @@ 1 2 -1314 +1312 2 @@ -19316,12 +19295,12 @@ 5 180 -130 +129 211 1886 -130 +129 @@ -19331,23 +19310,23 @@ params -4645049 +4589800 id -4627983 +4572935 function -3043935 +3007660 index -701 +693 type_id -1856848 +1834606 @@ -19361,12 +19340,12 @@ 1 2 -4627314 +4572273 2 69 -669 +661 @@ -19382,7 +19361,7 @@ 1 2 -4627983 +4572935 @@ -19398,12 +19377,12 @@ 1 2 -4612936 +4558064 2 4 -15047 +14870 @@ -19419,22 +19398,22 @@ 1 2 -2166673 +2140887 2 3 -475124 +469349 3 4 -244460 +241595 4 65 -157676 +155828 @@ -19450,22 +19429,22 @@ 1 2 -2166673 +2140887 2 3 -475124 +469349 3 4 -244460 +241595 4 65 -157676 +155828 @@ -19481,22 +19460,22 @@ 1 2 -2283256 +2255896 2 3 -470978 +465458 3 5 -254331 +251350 5 20 -35369 +34954 @@ -19512,12 +19491,12 @@ 1 2 -350 +346 4 5 -142 +140 6 @@ -19536,7 +19515,7 @@ 14377 -277376 +277321 43 @@ -19553,12 +19532,12 @@ 1 2 -350 +346 4 5 -142 +140 6 @@ -19577,7 +19556,7 @@ 14377 -277548 +277493 43 @@ -19594,12 +19573,12 @@ 1 2 -350 +346 2 3 -142 +140 4 @@ -19618,7 +19597,7 @@ 2870 -151163 +151119 43 @@ -19635,22 +19614,22 @@ 1 2 -1504765 +1486737 2 3 -186717 +184518 3 14 -139492 +137781 14 5175 -25871 +25568 @@ -19666,22 +19645,22 @@ 1 2 -1524627 +1506355 2 3 -179852 +177679 3 23 -139723 +138074 23 4690 -12645 +12497 @@ -19697,12 +19676,12 @@ 1 2 -1745157 +1724311 2 65 -111690 +110294 @@ -19712,15 +19691,15 @@ overrides -159058 +158806 new -124549 +124352 old -15465 +15440 @@ -19734,12 +19713,12 @@ 1 2 -90046 +89904 2 3 -34496 +34441 3 @@ -19760,37 +19739,37 @@ 1 2 -8126 +8113 2 3 -2016 +2013 3 4 -871 +870 4 5 -1262 +1260 5 10 -1229 +1227 10 43 -1164 +1162 44 218 -793 +792 @@ -19800,19 +19779,19 @@ membervariables -310308 +308142 id -305691 +300035 type_id -132923 +56417 name -53224 +94717 @@ -19826,12 +19805,12 @@ 1 2 -301227 +292000 2 -7 -4463 +5 +8035 @@ -19847,7 +19826,7 @@ 1 2 -305691 +300035 @@ -19863,22 +19842,27 @@ 1 2 -108071 +40463 2 3 -12272 +7041 3 -9 -10056 +6 +4586 -9 -1712 -2522 +6 +423 +4235 + + +460 +3062 +90 @@ -19894,17 +19878,22 @@ 1 2 -115123 +44789 2 3 -9091 +5326 3 -266 -8708 +9 +4462 + + +9 +1352 +1838 @@ -19920,32 +19909,22 @@ 1 2 -28098 +63303 2 3 -8170 +16272 3 -4 -5373 - - -4 -6 -4014 - - -6 -15 -4090 +5 +8288 -15 -1967 -3476 +5 +1294 +6853 @@ -19961,32 +19940,17 @@ 1 2 -34294 +75353 2 3 -6854 +12998 3 -4 -3695 - - -4 -7 -4299 - - -7 -242 -3992 - - -262 -605 -87 +421 +6366 @@ -20167,19 +20131,19 @@ localvariables -521293 +520470 id -521215 +520392 type_id -47528 +47453 name -75238 +75119 @@ -20193,12 +20157,12 @@ 1 2 -521137 +520314 2 3 -78 +77 @@ -20214,7 +20178,7 @@ 1 2 -521215 +520392 @@ -20230,32 +20194,32 @@ 1 2 -26473 +26432 2 3 -6759 +6749 3 4 -2856 +2851 4 6 -4059 +4053 6 13 -3806 +3800 13 3196 -3565 +3559 4920 @@ -20276,22 +20240,22 @@ 1 2 -35699 +35643 2 3 -4873 +4865 3 5 -4268 +4261 5 1158 -2687 +2682 @@ -20307,32 +20271,32 @@ 1 2 -42960 +42892 2 3 -12914 +12894 3 4 -5087 +5079 4 7 -6720 +6710 7 31 -5705 +5696 31 6112 -1847 +1844 @@ -20348,17 +20312,17 @@ 1 2 -63735 +63634 2 3 -6389 +6379 3 819 -5113 +5105 @@ -20368,11 +20332,11 @@ autoderivation -19512 +19481 var -19512 +19481 derivation_type @@ -20390,7 +20354,7 @@ 1 2 -19512 +19481 @@ -20436,31 +20400,31 @@ enumconstants -93839 +93691 id -93839 +93691 parent -8009 +7996 index -7579 +7567 type_id -7866 +7853 name -72902 +72787 location -75869 +75749 @@ -20474,7 +20438,7 @@ 1 2 -93839 +93691 @@ -20490,7 +20454,7 @@ 1 2 -93839 +93691 @@ -20506,7 +20470,7 @@ 1 2 -93839 +93691 @@ -20522,7 +20486,7 @@ 1 2 -93839 +93691 @@ -20538,7 +20502,7 @@ 1 2 -93839 +93691 @@ -20554,47 +20518,47 @@ 1 2 -1594 +1591 2 3 -819 +818 3 4 -2452 +2448 4 5 -579 +578 5 6 -579 +578 6 9 -728 +727 9 16 -611 +610 16 392 -605 +604 426 1166 -39 +38 @@ -20610,42 +20574,42 @@ 1 2 -1594 +1591 2 3 -832 +831 3 4 -2498 +2494 4 5 -572 +571 5 6 -585 +584 6 9 -702 +701 9 17 -624 +623 17 1166 -598 +597 @@ -20661,12 +20625,12 @@ 1 2 -7267 +7255 2 3 -741 +740 @@ -20682,42 +20646,42 @@ 1 2 -1594 +1591 2 3 -832 +831 3 4 -2498 +2494 4 5 -572 +571 5 6 -585 +584 6 9 -702 +701 9 17 -624 +623 17 1166 -598 +597 @@ -20733,42 +20697,42 @@ 1 2 -1633 +1630 2 3 -832 +831 3 4 -2452 +2448 4 5 -579 +578 5 6 -559 +558 6 9 -702 +701 9 16 -611 +610 16 427 -605 +604 466 @@ -20789,47 +20753,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 10 -689 +688 10 11 -351 +350 11 12 -553 +552 12 30 -598 +597 30 1253 -351 +350 @@ -20845,47 +20809,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 9 -676 +675 9 11 -364 +363 11 12 -553 +552 12 29 -598 +597 29 1232 -351 +350 @@ -20901,47 +20865,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 9 -676 +675 9 11 -364 +363 11 12 -553 +552 12 28 -598 +597 28 1210 -351 +350 @@ -20957,47 +20921,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 10 -689 +688 10 11 -351 +350 11 12 -553 +552 12 28 -598 +597 28 674 -351 +350 @@ -21013,47 +20977,47 @@ 1 2 -2609 +2604 2 3 -930 +928 3 4 -923 +922 4 7 -572 +571 7 10 -689 +688 10 11 -351 +350 11 12 -553 +552 12 28 -598 +597 28 774 -351 +350 @@ -21069,42 +21033,42 @@ 1 2 -1594 +1591 2 3 -800 +799 3 4 -2426 +2422 4 5 -559 +558 5 6 -559 +558 6 9 -702 +701 9 16 -598 +597 16 470 -592 +591 479 @@ -21125,7 +21089,7 @@ 1 2 -7859 +7847 137 @@ -21146,42 +21110,42 @@ 1 2 -1594 +1591 2 3 -813 +811 3 4 -2472 +2468 4 5 -553 +552 5 6 -566 +565 6 9 -676 +675 9 17 -611 +610 17 1166 -579 +578 @@ -21197,42 +21161,42 @@ 1 2 -1594 +1591 2 3 -813 +811 3 4 -2472 +2468 4 5 -553 +552 5 6 -566 +565 6 9 -676 +675 9 17 -611 +610 17 1166 -579 +578 @@ -21248,47 +21212,47 @@ 1 2 -1633 +1630 2 3 -813 +811 3 4 -2426 +2422 4 5 -559 +558 5 6 -540 +539 6 9 -676 +675 9 16 -598 +597 16 470 -592 +591 621 1166 -26 +25 @@ -21304,17 +21268,17 @@ 1 2 -65543 +65440 2 3 -6838 +6827 3 239 -520 +519 @@ -21330,17 +21294,17 @@ 1 2 -66188 +66083 2 3 -6193 +6184 3 239 -520 +519 @@ -21356,12 +21320,12 @@ 1 2 -67879 +67772 2 13 -5022 +5014 @@ -21377,17 +21341,17 @@ 1 2 -61145 +61049 2 3 -11236 +11218 3 239 -520 +519 @@ -21403,12 +21367,12 @@ 1 2 -70430 +70318 2 23 -2472 +2468 @@ -21424,12 +21388,12 @@ 1 2 -70579 +70468 2 229 -5289 +5281 @@ -21445,12 +21409,12 @@ 1 2 -70690 +70578 2 229 -5178 +5170 @@ -21466,12 +21430,12 @@ 1 2 -72271 +72157 2 17 -3597 +3592 @@ -21487,12 +21451,12 @@ 1 2 -65648 +65544 2 3 -9967 +9951 3 @@ -21513,12 +21477,12 @@ 1 2 -75700 +75580 2 27 -169 +168 @@ -21528,23 +21492,23 @@ builtintypes -515 +509 id -515 +509 name -515 +509 kind -515 +509 size -76 +75 sign @@ -21566,7 +21530,7 @@ 1 2 -515 +509 @@ -21582,7 +21546,7 @@ 1 2 -515 +509 @@ -21598,7 +21562,7 @@ 1 2 -515 +509 @@ -21614,7 +21578,7 @@ 1 2 -515 +509 @@ -21630,7 +21594,7 @@ 1 2 -515 +509 @@ -21646,7 +21610,7 @@ 1 2 -515 +509 @@ -21662,7 +21626,7 @@ 1 2 -515 +509 @@ -21678,7 +21642,7 @@ 1 2 -515 +509 @@ -21694,7 +21658,7 @@ 1 2 -515 +509 @@ -21710,7 +21674,7 @@ 1 2 -515 +509 @@ -21726,7 +21690,7 @@ 1 2 -515 +509 @@ -21742,7 +21706,7 @@ 1 2 -515 +509 @@ -21758,7 +21722,7 @@ 1 2 -515 +509 @@ -21774,7 +21738,7 @@ 1 2 -515 +509 @@ -21790,7 +21754,7 @@ 1 2 -515 +509 @@ -22240,23 +22204,23 @@ derivedtypes -4463123 +4408457 id -4463123 +4408457 name -2202887 +2176199 kind -87 +86 type_id -2610563 +2578132 @@ -22270,7 +22234,7 @@ 1 2 -4463123 +4408457 @@ -22286,7 +22250,7 @@ 1 2 -4463123 +4408457 @@ -22302,7 +22266,7 @@ 1 2 -4463123 +4408457 @@ -22318,17 +22282,17 @@ 1 2 -1593501 +1573891 2 3 -493889 +488328 3 -45177 -115496 +45171 +113980 @@ -22344,7 +22308,7 @@ 1 2 -2202855 +2176167 2 @@ -22365,17 +22329,17 @@ 1 2 -1593743 +1574130 2 3 -493659 +488100 3 -45159 -115485 +45153 +113969 @@ -22409,23 +22373,23 @@ 10 -45229 -45230 +45223 +45224 10 -61034 -61035 +61016 +61017 10 -97001 -97002 +96858 +96859 10 -170398 -170399 +170348 +170349 10 @@ -22465,18 +22429,18 @@ 10 -40954 -40955 +40934 +40935 10 -48341 -48342 +48321 +48322 10 -92928 -92929 +92888 +92889 10 @@ -22511,23 +22475,23 @@ 10 -45229 -45230 +45223 +45224 10 -61034 -61035 +61016 +61017 10 -96670 -96671 +96527 +96528 10 -170398 -170399 +170348 +170349 10 @@ -22544,22 +22508,22 @@ 1 2 -1541056 +1521486 2 3 -369487 +365026 3 4 -628085 +620527 4 202 -71934 +71091 @@ -22575,22 +22539,22 @@ 1 2 -1542273 +1522689 2 3 -369334 +364874 3 4 -627021 +619476 4 198 -71934 +71091 @@ -22606,22 +22570,22 @@ 1 2 -1542591 +1523003 2 3 -370617 +366143 3 4 -626977 +619433 4 7 -70377 +69552 @@ -22631,11 +22595,11 @@ pointerishsize -3375893 +3335520 id -3375893 +3335520 size @@ -22657,7 +22621,7 @@ 1 2 -3375893 +3335520 @@ -22673,7 +22637,7 @@ 1 2 -3375893 +3335520 @@ -22692,8 +22656,8 @@ 10 -307794 -307795 +307720 +307721 10 @@ -22724,8 +22688,8 @@ 12 -307815 -307816 +307741 +307742 10 @@ -22752,23 +22716,23 @@ arraysizes -17196 +16995 id -17196 +16995 num_elements -2160 +2135 bytesize -2511 +2482 alignment -76 +75 @@ -22782,7 +22746,7 @@ 1 2 -17196 +16995 @@ -22798,7 +22762,7 @@ 1 2 -17196 +16995 @@ -22814,7 +22778,7 @@ 1 2 -17196 +16995 @@ -22830,37 +22794,37 @@ 1 2 -164 +162 2 3 -1272 +1257 3 4 -76 +75 4 5 -175 +173 5 13 -164 +162 13 25 -164 +162 38 116 -142 +140 @@ -22876,22 +22840,22 @@ 1 2 -1590 +1571 2 3 -219 +216 3 4 -120 +119 4 6 -164 +162 6 @@ -22912,22 +22876,22 @@ 1 2 -1590 +1571 2 3 -241 +238 3 4 -142 +140 4 7 -164 +162 7 @@ -22948,37 +22912,37 @@ 1 2 -153 +151 2 3 -1403 +1387 3 4 -109 +108 4 6 -208 +205 6 9 -197 +195 9 18 -208 +205 21 56 -197 +195 59 @@ -22999,17 +22963,17 @@ 1 2 -1908 +1885 2 3 -350 +346 3 6 -219 +216 6 @@ -23030,17 +22994,17 @@ 1 2 -1952 +1929 2 3 -285 +281 3 5 -230 +227 5 @@ -23188,15 +23152,15 @@ typedefbase -1819702 +1798090 id -1819702 +1798090 type_id -847375 +837313 @@ -23210,7 +23174,7 @@ 1 2 -1819702 +1798090 @@ -23226,22 +23190,22 @@ 1 2 -656643 +648849 2 3 -87913 +86937 3 6 -69598 +68695 6 5503 -33219 +32830 @@ -23251,19 +23215,19 @@ decltypes -47005 +46454 id -47005 +46454 expr -43441 +42932 base_type -8631 +8530 parentheses_would_change_meaning @@ -23281,7 +23245,7 @@ 1 2 -47005 +46454 @@ -23297,7 +23261,7 @@ 1 2 -47005 +46454 @@ -23313,7 +23277,7 @@ 1 2 -47005 +46454 @@ -23329,12 +23293,12 @@ 1 2 -40162 +39691 2 4 -3279 +3240 @@ -23350,12 +23314,12 @@ 1 2 -40162 +39691 2 4 -3279 +3240 @@ -23371,7 +23335,7 @@ 1 2 -43441 +42932 @@ -23387,17 +23351,17 @@ 1 2 -5823 +5755 2 3 -2522 +2492 3 274 -285 +281 @@ -23413,17 +23377,17 @@ 1 2 -2314 +2286 2 3 -5702 +5636 3 2451 -614 +606 @@ -23439,7 +23403,7 @@ 1 2 -8631 +8530 @@ -23512,19 +23476,19 @@ usertypes -4193942 +4144306 id -4193942 +4144306 name -879411 +868886 kind -120 +119 @@ -23538,7 +23502,7 @@ 1 2 -4193942 +4144306 @@ -23554,7 +23518,7 @@ 1 2 -4193942 +4144306 @@ -23570,22 +23534,22 @@ 1 2 -577471 +570463 2 3 -194800 +192539 3 7 -69313 +68500 7 -32744 -37826 +32725 +37382 @@ -23601,12 +23565,12 @@ 1 2 -826768 +816860 2 10 -52642 +52025 @@ -23645,8 +23609,8 @@ 10 -16789 -16790 +16782 +16783 10 @@ -23665,13 +23629,13 @@ 10 -95209 -95210 +95191 +95192 10 -149132 -149133 +149113 +149114 10 @@ -23731,8 +23695,8 @@ 10 -55460 -55461 +55440 +55441 10 @@ -23743,19 +23707,19 @@ usertypesize -1386604 +1370156 id -1386604 +1370156 size -1480 +1463 alignment -87 +86 @@ -23769,7 +23733,7 @@ 1 2 -1386604 +1370156 @@ -23785,7 +23749,7 @@ 1 2 -1386604 +1370156 @@ -23801,12 +23765,12 @@ 1 2 -427 +422 2 3 -197 +195 3 @@ -23816,37 +23780,37 @@ 4 5 -87 +86 5 8 -120 +119 8 12 -109 +108 12 17 -120 +119 19 38 -120 +119 42 261 -120 +119 284 -99380 -109 +99362 +108 @@ -23862,17 +23826,17 @@ 1 2 -1217 +1203 2 3 -175 +173 3 6 -87 +86 @@ -23921,8 +23885,8 @@ 10 -113881 -113882 +113863 +113864 10 @@ -23979,26 +23943,26 @@ usertype_final -1314 +1312 id -1314 +1312 usertype_uuid -4834 +4826 id -4834 +4826 uuid -4834 +4826 @@ -24012,7 +23976,7 @@ 1 2 -4834 +4826 @@ -24028,7 +23992,7 @@ 1 2 -4834 +4826 @@ -24038,15 +24002,15 @@ mangled_name -4190663 +4141065 id -4190663 +4141065 mangled_name -483689 +478020 @@ -24060,7 +24024,7 @@ 1 2 -4190663 +4141065 @@ -24076,32 +24040,32 @@ 1 2 -292091 +288667 2 3 -62294 +61563 3 4 -33340 +32949 4 7 -36970 +36537 7 24 -37069 +36634 24 8580 -21923 +21666 @@ -24111,59 +24075,59 @@ is_pod_class -589228 +582213 id -589228 +582213 is_standard_layout_class -1159208 +1145425 id -1159208 +1145425 is_complete -1365097 +1348901 id -1365097 +1348901 is_class_template -225355 +222714 id -225355 +222714 class_instantiation -1157815 +1144049 to -1156247 +1142499 from -68030 +67232 @@ -24177,12 +24141,12 @@ 1 2 -1154766 +1141036 2 4 -1480 +1463 @@ -24198,47 +24162,47 @@ 1 2 -19960 +19726 2 3 -11998 +11857 3 4 -6854 +6774 4 5 -4617 +4563 5 7 -5637 +5571 7 11 -6053 +5982 11 20 -5198 +5137 20 84 -5110 +5050 84 4845 -2599 +2568 @@ -24248,19 +24212,19 @@ class_template_argument -3036083 +3000322 type_id -1392844 +1376323 index -1228 +1213 arg_type -860931 +850742 @@ -24274,27 +24238,27 @@ 1 2 -567118 +560264 2 3 -433744 +428660 3 4 -244987 +242126 4 7 -122811 +121372 7 113 -24182 +23899 @@ -24310,22 +24274,22 @@ 1 2 -593351 +586190 2 3 -445973 +440746 3 4 -258443 +255425 4 113 -95075 +93960 @@ -24346,31 +24310,31 @@ 2 3 -778 +769 3 26 -98 +97 29 64 -98 +97 69 435 -98 +97 616 9358 -98 +97 13712 -123925 +123907 43 @@ -24392,31 +24356,31 @@ 2 3 -778 +769 3 14 -109 +108 14 26 -98 +97 29 148 -98 +97 198 3602 -98 +97 -11970 -41382 +11971 +41372 32 @@ -24433,27 +24397,27 @@ 1 2 -522294 +516183 2 3 -187441 +185136 3 4 -56711 +56047 4 11 -67393 +66603 11 -11851 -27089 +11852 +26771 @@ -24469,17 +24433,17 @@ 1 2 -746476 +737629 2 3 -95546 +94426 3 22 -18907 +18685 @@ -24489,19 +24453,19 @@ class_template_argument_value -345798 +342536 type_id -223842 +221229 index -153 +151 arg_value -328239 +325172 @@ -24515,17 +24479,17 @@ 1 2 -201479 +199129 2 3 -13709 +13548 3 14 -8653 +8551 @@ -24541,22 +24505,22 @@ 1 2 -189854 +187640 2 3 -16922 +16724 3 37 -16790 +16594 44 171 -274 +270 @@ -24615,8 +24579,8 @@ 10 -9812 -9813 +9813 +9814 10 @@ -24661,13 +24625,13 @@ 10 -1582 -1583 +1597 +1598 10 -6332 -6333 +6347 +6348 10 @@ -24676,8 +24640,8 @@ 10 -12052 -12053 +12094 +12095 10 @@ -24694,12 +24658,12 @@ 1 2 -310999 +308123 2 4 -17240 +17049 @@ -24715,7 +24679,7 @@ 1 2 -328239 +325172 @@ -24725,15 +24689,15 @@ is_proxy_class_for -46380 +45836 id -46380 +45836 templ_param_id -46380 +45836 @@ -24747,7 +24711,7 @@ 1 2 -46380 +45836 @@ -24763,7 +24727,7 @@ 1 2 -46380 +45836 @@ -24773,23 +24737,23 @@ type_mentions -1677532 +1674881 id -1677532 +1674881 type_id -67209 +67096 location -1647024 +1644422 kind -13 +12 @@ -24803,7 +24767,7 @@ 1 2 -1677532 +1674881 @@ -24819,7 +24783,7 @@ 1 2 -1677532 +1674881 @@ -24835,7 +24799,7 @@ 1 2 -1677532 +1674881 @@ -24851,37 +24815,37 @@ 1 2 -30071 +30024 2 3 -12309 +12283 3 4 -3636 +3631 4 7 -6070 +6054 7 13 -5139 +5138 13 35 -5191 +5183 35 9490 -4788 +4781 @@ -24897,37 +24861,37 @@ 1 2 -30071 +30024 2 3 -12309 +12283 3 4 -3636 +3631 4 7 -6070 +6054 7 13 -5139 +5138 13 35 -5191 +5183 35 9490 -4788 +4781 @@ -24943,12 +24907,12 @@ 1 2 -65966 +65856 2 3 -1242 +1240 @@ -24964,12 +24928,12 @@ 1 2 -1616855 +1614300 2 5 -30169 +30121 @@ -24985,12 +24949,12 @@ 1 2 -1616855 +1614300 2 5 -30169 +30121 @@ -25006,7 +24970,7 @@ 1 2 -1647024 +1644422 @@ -25046,8 +25010,8 @@ 6 -10314 -10315 +10313 +10314 6 @@ -25079,26 +25043,26 @@ is_function_template -983786 +972255 id -983786 +972255 function_instantiation -708332 +700030 to -708332 +700030 from -129337 +127821 @@ -25112,7 +25076,7 @@ 1 2 -708332 +700030 @@ -25128,37 +25092,37 @@ 1 2 -61010 +60295 2 3 -30839 +30478 3 4 -7348 +7261 4 5 -8817 +8714 5 10 -10002 +9884 10 71 -9706 +9592 71 653 -1612 +1593 @@ -25168,19 +25132,19 @@ function_template_argument -1910587 +1888193 function_id -1054394 +1042035 index -219 +216 arg_type -338461 +334493 @@ -25194,22 +25158,22 @@ 1 2 -583601 +576761 2 3 -291016 +287605 3 4 -127768 +126271 4 21 -52006 +51397 @@ -25225,22 +25189,22 @@ 1 2 -598023 +591014 2 3 -288702 +285318 3 4 -110945 +109644 4 21 -56722 +56057 @@ -25478,27 +25442,27 @@ 1 2 -226134 +223483 2 3 -45119 +44590 3 6 -27670 +27346 6 19 -25608 +25308 19 2030 -13928 +13765 @@ -25514,12 +25478,12 @@ 1 2 -314837 +311147 2 12 -23623 +23346 @@ -25529,19 +25493,19 @@ function_template_argument_value -198069 +197655 function_id -107084 +105829 index -153 +151 arg_value -170607 +170363 @@ -25555,12 +25519,12 @@ 1 2 -101567 +100377 2 14 -5516 +5451 @@ -25576,17 +25540,17 @@ 1 2 -84963 +83967 2 3 -16176 +15987 3 -113 -5944 +119 +5874 @@ -25671,33 +25635,33 @@ 10 -157 -158 +169 +170 10 -405 -406 +408 +409 10 -973 -974 +1024 +1025 10 -2523 -2524 +2547 +2548 10 -4858 -4859 +4912 +4913 10 -6595 -6596 +6613 +6614 10 @@ -25714,17 +25678,17 @@ 1 2 -143649 +143569 2 3 -26453 +26294 3 4 -504 +498 @@ -25740,7 +25704,7 @@ 1 2 -170607 +170363 @@ -25750,26 +25714,26 @@ is_variable_template -17810 +17602 id -17810 +17602 variable_instantiation -35808 +35388 to -35808 +35388 from -6470 +6394 @@ -25783,7 +25747,7 @@ 1 2 -35808 +35388 @@ -25799,37 +25763,37 @@ 1 2 -2237 +2211 2 3 -1908 +1885 3 4 -361 +357 4 5 -734 +726 5 9 -537 +531 9 21 -493 +487 24 288 -197 +195 @@ -25839,11 +25803,11 @@ variable_template_argument -5484 +5476 variable_id -845 +844 index @@ -25851,7 +25815,7 @@ arg_type -4203 +4196 @@ -25865,7 +25829,7 @@ 1 2 -683 +682 2 @@ -25875,7 +25839,7 @@ 3 5 -39 +38 @@ -25896,12 +25860,12 @@ 2 3 -130 +129 3 4 -65 +64 4 @@ -25916,12 +25880,12 @@ 8 13 -65 +64 13 85 -65 +64 202 @@ -26014,7 +25978,7 @@ 1 2 -3480 +3475 2 @@ -26024,7 +25988,7 @@ 3 11 -247 +246 @@ -26040,7 +26004,7 @@ 1 2 -3988 +3982 2 @@ -26063,7 +26027,7 @@ index -13 +12 arg_value @@ -26081,7 +26045,7 @@ 1 2 -13 +12 2 @@ -26102,7 +26066,7 @@ 3 4 -13 +12 15 @@ -26191,15 +26155,15 @@ routinetypes -430487 +421539 id -430487 +421539 return_type -177571 +173397 @@ -26213,7 +26177,7 @@ 1 2 -430487 +421539 @@ -26229,22 +26193,22 @@ 1 2 -143112 +139917 2 3 -18128 +17580 3 -9 -13325 +10 +13342 -9 +10 8267 -3005 +2557 @@ -26254,19 +26218,19 @@ routinetypeargs -719859 +704387 routine -351852 +344519 index -350 +346 type_id -205570 +202391 @@ -26280,27 +26244,27 @@ 1 2 -161931 +158418 2 3 -95952 +94112 3 4 -53937 +53066 4 6 -32331 +31421 6 33 -7699 +7500 @@ -26316,22 +26280,22 @@ 1 2 -186750 +182632 2 3 -96709 +94925 3 4 -47663 +46563 4 22 -20728 +20398 @@ -26347,7 +26311,7 @@ 1 2 -120 +119 2 @@ -26365,43 +26329,43 @@ 21 -52 -74 +51 +72 21 -93 -115 +90 +111 21 -139 -199 +134 +193 21 -269 -364 +262 +356 21 -473 -703 +464 +693 21 -1449 -3651 +1438 +3592 21 -8568 -17318 +8487 +17171 21 -32082 -32083 +31786 +31787 10 @@ -26418,7 +26382,7 @@ 1 2 -120 +119 2 @@ -26436,18 +26400,18 @@ 21 -33 -37 +32 +36 21 -38 -42 +37 +41 21 -44 -83 +43 +82 21 @@ -26466,13 +26430,13 @@ 21 -2679 -6045 +2669 +6025 21 -13491 -13492 +13431 +13432 10 @@ -26489,27 +26453,27 @@ 1 2 -122416 +120526 2 3 -40842 +40265 3 4 -13215 +12963 4 7 -16637 +16420 7 -1349 -12458 +1325 +12215 @@ -26525,17 +26489,17 @@ 1 2 -154112 +151709 2 3 -39438 +38835 3 33 -12020 +11846 @@ -26545,19 +26509,19 @@ ptrtomembers -12634 +12486 id -12634 +12486 type_id -9398 +9288 class_id -6361 +6286 @@ -26571,7 +26535,7 @@ 1 2 -12634 +12486 @@ -26587,7 +26551,7 @@ 1 2 -12634 +12486 @@ -26603,12 +26567,12 @@ 1 2 -9037 +8931 2 111 -361 +357 @@ -26624,12 +26588,12 @@ 1 2 -9037 +8931 2 111 -361 +357 @@ -26645,17 +26609,17 @@ 1 2 -5341 +5278 2 3 -515 +509 8 65 -504 +498 @@ -26671,17 +26635,17 @@ 1 2 -5341 +5278 2 3 -515 +509 8 65 -504 +498 @@ -26691,15 +26655,15 @@ specifiers -504 +498 id -504 +498 str -504 +498 @@ -26713,7 +26677,7 @@ 1 2 -504 +498 @@ -26729,7 +26693,7 @@ 1 2 -504 +498 @@ -26739,15 +26703,15 @@ typespecifiers -1333215 +1316038 type_id -1326328 +1309231 spec_id -76 +75 @@ -26761,12 +26725,12 @@ 1 2 -1319440 +1302424 2 3 -6887 +6806 @@ -26810,8 +26774,8 @@ 10 -96536 -96537 +96393 +96394 10 @@ -26822,15 +26786,15 @@ funspecifiers -11122577 +11898581 func_id -3417865 +3610802 spec_id -175 +173 @@ -26844,27 +26808,27 @@ 1 2 -342321 +332055 2 3 -421977 +428379 3 4 -853879 +865569 4 5 -1680922 +1867415 5 8 -118764 +117383 @@ -26928,8 +26892,8 @@ 10 -27095 -27096 +28391 +28392 10 @@ -26938,23 +26902,23 @@ 10 -139439 -139440 +160563 +160564 10 -222376 -222377 +240969 +240970 10 -250677 -250678 +271992 +271993 10 -284037 -284038 +305333 +305334 10 @@ -26965,15 +26929,15 @@ varspecifiers -1112009 +1110252 var_id -924798 +923337 spec_id -65 +64 @@ -26987,17 +26951,17 @@ 1 2 -786189 +784946 2 3 -91660 +91515 3 5 -46949 +46874 @@ -27068,11 +27032,11 @@ attributes -413727 +414234 id -413727 +414234 kind @@ -27088,7 +27052,7 @@ location -90509 +90620 @@ -27102,7 +27066,7 @@ 1 2 -413727 +414234 @@ -27118,7 +27082,7 @@ 1 2 -413727 +414234 @@ -27134,7 +27098,7 @@ 1 2 -413727 +414234 @@ -27150,7 +27114,7 @@ 1 2 -413727 +414234 @@ -27468,32 +27432,32 @@ 1 2 -26730 +26763 2 3 -5313 +5319 3 4 -29996 +30032 4 8 -7387 +7396 8 9 -17697 +17719 9 73 -3384 +3388 @@ -27509,7 +27473,7 @@ 1 2 -90509 +90620 @@ -27525,22 +27489,22 @@ 1 2 -28415 +28450 2 3 -4680 +4685 3 4 -49670 +49730 4 9 -7364 +7373 9 @@ -27561,7 +27525,7 @@ 1 2 -90509 +90620 @@ -27571,11 +27535,11 @@ attribute_args -152614 +152801 id -152614 +152801 kind @@ -27583,7 +27547,7 @@ attribute -151315 +151500 index @@ -27591,7 +27555,7 @@ location -57361 +57431 @@ -27605,7 +27569,7 @@ 1 2 -152614 +152801 @@ -27621,7 +27585,7 @@ 1 2 -152614 +152801 @@ -27637,7 +27601,7 @@ 1 2 -152614 +152801 @@ -27653,7 +27617,7 @@ 1 2 -152614 +152801 @@ -27753,12 +27717,12 @@ 1 2 -150537 +150721 2 5 -778 +779 @@ -27774,12 +27738,12 @@ 1 2 -150825 +151010 2 3 -489 +490 @@ -27795,12 +27759,12 @@ 1 2 -150537 +150721 2 5 -778 +779 @@ -27816,12 +27780,12 @@ 1 2 -150542 +150726 2 5 -773 +774 @@ -27951,27 +27915,27 @@ 1 2 -27295 +27328 2 3 -8428 +8439 3 5 -2886 +2889 5 6 -17600 +17621 6 37 -1150 +1152 @@ -27987,12 +27951,12 @@ 1 2 -51566 +51629 2 3 -5795 +5802 @@ -28008,27 +27972,27 @@ 1 2 -27280 +27314 2 3 -8445 +8455 3 5 -2884 +2888 5 6 -17600 +17621 6 37 -1150 +1152 @@ -28044,7 +28008,7 @@ 1 2 -57356 +57427 3 @@ -28059,15 +28023,15 @@ attribute_arg_value -152590 +152776 arg -152590 +152776 value -2187 +2190 @@ -28081,7 +28045,7 @@ 1 2 -152590 +152776 @@ -28097,7 +28061,7 @@ 1 2 -1730 +1732 2 @@ -28228,15 +28192,15 @@ typeattributes -19324 +19097 type_id -17942 +17732 spec_id -19324 +19097 @@ -28250,12 +28214,12 @@ 1 2 -17240 +17038 2 34 -701 +693 @@ -28271,7 +28235,7 @@ 1 2 -19324 +19097 @@ -28281,15 +28245,15 @@ funcattributes -304396 +300785 func_id -164245 +162277 spec_id -304396 +300785 @@ -28303,22 +28267,22 @@ 1 2 -89690 +88595 2 3 -12579 +12432 3 4 -59969 +59266 4 14 -2007 +1983 @@ -28334,7 +28298,7 @@ 1 2 -304396 +300785 @@ -28402,15 +28366,15 @@ stmtattributes -6 +986 stmt_id -6 +986 spec_id -6 +986 @@ -28424,7 +28388,7 @@ 1 2 -6 +986 @@ -28440,7 +28404,7 @@ 1 2 -6 +986 @@ -28450,15 +28414,15 @@ unspecifiedtype -9115641 +9002061 type_id -9115641 +9002061 unspecified_type_id -5012847 +4949385 @@ -28472,7 +28436,7 @@ 1 2 -9115641 +9002061 @@ -28488,17 +28452,17 @@ 1 2 -2736095 +2701086 2 3 -1962057 +1937281 3 7950 -314695 +311017 @@ -28508,19 +28472,19 @@ member -4921797 +5094949 parent -814507 +804764 index -2676 +2644 child -4906234 +5079548 @@ -28533,48 +28497,43 @@ 1 -2 -42322 - - -2 3 -223787 +70343 3 4 -204627 +381479 4 5 -86926 +94416 5 7 -65902 +68793 7 9 -61614 +59396 9 15 -62052 +63850 15 47 -61186 +60469 47 245 -6086 +6015 @@ -28589,48 +28548,43 @@ 1 -2 -41664 - - -2 3 -223611 +69812 3 4 -199385 +375930 4 5 -89734 +97841 5 7 -66373 +68685 7 9 -61690 +59461 9 15 -62974 +64772 15 42 -61274 +60555 42 281 -7797 +7706 @@ -28646,62 +28600,62 @@ 1 2 -493 +487 2 5 -241 +238 5 10 -230 +227 10 64 -208 +205 65 137 -208 +205 144 213 -208 +205 219 295 -208 +205 299 -390 -208 +393 +216 -392 -629 -208 +393 +649 +205 -648 -3431 -208 +649 +3628 +205 -3625 -22436 -208 +3644 +31598 +205 -30800 -73591 -43 +65753 +73573 +32 @@ -28717,62 +28671,62 @@ 1 2 -482 +476 2 5 -197 +195 5 9 -208 +205 9 22 -208 +205 25 132 -208 +205 132 199 -208 +205 199 279 -208 +205 279 -362 -208 +366 +205 -365 +382 480 -208 +205 -487 +489 1630 -208 +205 1771 -8138 -208 +8155 +205 -8900 -74537 -120 +8939 +74519 +119 @@ -28788,7 +28742,7 @@ 1 2 -4906234 +5079548 @@ -28804,12 +28758,12 @@ 1 2 -4890880 +5064362 2 7 -15354 +15185 @@ -28819,15 +28773,15 @@ enclosingfunction -125081 +123615 child -125081 +123615 parent -71407 +70570 @@ -28841,7 +28795,7 @@ 1 2 -125081 +123615 @@ -28857,27 +28811,27 @@ 1 2 -38341 +37892 2 3 -21079 +20832 3 4 -6536 +6459 4 7 -5373 +5310 7 45 -76 +75 @@ -28887,15 +28841,15 @@ derivations -390270 +385706 derivation -390270 +385706 sub -364453 +360192 index @@ -28903,11 +28857,11 @@ super -235708 +232945 location -86981 +85961 @@ -28921,7 +28875,7 @@ 1 2 -390270 +385706 @@ -28937,7 +28891,7 @@ 1 2 -390270 +385706 @@ -28953,7 +28907,7 @@ 1 2 -390270 +385706 @@ -28969,7 +28923,7 @@ 1 2 -390270 +385706 @@ -28985,12 +28939,12 @@ 1 2 -341883 +337886 2 7 -22570 +22306 @@ -29006,12 +28960,12 @@ 1 2 -351501 +347392 2 7 -12952 +12800 @@ -29027,12 +28981,12 @@ 1 2 -341893 +337897 2 7 -22559 +22295 @@ -29048,12 +29002,12 @@ 1 2 -351490 +347381 2 7 -12963 +12811 @@ -29092,8 +29046,8 @@ 10 -34120 -34121 +34121 +34122 10 @@ -29133,8 +29087,8 @@ 10 -33231 -33232 +33232 +33233 10 @@ -29233,12 +29187,12 @@ 1 2 -220924 +218324 2 1142 -14783 +14621 @@ -29254,12 +29208,12 @@ 1 2 -220935 +218335 2 1142 -14772 +14610 @@ -29275,12 +29229,12 @@ 1 2 -235259 +232501 2 4 -449 +444 @@ -29296,12 +29250,12 @@ 1 2 -228349 +225673 2 439 -7359 +7272 @@ -29317,22 +29271,22 @@ 1 2 -66352 +65574 2 3 -8389 +8291 3 7 -6613 +6535 7 795 -5626 +5560 @@ -29348,22 +29302,22 @@ 1 2 -68589 +67785 2 3 -6371 +6297 3 8 -7040 +6958 8 795 -4979 +4920 @@ -29379,7 +29333,7 @@ 1 2 -86959 +85940 2 @@ -29400,22 +29354,22 @@ 1 2 -69291 +68479 2 3 -8203 +8107 3 9 -6525 +6449 9 795 -2961 +2926 @@ -29425,11 +29379,11 @@ derspecifiers -392650 +388058 der_id -390237 +385674 spec_id @@ -29447,12 +29401,12 @@ 1 2 -387824 +383289 2 3 -2412 +2384 @@ -29481,8 +29435,8 @@ 10 -34332 -34333 +34333 +34334 10 @@ -29493,15 +29447,15 @@ direct_base_offsets -310560 +306931 der_id -310560 +306931 offset -197 +195 @@ -29515,7 +29469,7 @@ 1 2 -310560 +306931 @@ -29589,8 +29543,8 @@ 10 -27927 -27928 +27928 +27929 10 @@ -29601,19 +29555,19 @@ virtual_base_offsets -6339 +6264 sub -3509 +3468 super -482 +476 offset -241 +238 @@ -29627,22 +29581,22 @@ 1 2 -2763 +2731 2 4 -307 +303 4 7 -252 +249 7 11 -186 +184 @@ -29658,17 +29612,17 @@ 1 2 -2961 +2926 2 4 -296 +292 4 8 -252 +249 @@ -29684,7 +29638,7 @@ 1 2 -76 +75 2 @@ -29699,7 +29653,7 @@ 4 5 -87 +86 5 @@ -29745,12 +29699,12 @@ 1 2 -274 +270 2 3 -76 +75 4 @@ -29852,7 +29806,7 @@ 1 2 -76 +75 2 @@ -29892,23 +29846,23 @@ frienddecls -240347 +237444 id -240347 +237444 type_id -27286 +26966 decl_id -49045 +48405 location -7304 +7218 @@ -29922,7 +29876,7 @@ 1 2 -240347 +237444 @@ -29938,7 +29892,7 @@ 1 2 -240347 +237444 @@ -29954,7 +29908,7 @@ 1 2 -240347 +237444 @@ -29970,42 +29924,42 @@ 1 2 -6218 +6145 2 3 -10232 +10112 3 5 -1985 +1961 5 6 -910 +899 6 8 -2314 +2286 8 19 -2116 +2091 21 43 -2105 +2081 43 162 -1403 +1387 @@ -30021,42 +29975,42 @@ 1 2 -6218 +6145 2 3 -10232 +10112 3 5 -1985 +1961 5 6 -910 +899 6 8 -2314 +2286 8 19 -2116 +2091 21 43 -2105 +2081 43 162 -1403 +1387 @@ -30072,12 +30026,12 @@ 1 2 -25707 +25405 2 31 -1579 +1560 @@ -30093,27 +30047,27 @@ 1 2 -33691 +33242 2 3 -4990 +4931 3 7 -4024 +3966 7 23 -3805 +3761 23 394 -2533 +2503 @@ -30129,27 +30083,27 @@ 1 2 -33691 +33242 2 3 -4990 +4931 3 7 -4024 +3966 7 23 -3805 +3761 23 394 -2533 +2503 @@ -30165,12 +30119,12 @@ 1 2 -48508 +47874 2 46 -537 +531 @@ -30186,17 +30140,17 @@ 1 2 -6240 +6167 2 3 -943 +932 3 -21137 -120 +21129 +119 @@ -30212,12 +30166,12 @@ 1 2 -6865 +6785 2 2097 -438 +433 @@ -30233,17 +30187,17 @@ 1 2 -6251 +6178 2 3 -932 +921 3 -3836 -120 +3830 +119 @@ -30253,19 +30207,19 @@ comments -1580341 +1561817 id -1580341 +1561817 contents -784182 +774990 location -1580341 +1561817 @@ -30279,7 +30233,7 @@ 1 2 -1580341 +1561817 @@ -30295,7 +30249,7 @@ 1 2 -1580341 +1561817 @@ -30311,17 +30265,17 @@ 1 2 -663959 +656176 2 3 -75103 +74223 3 10738 -45119 +44590 @@ -30337,17 +30291,17 @@ 1 2 -663959 +656176 2 3 -75103 +74223 3 10738 -45119 +44590 @@ -30363,7 +30317,7 @@ 1 2 -1580341 +1561817 @@ -30379,7 +30333,7 @@ 1 2 -1580341 +1561817 @@ -30389,15 +30343,15 @@ commentbinding -713311 +704994 id -618433 +611185 element -684533 +676553 @@ -30411,17 +30365,17 @@ 1 2 -557093 +550520 2 3 -49045 +48514 3 97 -12294 +12150 @@ -30437,12 +30391,12 @@ 1 2 -655755 +648112 2 3 -28778 +28440 @@ -30452,15 +30406,15 @@ exprconv -6443797 +6470964 converted -6443503 +6470955 conversion -6443797 +6470964 @@ -30474,12 +30428,12 @@ 1 2 -6443210 +6470947 2 4 -293 +8 @@ -30495,7 +30449,7 @@ 1 2 -6443797 +6470964 @@ -30505,30 +30459,30 @@ compgenerated -6707808 +6859342 id -6707808 +6859342 synthetic_destructor_call -59596 +58919 element -46380 +45858 i -307 +303 destructor_call -49451 +48893 @@ -30542,17 +30496,17 @@ 1 2 -36937 +36526 2 3 -6766 +6687 3 29 -2676 +2644 @@ -30568,17 +30522,17 @@ 1 2 -36937 +36526 2 3 -6766 +6687 3 29 -2676 +2644 @@ -30594,7 +30548,7 @@ 1 2 -230 +227 2 @@ -30612,8 +30566,8 @@ 21 -4229 -4230 +4231 +4232 10 @@ -30630,7 +30584,7 @@ 1 2 -230 +227 2 @@ -30648,8 +30602,8 @@ 21 -3563 -3564 +3565 +3566 10 @@ -30666,17 +30620,17 @@ 1 2 -43605 +43116 2 3 -3619 +3576 3 26 -2226 +2200 @@ -30692,7 +30646,7 @@ 1 2 -49451 +48893 @@ -30702,15 +30656,15 @@ namespaces -7688 +7597 id -7688 +7597 name -4134 +4086 @@ -30724,7 +30678,7 @@ 1 2 -7688 +7597 @@ -30740,17 +30694,17 @@ 1 2 -3476 +3435 2 3 -416 +411 3 139 -241 +238 @@ -30760,26 +30714,26 @@ namespace_inline -153 +151 id -153 +151 namespacembrs -1603361 +1584090 parentid -7161 +7077 memberid -1603361 +1584090 @@ -30793,67 +30747,67 @@ 1 2 -734 +726 2 3 -800 +791 3 4 -350 +346 4 5 -526 +520 5 7 -559 +552 7 12 -581 +574 12 19 -537 +531 19 34 -548 +541 36 52 -581 +574 52 105 -537 +531 105 230 -548 +541 231 744 -537 +531 778 -39485 -318 +39452 +314 @@ -30869,7 +30823,7 @@ 1 2 -1603361 +1584090 @@ -30879,19 +30833,19 @@ exprparents -13453475 +13432189 expr_id -13453286 +13432000 child_index -3123 +3118 parent_id -9530420 +9515340 @@ -30905,7 +30859,7 @@ 1 2 -13453279 +13431994 2 @@ -30926,12 +30880,12 @@ 1 2 -13453104 +13431818 2 4 -182 +181 @@ -30952,12 +30906,12 @@ 2 3 -644 +643 3 4 -1652 +1649 4 @@ -30967,16 +30921,16 @@ 46 56 -234 +233 56 3654 -234 +233 6420 -1188857 +1188854 45 @@ -30998,12 +30952,12 @@ 2 3 -644 +643 3 4 -1652 +1649 4 @@ -31013,16 +30967,16 @@ 31 41 -234 +233 41 3639 -234 +233 6405 -1188870 +1188867 45 @@ -31039,17 +30993,17 @@ 1 2 -6759115 +6748421 2 3 -2187726 +2184263 3 1681 -583578 +582655 @@ -31065,17 +31019,17 @@ 1 2 -6759135 +6748441 2 3 -2187707 +2184243 3 480 -583578 +582655 @@ -31085,11 +31039,11 @@ expr_isload -5007373 +5009424 expr_id -5007373 +5009424 @@ -31169,11 +31123,11 @@ iscall -2320215 +2293539 caller -2320215 +2293539 kind @@ -31191,7 +31145,7 @@ 1 2 -2320215 +2293539 @@ -31210,13 +31164,13 @@ 10 -6428 -6429 +6427 +6428 10 -203744 -203745 +203793 +203794 10 @@ -31227,11 +31181,11 @@ numtemplatearguments -164695 +162776 expr_id -164695 +162776 num @@ -31249,7 +31203,7 @@ 1 2 -164695 +162776 @@ -31278,8 +31232,8 @@ 10 -14304 -14305 +14305 +14306 10 @@ -31338,23 +31292,23 @@ namequalifiers -1114410 +1119060 id -1114410 +1119060 qualifiableelement -1114410 +1119060 qualifyingelement -38861 +38800 location -504702 +504119 @@ -31368,7 +31322,7 @@ 1 2 -1114410 +1119060 @@ -31384,7 +31338,7 @@ 1 2 -1114410 +1119060 @@ -31400,7 +31354,7 @@ 1 2 -1114410 +1119060 @@ -31416,7 +31370,7 @@ 1 2 -1114410 +1119060 @@ -31432,7 +31386,7 @@ 1 2 -1114410 +1119060 @@ -31448,7 +31402,7 @@ 1 2 -1114410 +1119060 @@ -31464,32 +31418,32 @@ 1 2 -18920 +18890 2 3 -8119 +8035 3 4 -5029 +4975 4 11 -3018 +3079 11 -129 -2927 +121 +2910 -132 -24941 -845 +124 +24963 +909 @@ -31505,32 +31459,32 @@ 1 2 -18920 +18890 2 3 -8119 +8035 3 4 -5029 +4975 4 11 -3018 +3079 11 -129 -2927 +121 +2910 -132 -24941 -845 +124 +24963 +909 @@ -31546,27 +31500,27 @@ 1 2 -24788 +24749 2 3 -4749 +4670 3 4 -3760 +3709 4 11 -2966 +3027 11 -16728 -2595 +16750 +2643 @@ -31582,22 +31536,22 @@ 1 2 -383621 +380150 2 3 -56714 +56638 3 7 -38757 +41762 7 381 -25608 +25568 @@ -31613,22 +31567,22 @@ 1 2 -383621 +380150 2 3 -56714 +56638 3 7 -38757 +41762 7 381 -25608 +25568 @@ -31644,17 +31598,17 @@ 1 2 -447844 +444298 2 3 -44535 +44477 3 190 -12322 +15343 @@ -31664,15 +31618,15 @@ varbind -5434586 +5425985 expr -5434462 +5425862 var -1532794 +1530372 @@ -31686,7 +31640,7 @@ 1 2 -5434339 +5425738 2 @@ -31707,32 +31661,32 @@ 1 2 -679961 +678893 2 3 -308897 +308409 3 4 -232741 +232367 4 5 -92818 +92671 5 9 -133059 +132849 9 6150 -85316 +85181 @@ -31742,15 +31696,15 @@ funbind -2416551 +2412732 expr -2119690 +2116341 fun -434031 +433346 @@ -31764,12 +31718,12 @@ 1 2 -1823070 +1820189 2 3 -296444 +295975 3 @@ -31790,32 +31744,32 @@ 1 2 -252052 +251653 2 3 -75583 +75463 3 4 -31230 +31180 4 7 -33904 +33850 7 37 -33429 +33376 37 6664 -7833 +7821 @@ -31825,15 +31779,15 @@ expr_allocator -30335 +29979 expr -30335 +29979 func -120 +119 form @@ -31851,7 +31805,7 @@ 1 2 -30335 +29979 @@ -31867,7 +31821,7 @@ 1 2 -30335 +29979 @@ -31934,7 +31888,7 @@ 1 2 -120 +119 @@ -31976,15 +31930,15 @@ expr_deallocator -33307 +32917 expr -33307 +32917 func -131 +130 form @@ -32002,7 +31956,7 @@ 1 2 -33307 +32917 @@ -32018,7 +31972,7 @@ 1 2 -33307 +32917 @@ -32085,7 +32039,7 @@ 1 2 -131 +130 @@ -32148,15 +32102,15 @@ expr_cond_guard -154261 +154485 cond -154261 +154485 guard -154261 +154485 @@ -32170,7 +32124,7 @@ 1 2 -154261 +154485 @@ -32186,7 +32140,7 @@ 1 2 -154261 +154485 @@ -32196,15 +32150,15 @@ expr_cond_true -154261 +154485 cond -154261 +154485 true -154261 +154485 @@ -32218,7 +32172,7 @@ 1 2 -154261 +154485 @@ -32234,7 +32188,7 @@ 1 2 -154261 +154485 @@ -32244,15 +32198,15 @@ expr_cond_false -154261 +154485 cond -154261 +154485 false -154261 +154485 @@ -32266,7 +32220,7 @@ 1 2 -154261 +154485 @@ -32282,7 +32236,7 @@ 1 2 -154261 +154485 @@ -32292,15 +32246,15 @@ values -8774612 +8774622 id -8774612 +8774622 str -651636 +651637 @@ -32314,7 +32268,7 @@ 1 2 -8774612 +8774622 @@ -32339,8 +32293,8 @@ 3 -4040431 -45954 +4040441 +45955 @@ -32350,11 +32304,11 @@ valuetext -4778492 +4778502 id -4778492 +4778502 text @@ -32372,7 +32326,7 @@ 1 2 -4778492 +4778502 @@ -32413,15 +32367,15 @@ valuebind -9496109 +9496119 val -8768402 +8768412 expr -9496109 +9496119 @@ -32435,7 +32389,7 @@ 1 2 -8041454 +8041464 2 @@ -32461,7 +32415,7 @@ 1 2 -9496109 +9496119 @@ -32471,19 +32425,19 @@ fieldoffsets -251147 +250750 id -251147 +250750 byteoffset -8998 +8983 bitoffset -52 +51 @@ -32497,7 +32451,7 @@ 1 2 -251147 +250750 @@ -32513,7 +32467,7 @@ 1 2 -251147 +250750 @@ -32529,27 +32483,27 @@ 1 2 -6115 +6106 2 3 -780 +779 3 6 -748 +747 6 17 -676 +675 17 11719 -676 +675 @@ -32565,12 +32519,12 @@ 1 2 -8555 +8542 2 9 -442 +441 @@ -32682,11 +32636,11 @@ bitfield -13779 +13845 id -13779 +13845 bits @@ -32708,7 +32662,7 @@ 1 2 -13779 +13845 @@ -32724,7 +32678,7 @@ 1 2 -13779 +13845 @@ -32779,11 +32733,11 @@ 37 -75 +94 4 -93 +97 152 4 @@ -32861,11 +32815,11 @@ 37 -75 +94 4 -93 +97 152 4 @@ -32898,23 +32852,23 @@ initialisers -1664806 +1662175 init -1664806 +1662175 var -642772 +641756 expr -1664806 +1662175 location -318682 +318179 @@ -32928,7 +32882,7 @@ 1 2 -1664806 +1662175 @@ -32944,7 +32898,7 @@ 1 2 -1664806 +1662175 @@ -32960,7 +32914,7 @@ 1 2 -1664806 +1662175 @@ -32976,22 +32930,22 @@ 1 2 -556212 +555333 2 16 -28705 +28660 16 17 -49050 +48973 17 53 -8802 +8789 @@ -33007,22 +32961,22 @@ 1 2 -556212 +555333 2 16 -28705 +28660 16 17 -49050 +48973 17 53 -8802 +8789 @@ -33038,12 +32992,12 @@ 1 2 -642758 +641743 2 3 -13 +12 @@ -33059,7 +33013,7 @@ 1 2 -1664806 +1662175 @@ -33075,7 +33029,7 @@ 1 2 -1664806 +1662175 @@ -33091,7 +33045,7 @@ 1 2 -1664806 +1662175 @@ -33107,27 +33061,27 @@ 1 2 -246092 +245703 2 3 -23728 +23690 3 7 -24248 +24210 7 65 -24086 +24048 67 109109 -527 +526 @@ -33143,22 +33097,22 @@ 1 2 -268675 +268251 2 3 -24970 +24931 3 22 -23923 +23885 22 12503 -1112 +1110 @@ -33174,27 +33128,27 @@ 1 2 -246092 +245703 2 3 -23728 +23690 3 7 -24248 +24210 7 65 -24086 +24048 67 109109 -527 +526 @@ -33204,15 +33158,15 @@ expr_ancestor -66077 +65325 exp -65375 +64631 ancestor -47093 +46563 @@ -33226,12 +33180,12 @@ 1 2 -64739 +64002 2 4 -636 +628 @@ -33247,17 +33201,17 @@ 1 2 -34930 +34543 2 3 -9706 +9592 3 29 -2456 +2427 @@ -33267,19 +33221,19 @@ exprs -18434101 +18461258 id -18434101 +18461258 kind -1096 +1094 location -3623249 +3585917 @@ -33293,7 +33247,7 @@ 1 2 -18434101 +18461258 @@ -33309,7 +33263,7 @@ 1 2 -18434101 +18461258 @@ -33325,67 +33279,67 @@ 2 14 -87 +86 15 50 -87 +86 50 90 -87 +86 90 223 -87 +86 306 -471 -87 +472 +86 484 715 -87 +86 866 2036 -87 +86 2167 2960 -87 +86 3202 4443 -87 +86 -4717 -6425 -87 +4720 +6423 +86 -6722 +6723 13439 -87 +86 17876 -114329 -87 +100489 +86 -192871 -428312 -43 +114342 +428357 +54 @@ -33401,67 +33355,67 @@ 1 4 -98 +97 4 14 -98 +97 14 24 -87 +86 24 38 -87 +86 38 134 -87 +86 144 259 -87 +86 270 481 -87 +86 481 1076 -87 +86 1099 1408 -87 +86 1427 2051 -87 +86 2060 4561 -87 +86 5889 -60114 -87 +59193 +86 -72772 -118610 -21 +60309 +118611 +32 @@ -33477,37 +33431,37 @@ 1 2 -1680483 +1649719 2 3 -738624 +725837 3 4 -319926 +318788 4 5 -276890 +272431 5 9 -301720 +311028 9 -53 -272120 +45 +269006 -53 -144478 -33483 +45 +143462 +39106 @@ -33523,17 +33477,17 @@ 1 2 -2586676 +2542158 2 3 -807411 +786154 3 30 -229161 +257604 @@ -33543,15 +33497,15 @@ expr_types -18573385 +18609954 id -18430284 +18457486 typeid -1322456 +1280368 value_category @@ -33569,12 +33523,12 @@ 1 2 -18288641 +18306730 2 4 -141642 +150755 @@ -33590,7 +33544,7 @@ 1 2 -18430284 +18457486 @@ -33606,42 +33560,42 @@ 1 2 -513839 +468861 2 3 -251951 +252672 3 4 -108499 +107476 4 5 -86038 +88617 5 8 -114147 +114110 8 -14 -106075 +13 +96724 -14 -45 -99747 +13 +36 +97331 -45 -126297 -42158 +36 +126306 +54572 @@ -33657,17 +33611,17 @@ 1 2 -1170932 +1115749 2 3 -143123 +155026 3 4 -8400 +9592 @@ -33681,18 +33635,18 @@ 12 -5447 -5448 +7302 +7303 10 -370443 -370444 +383285 +383286 10 -1304589 -1304590 +1312333 +1312334 10 @@ -33707,18 +33661,18 @@ 12 -1453 -1454 +1649 +1650 10 -30955 -30956 +32129 +32130 10 -102756 -102757 +100424 +100425 10 @@ -33729,15 +33683,15 @@ new_allocated_type -32134 +31757 expr -32134 +31757 type_id -16516 +16323 @@ -33751,7 +33705,7 @@ 1 2 -32134 +31757 @@ -33767,22 +33721,22 @@ 1 2 -10342 +10220 2 3 -3717 +3674 3 5 -1403 +1387 5 107 -1052 +1040 @@ -33792,15 +33746,15 @@ new_array_allocated_type -5296 +5287 expr -5296 +5287 type_id -2277 +2273 @@ -33814,7 +33768,7 @@ 1 2 -5296 +5287 @@ -33835,7 +33789,7 @@ 2 3 -2016 +2013 3 @@ -33845,7 +33799,7 @@ 8 15 -52 +51 @@ -34392,15 +34346,15 @@ condition_decl_bind -7008 +6947 expr -7008 +6947 decl -7008 +6947 @@ -34414,7 +34368,7 @@ 1 2 -7008 +6947 @@ -34430,7 +34384,7 @@ 1 2 -7008 +6947 @@ -34440,15 +34394,15 @@ typeid_bind -4419 +4368 expr -4419 +4368 type_id -2346 +2319 @@ -34462,7 +34416,7 @@ 1 2 -4419 +4368 @@ -34478,17 +34432,17 @@ 1 2 -1173 +1159 2 3 -899 +888 3 6 -208 +205 6 @@ -34503,15 +34457,15 @@ uuidof_bind -845 +844 expr -845 +844 type_id -644 +643 @@ -34525,7 +34479,7 @@ 1 2 -845 +844 @@ -34561,15 +34515,15 @@ sizeof_bind -156887 +157116 expr -156887 +157116 type_id -2700 +2704 @@ -34583,7 +34537,7 @@ 1 2 -156887 +157116 @@ -34599,12 +34553,12 @@ 1 2 -1061 +1063 2 3 -355 +356 3 @@ -34619,7 +34573,7 @@ 9 32 -128 +129 34 @@ -34697,11 +34651,11 @@ lambdas -12680 +12660 expr -12680 +12660 default_capture @@ -34709,7 +34663,7 @@ has_explicit_return_type -13 +12 @@ -34723,7 +34677,7 @@ 1 2 -12680 +12660 @@ -34739,7 +34693,7 @@ 1 2 -12680 +12660 @@ -34818,7 +34772,7 @@ 3 4 -13 +12 @@ -34828,15 +34782,15 @@ lambda_capture -21652 +21618 id -21652 +21618 lambda -10169 +10153 index @@ -34844,19 +34798,19 @@ field -21652 +21618 captured_by_reference -13 +12 is_implicit -13 +12 location -13871 +13849 @@ -34870,7 +34824,7 @@ 1 2 -21652 +21618 @@ -34886,7 +34840,7 @@ 1 2 -21652 +21618 @@ -34902,7 +34856,7 @@ 1 2 -21652 +21618 @@ -34918,7 +34872,7 @@ 1 2 -21652 +21618 @@ -34934,7 +34888,7 @@ 1 2 -21652 +21618 @@ -34950,7 +34904,7 @@ 1 2 -21652 +21618 @@ -34966,27 +34920,27 @@ 1 2 -5139 +5131 2 3 -2348 +2345 3 4 -1249 +1247 4 6 -910 +909 6 18 -520 +519 @@ -35002,27 +34956,27 @@ 1 2 -5139 +5131 2 3 -2348 +2345 3 4 -1249 +1247 4 6 -910 +909 6 18 -520 +519 @@ -35038,27 +34992,27 @@ 1 2 -5139 +5131 2 3 -2348 +2345 3 4 -1249 +1247 4 6 -910 +909 6 18 -520 +519 @@ -35074,7 +35028,7 @@ 1 2 -9707 +9691 2 @@ -35095,7 +35049,7 @@ 1 2 -10149 +10133 2 @@ -35116,22 +35070,22 @@ 1 2 -5614 +5606 2 3 -2472 +2468 3 4 -1027 +1026 4 7 -813 +811 7 @@ -35440,7 +35394,7 @@ 1 2 -26 +25 2 @@ -35461,7 +35415,7 @@ 1 2 -65 +64 2 @@ -35578,7 +35532,7 @@ 1 2 -21652 +21618 @@ -35594,7 +35548,7 @@ 1 2 -21652 +21618 @@ -35610,7 +35564,7 @@ 1 2 -21652 +21618 @@ -35626,7 +35580,7 @@ 1 2 -21652 +21618 @@ -35642,7 +35596,7 @@ 1 2 -21652 +21618 @@ -35658,7 +35612,7 @@ 1 2 -21652 +21618 @@ -35758,7 +35712,7 @@ 2 3 -13 +12 @@ -35879,7 +35833,7 @@ 2 3 -13 +12 @@ -35916,17 +35870,17 @@ 1 2 -12505 +12485 2 6 -1041 +1039 6 68 -325 +324 @@ -35942,12 +35896,12 @@ 1 2 -12947 +12926 2 68 -923 +922 @@ -35963,12 +35917,12 @@ 1 2 -13337 +13316 2 8 -533 +532 @@ -35984,17 +35938,17 @@ 1 2 -12505 +12485 2 6 -1041 +1039 6 68 -325 +324 @@ -36010,7 +35964,7 @@ 1 2 -13851 +13829 2 @@ -36031,7 +35985,7 @@ 1 2 -13871 +13849 @@ -36157,19 +36111,19 @@ stmts -4688994 +4651977 id -4688994 +4651977 kind -208 +116 location -1194106 +2016407 @@ -36183,7 +36137,7 @@ 1 2 -4688994 +4651977 @@ -36199,7 +36153,7 @@ 1 2 -4688994 +4651977 @@ -36213,99 +36167,94 @@ 12 -2 -3 -10 - - -47 -48 -10 +26 +27 +6 -355 -356 -10 +553 +554 +6 -502 -503 -10 +828 +829 +6 -735 -736 -10 +1443 +1444 +6 -1638 -1639 -10 +1582 +1583 +6 -1835 -1836 -10 +1908 +1909 +6 -2235 -2236 -10 +2445 +2446 +6 -2266 -2267 -10 +3327 +3328 +6 -2748 -2749 -10 +3570 +3571 +6 -2826 -2827 -10 +4942 +4943 +6 -3119 -3120 -10 +15732 +15733 +6 -3441 -3442 -10 +15997 +15998 +6 -4772 -4773 -10 +20983 +20984 +6 -30477 -30478 -10 +68504 +68505 +6 -55902 -55903 -10 +87453 +87454 +6 -90766 -90767 -10 +109229 +109230 +6 -103053 -103054 -10 +182456 +182457 +6 -120825 -120826 -10 +195155 +195156 +6 @@ -36319,99 +36268,94 @@ 12 -2 -3 -10 - - -42 -43 -10 +26 +27 +6 -106 -107 -10 +414 +415 +6 -112 -113 -10 +785 +786 +6 -180 -181 -10 +1053 +1054 +6 -254 -255 -10 +1285 +1286 +6 -300 -301 -10 +1329 +1330 +6 -662 -663 -10 +1370 +1371 +6 -663 -664 -10 +2027 +2028 +6 -1002 -1003 -10 +2301 +2302 +6 -1033 -1034 -10 +2430 +2431 +6 -1412 -1413 -10 +6908 +6909 +6 -1954 -1955 -10 +8367 +8368 +6 -2676 -2677 -10 +10976 +10977 +6 -10189 -10190 -10 +36004 +36005 +6 -10259 -10260 -10 +42618 +42619 +6 -22314 -22315 -10 +45224 +45225 +6 -26695 -26696 -10 +80548 +80549 +6 -32139 -32140 -10 +96139 +96140 +6 @@ -36427,32 +36371,17 @@ 1 2 -678008 +1715650 2 -3 -181585 - - -3 4 -107907 +176807 4 -6 -102105 - - -6 -22 -101535 - - -22 -5041 -22965 +1671 +123949 @@ -36468,12 +36397,12 @@ 1 2 -1170515 +1952279 2 -9 -23590 +10 +64128 @@ -36579,15 +36508,15 @@ if_then -523910 +524673 if_stmt -523910 +524673 then_id -523910 +524673 @@ -36601,7 +36530,7 @@ 1 2 -523910 +524673 @@ -36617,7 +36546,7 @@ 1 2 -523910 +524673 @@ -36627,15 +36556,15 @@ if_else -148099 +148314 if_stmt -148099 +148314 else_id -148099 +148314 @@ -36649,7 +36578,7 @@ 1 2 -148099 +148314 @@ -36665,7 +36594,7 @@ 1 2 -148099 +148314 @@ -36771,15 +36700,15 @@ while_body -30993 +30641 while_stmt -30993 +30641 body_id -30993 +30641 @@ -36793,7 +36722,7 @@ 1 2 -30993 +30641 @@ -36809,7 +36738,7 @@ 1 2 -30993 +30641 @@ -36819,15 +36748,15 @@ do_body -149713 +149931 do_stmt -149713 +149931 body_id -149713 +149931 @@ -36841,7 +36770,7 @@ 1 2 -149713 +149931 @@ -36857,7 +36786,7 @@ 1 2 -149713 +149931 @@ -36867,19 +36796,19 @@ switch_case -271389 +271721 switch_stmt -53243 +53308 index -263 +264 case_id -271389 +271721 @@ -36893,17 +36822,17 @@ 1 5 -4054 +4059 5 6 -47130 +47188 6 163 -2057 +2060 @@ -36919,17 +36848,17 @@ 1 5 -4054 +4059 5 6 -47130 +47188 6 163 -2057 +2060 @@ -37037,7 +36966,7 @@ 1 2 -271389 +271721 @@ -37053,7 +36982,7 @@ 1 2 -271389 +271721 @@ -37063,15 +36992,15 @@ switch_body -53243 +53308 switch_stmt -53243 +53308 body_id -53243 +53308 @@ -37085,7 +37014,7 @@ 1 2 -53243 +53308 @@ -37101,7 +37030,7 @@ 1 2 -53243 +53308 @@ -37111,15 +37040,15 @@ for_initialization -29714 +29667 for_stmt -29714 +29667 init_id -29714 +29667 @@ -37133,7 +37062,7 @@ 1 2 -29714 +29667 @@ -37149,7 +37078,7 @@ 1 2 -29714 +29667 @@ -37159,15 +37088,15 @@ for_condition -31555 +31505 for_stmt -31555 +31505 condition_id -31555 +31505 @@ -37181,7 +37110,7 @@ 1 2 -31555 +31505 @@ -37197,7 +37126,7 @@ 1 2 -31555 +31505 @@ -37207,15 +37136,15 @@ for_update -29453 +29407 for_stmt -29453 +29407 update_id -29453 +29407 @@ -37229,7 +37158,7 @@ 1 2 -29453 +29407 @@ -37245,7 +37174,7 @@ 1 2 -29453 +29407 @@ -37255,15 +37184,15 @@ for_body -32153 +32103 for_stmt -32153 +32103 body_id -32153 +32103 @@ -37277,7 +37206,7 @@ 1 2 -32153 +32103 @@ -37293,7 +37222,7 @@ 1 2 -32153 +32103 @@ -37303,19 +37232,19 @@ stmtparents -4119868 +4113351 id -4119868 +4113351 index -12635 +12615 parent -1741423 +1738665 @@ -37329,7 +37258,7 @@ 1 2 -4119868 +4113351 @@ -37345,7 +37274,7 @@ 1 2 -4119868 +4113351 @@ -37361,12 +37290,12 @@ 1 2 -3968 +3962 2 3 -1080 +1078 3 @@ -37376,37 +37305,37 @@ 4 5 -1476 +1474 7 8 -1034 +1032 8 12 -819 +818 12 29 -1112 +1110 29 37 -897 +896 37 74 -962 +961 74 -192181 -767 +192180 +766 @@ -37422,12 +37351,12 @@ 1 2 -3968 +3962 2 3 -1080 +1078 3 @@ -37437,37 +37366,37 @@ 4 5 -1476 +1474 7 8 -1034 +1032 8 12 -819 +818 12 29 -1112 +1110 29 37 -897 +896 37 74 -962 +961 74 -192181 -767 +192180 +766 @@ -37483,32 +37412,32 @@ 1 2 -991897 +990323 2 3 -382684 +382079 3 4 -108381 +108209 4 6 -114022 +113841 6 17 -131784 +131575 17 1943 -12654 +12634 @@ -37524,32 +37453,32 @@ 1 2 -991897 +990323 2 3 -382684 +382079 3 4 -108381 +108209 4 6 -114022 +113841 6 17 -131784 +131575 17 1943 -12654 +12634 @@ -37559,30 +37488,30 @@ ishandler -21646 +21612 block -21646 +21612 stmt_decl_bind -532224 +531383 stmt -525353 +524523 num -52 +51 decl -532224 +531383 @@ -37596,12 +37525,12 @@ 1 2 -519914 +519092 2 9 -5439 +5430 @@ -37617,12 +37546,12 @@ 1 2 -519894 +519073 2 9 -5458 +5450 @@ -37740,7 +37669,7 @@ 1 2 -532224 +531383 @@ -37756,7 +37685,7 @@ 1 2 -532224 +531383 @@ -37766,11 +37695,11 @@ stmt_decl_entry_bind -497397 +498005 stmt -453686 +454241 num @@ -37778,7 +37707,7 @@ decl_entry -473430 +474016 @@ -37792,12 +37721,12 @@ 1 2 -422156 +422673 2 274 -31529 +31568 @@ -37813,12 +37742,12 @@ 1 2 -422156 +422673 2 15 -31529 +31568 @@ -37901,12 +37830,12 @@ 1 2 -461765 +462337 2 17 -11665 +11679 @@ -37922,7 +37851,7 @@ 1 2 -473350 +473936 2 @@ -37937,15 +37866,15 @@ blockscope -1325099 +1309621 block -1325099 +1309621 enclosing -1186944 +1173021 @@ -37959,7 +37888,7 @@ 1 2 -1325099 +1309621 @@ -37975,12 +37904,12 @@ 1 2 -1106598 +1093573 2 509 -80346 +79447 @@ -37990,19 +37919,19 @@ jumpinfo -350608 +351037 id -350608 +351037 str -5907 +5914 target -81478 +81577 @@ -38016,7 +37945,7 @@ 1 2 -350608 +351037 @@ -38032,7 +37961,7 @@ 1 2 -350608 +351037 @@ -38048,7 +37977,7 @@ 2 3 -3208 +3212 3 @@ -38058,12 +37987,12 @@ 4 5 -685 +686 5 7 -486 +487 7 @@ -38073,7 +38002,7 @@ 15 181398 -271 +272 @@ -38089,17 +38018,17 @@ 1 2 -4697 +4703 2 3 -673 +674 3 12 -455 +456 12 @@ -38120,37 +38049,37 @@ 1 2 -253 +254 2 3 -19854 +19879 3 4 -7094 +7102 4 5 -3568 +3572 5 6 -38400 +38447 6 7 -10566 +10579 7 166 -1740 +1742 @@ -38166,7 +38095,7 @@ 1 2 -81478 +81577 @@ -38176,19 +38105,19 @@ preprocdirects -1323630 +1308115 id -1323630 +1308115 kind -142 +140 location -1317312 +1301872 @@ -38202,7 +38131,7 @@ 1 2 -1323630 +1308115 @@ -38218,7 +38147,7 @@ 1 2 -1323630 +1308115 @@ -38386,12 +38315,12 @@ 1 2 -1316983 +1301546 2 235 -329 +325 @@ -38407,7 +38336,7 @@ 1 2 -1317312 +1301872 @@ -38417,15 +38346,15 @@ preprocpair -378809 +374369 begin -300514 +296991 elseelifend -378809 +374369 @@ -38439,17 +38368,17 @@ 1 2 -238626 +235829 2 3 -54551 +53911 3 53 -7337 +7251 @@ -38465,7 +38394,7 @@ 1 2 -378809 +374369 @@ -38475,41 +38404,41 @@ preproctrue -166571 +164618 branch -166571 +164618 preprocfalse -119126 +117730 branch -119126 +117730 preproctext -965438 +954122 id -965438 +954122 head -463575 +458142 body -175586 +173528 @@ -38523,7 +38452,7 @@ 1 2 -965438 +954122 @@ -38539,7 +38468,7 @@ 1 2 -965438 +954122 @@ -38555,22 +38484,22 @@ 1 2 -345973 +341918 2 3 -78174 +77258 3 19 -34777 +34369 19 752 -4650 +4595 @@ -38586,12 +38515,12 @@ 1 2 -441893 +436714 2 38 -21682 +21428 @@ -38607,12 +38536,12 @@ 1 2 -165013 +163079 2 64816 -10572 +10448 @@ -38628,12 +38557,12 @@ 1 2 -166494 +164542 2 21810 -9091 +8985 @@ -38643,15 +38572,15 @@ includes -290852 +287443 id -290852 +287443 included -54606 +53966 @@ -38665,7 +38594,7 @@ 1 2 -290852 +287443 @@ -38681,37 +38610,37 @@ 1 2 -26891 +26576 2 3 -8960 +8855 3 4 -4617 +4563 4 6 -4847 +4790 6 11 -4189 +4140 11 41 -4112 +4064 41 763 -987 +975 @@ -38721,15 +38650,15 @@ link_targets -581 +574 id -581 +574 binary -581 +574 @@ -38743,7 +38672,7 @@ 1 2 -581 +574 @@ -38759,7 +38688,7 @@ 1 2 -581 +574 @@ -38769,15 +38698,15 @@ link_parent -18153711 +18584884 element -4992722 +5164827 link_target -581 +574 @@ -38791,32 +38720,32 @@ 1 2 -1493469 +1543684 2 3 -1883246 +1943264 3 4 -718850 +754223 4 6 -400876 +422385 6 29 -398156 +402680 29 45 -98124 +98589 @@ -38832,66 +38761,66 @@ 2 3 -87 +86 5 -558 +559 43 -2664 -6144 +2834 +6256 43 -6546 -8476 +6663 +8713 43 -10150 -12964 +10268 +13146 43 -13109 -20155 +13433 +20518 43 -25133 -27051 +25549 +27566 43 -27154 -32620 +27680 +33162 43 -33899 -39247 +34917 +40444 43 -41489 -42581 +42525 +46022 43 -46593 -56498 +47794 +58086 43 -56635 -133788 +58594 +139377 43 -370736 -370737 +388296 +388297 10 diff --git a/cpp/ql/test/library-tests/classes/variadic/expr.expected b/cpp/ql/test/library-tests/classes/variadic/expr.expected index a3b685781e36..eaa77968e3fd 100644 --- a/cpp/ql/test/library-tests/classes/variadic/expr.expected +++ b/cpp/ql/test/library-tests/classes/variadic/expr.expected @@ -4,3 +4,4 @@ | test.cpp:4:9:4:9 | this | | test.cpp:4:9:4:11 | call to expression | | test.cpp:10:5:10:11 | call to Foo | +| test.cpp:10:5:10:11 | temporary object | diff --git a/cpp/ql/test/library-tests/conversions/conversions.expected b/cpp/ql/test/library-tests/conversions/conversions.expected index cf7163aa5e16..14c1a1e80cf3 100644 --- a/cpp/ql/test/library-tests/conversions/conversions.expected +++ b/cpp/ql/test/library-tests/conversions/conversions.expected @@ -122,7 +122,7 @@ | conversions.cpp:179:36:179:37 | (..:: *)... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * | | conversions.cpp:180:10:180:47 | static_cast<..:: *>... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * | | conversions.cpp:180:43:180:46 | (..:: *)... | pointer-to-member derived class conversion | prval | ..:: * | ..:: * | -| conversions.cpp:190:22:190:29 | (const String)... | glvalue conversion | lval | const String | void | +| conversions.cpp:190:22:190:29 | (const String)... | glvalue conversion | lval | const String | String | | conversions.cpp:193:20:193:31 | (const Base)... | glvalue conversion | lval | const Base | Base | | conversions.cpp:193:31:193:31 | (Base)... | base class conversion | lval | Base | Middle | | conversions.cpp:193:31:193:31 | (Middle)... | base class conversion | lval | Middle | Derived | diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp index 4c8717f3c595..0ca85d29babd 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/defaulttainttracking.cpp @@ -9,7 +9,7 @@ -int main(int argc, char *argv[]) { +int main() { diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp index 3454e6ac9472..ae5d2941f258 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/stl.cpp @@ -71,9 +71,9 @@ void test_string() sink(a); // tainted sink(b); - sink(c); // tainted [NOT DETECTED] + sink(c); // tainted sink(b.c_str()); - sink(c.c_str()); // tainted [NOT DETECTED] + sink(c.c_str()); // tainted } void test_stringstream() @@ -91,12 +91,12 @@ void test_stringstream() sink(ss2); // tainted sink(ss3); // tainted [NOT DETECTED] sink(ss4); // tainted - sink(ss5); // tainted [NOT DETECTED] + sink(ss5); // tainted sink(ss1.str()); sink(ss2.str()); // tainted sink(ss3.str()); // tainted [NOT DETECTED] sink(ss4.str()); // tainted - sink(ss5.str()); // tainted [NOT DETECTED] + sink(ss5.str()); // tainted } void test_stringstream_int(int source) @@ -123,14 +123,14 @@ void sink(const char *filename, const char *mode); void test_strings2() { string path1 = user_input(); - sink(path1.c_str(), "r"); // tainted [NOT DETECTED] + sink(path1.c_str(), "r"); // tainted string path2; path2 = user_input(); sink(path2.c_str(), "r"); // tainted string path3(user_input()); - sink(path3.c_str(), "r"); // tainted [NOT DETECTED] + sink(path3.c_str(), "r"); // tainted } void test_string3() @@ -141,7 +141,7 @@ void test_string3() std::string ss(cs); sink(cs); // tainted - sink(ss); // tainted [NOT DETECTED] + sink(ss); // tainted } void test_string4() @@ -155,5 +155,5 @@ void test_string4() cs = ss.c_str(); sink(cs); // tainted [NOT DETECTED] - sink(ss); // tainted [NOT DETECTED] + sink(ss); // tainted } diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected index 5cad66e980ca..ea756d0efc5a 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/tainted.expected @@ -90,6 +90,7 @@ | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (reference dereference) | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:23 | call to getenv | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | (reference to) | +| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | temporary object | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | shared.h:5:23:5:31 | sinkparam | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:91:42:91:44 | arg | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:92:12:92:14 | arg | @@ -196,7 +197,9 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:21:29:21:29 | s | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | (unnamed parameter 0) | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:114:43:118 | (unnamed parameter 1) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:44:176:44:178 | str | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:25:62:30 | call to getenv | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:63:30:63:30 | s | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:8:68:8 | a | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:68:12:68:17 | call to source | @@ -205,6 +208,11 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:72:7:72:7 | a | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (const string)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | c | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | c | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:21 | call to source | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:23 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string | @@ -223,40 +231,63 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:6 | call to operator<< | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:10 | (reference dereference) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | t | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (const stringstream)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | ss5 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream, allocator>)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream, allocator>)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | (const basic_stringstream, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | ss5 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:118:10:118:15 | call to source | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:26 | call to user_input | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:17:125:28 | (const char *)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | path1 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:19 | call to user_input | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:24 | call to user_input | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:26 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | path3 | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:14:138:15 | cs | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:24 | call to source | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:138:19:138:26 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:18 | cs | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:143:7:143:8 | cs | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (const string)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | ss | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:14:149:15 | cs | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:24 | call to source | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:149:19:149:26 | (const char *)... | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:18 | cs | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | (const basic_string, allocator>)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | ss | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (const string)... | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (reference to) | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | ss | | test_diff.cpp:92:10:92:13 | argv | shared.h:5:23:5:31 | sinkparam | | test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:13 | argv | | test_diff.cpp:92:10:92:13 | argv | test_diff.cpp:92:10:92:16 | (const char *)... | diff --git a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected index 61f795f2b0e0..8d7963b21560 100644 --- a/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/DefaultTaintTracking/test_diff.expected @@ -12,6 +12,7 @@ | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (const char *)... | IR only | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:8:88:32 | (reference dereference) | IR only | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | (reference to) | IR only | +| defaulttainttracking.cpp:88:18:88:23 | call to getenv | defaulttainttracking.cpp:88:18:88:30 | temporary object | IR only | | defaulttainttracking.cpp:88:18:88:23 | call to getenv | shared.h:5:23:5:31 | sinkparam | IR only | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:91:31:91:33 | ret | AST only | | defaulttainttracking.cpp:97:27:97:32 | call to getenv | defaulttainttracking.cpp:92:5:92:8 | * ... | AST only | @@ -83,9 +84,16 @@ | globals.cpp:13:15:13:20 | call to getenv | globals.cpp:13:5:13:11 | global1 | AST only | | globals.cpp:23:15:23:20 | call to getenv | globals.cpp:23:5:23:11 | global2 | AST only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:43:78:43:104 | (unnamed parameter 0) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:44:176:44:178 | str | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:62:7:62:12 | source | AST only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:63:30:63:30 | s | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:64:36:64:36 | s | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:70:16:70:24 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (const string)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:74:7:74:7 | c | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:76:7:76:7 | c | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:82:16:82:24 | call to basic_string | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:6 | call to operator<< | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:85:6:85:17 | (reference dereference) | IR only | @@ -97,26 +105,49 @@ | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:9:87:16 | (const char *)... | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:18 | call to operator<< | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:87:18:87:26 | (reference dereference) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:6 | call to operator<< | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:6:88:10 | (reference dereference) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:88:9:88:9 | t | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (const stringstream)... | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | (reference to) | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:91:7:91:9 | ss2 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (const stringstream)... | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | (reference to) | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:93:7:93:9 | ss4 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (const stringstream)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:94:7:94:9 | ss5 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | (const basic_stringstream, allocator>)... | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:96:7:96:9 | ss2 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | (const basic_stringstream, allocator>)... | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:98:7:98:9 | ss4 | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | (const basic_stringstream, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:99:7:99:9 | ss5 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:117:7:117:16 | user_input | AST only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:125:16:125:28 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:126:7:126:11 | path1 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:128:9:128:13 | path2 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:129:10:129:21 | temporary object | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | (const basic_string, allocator>)... | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:130:7:130:11 | path2 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:132:15:132:27 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:133:7:133:11 | path3 | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:141:17:141:19 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (const string)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:144:7:144:8 | ss | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:152:17:152:19 | call to basic_string | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | (const basic_string, allocator>)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:155:7:155:8 | ss | IR only | | stl.cpp:62:25:62:30 | call to getenv | stl.cpp:157:7:157:8 | cs | AST only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (const string)... | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | (reference to) | IR only | +| stl.cpp:62:25:62:30 | call to getenv | stl.cpp:158:7:158:8 | ss | IR only | | test_diff.cpp:104:12:104:15 | argv | test_diff.cpp:104:11:104:20 | (...) | IR only | | test_diff.cpp:108:10:108:13 | argv | test_diff.cpp:36:24:36:24 | p | AST only | | test_diff.cpp:111:10:111:13 | argv | shared.h:5:23:5:31 | sinkparam | AST only | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass.cpp index d5745bcb7133..ee1278e0e45e 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass.cpp @@ -1,6 +1,6 @@ int source(); -void sink(...) {}; +void sink(...); class MyCopyableClass { public: diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass_declonly.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass_declonly.cpp index 67f6a45fbe7c..74b1cd1009d9 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass_declonly.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/copyableclass_declonly.cpp @@ -1,6 +1,6 @@ int source(); -void sink(...) {}; +void sink(...); class MyCopyableClassDeclOnly { public: @@ -15,7 +15,7 @@ class MyCopyableClassDeclOnly { int v; }; -void test_copyableclass() +void test_copyableclass_declonly() { { MyCopyableClassDeclOnly s1(1); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp index fbe78cf02e10..820a9ada465a 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/format.cpp @@ -30,7 +30,7 @@ int sscanf(const char *s, const char *format, ...); // ---------- int source(); -void sink(...) {}; +void sink(...); namespace string { diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected index 1b12ede33e94..b231bb9b41f9 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected @@ -262,6 +262,10 @@ | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | +| file://:0:0:0:0 | (unnamed parameter 0) | file://:0:0:0:0 | (unnamed parameter 0) | | | format.cpp:16:21:16:21 | s | format.cpp:22:22:22:22 | s | | | format.cpp:16:31:16:31 | n | format.cpp:22:25:22:25 | n | | | format.cpp:16:46:16:51 | format | format.cpp:22:28:22:33 | format | | @@ -2062,8 +2066,8 @@ | movableclass.cpp:15:3:15:13 | ... = ... | movableclass.cpp:15:9:15:9 | v [post update] | | | movableclass.cpp:15:13:15:13 | 0 | movableclass.cpp:15:3:15:13 | ... = ... | | | movableclass.cpp:16:11:16:14 | this | movableclass.cpp:16:10:16:14 | * ... | TAINT | -| movableclass.cpp:22:57:22:57 | 1 | movableclass.cpp:22:42:22:58 | call to MyMovableClass | TAINT | -| movableclass.cpp:23:55:23:60 | call to source | movableclass.cpp:23:40:23:63 | call to MyMovableClass | TAINT | +| movableclass.cpp:22:57:22:57 | 1 | movableclass.cpp:22:35:22:59 | call to MyMovableClass | TAINT | +| movableclass.cpp:23:55:23:60 | call to source | movableclass.cpp:23:33:23:64 | call to MyMovableClass | TAINT | | movableclass.cpp:28:21:28:21 | 1 | movableclass.cpp:28:21:28:22 | call to MyMovableClass | TAINT | | movableclass.cpp:28:21:28:22 | call to MyMovableClass | movableclass.cpp:33:8:33:9 | s1 | | | movableclass.cpp:29:22:29:23 | call to MyMovableClass | movableclass.cpp:34:8:34:9 | s2 | | @@ -2092,10 +2096,8 @@ | movableclass.cpp:52:8:52:31 | call to MyMovableClass | movableclass.cpp:52:3:52:4 | ref arg s2 | TAINT | | movableclass.cpp:52:8:52:31 | call to MyMovableClass | movableclass.cpp:52:6:52:6 | call to operator= | TAINT | | movableclass.cpp:52:23:52:28 | call to source | movableclass.cpp:52:8:52:31 | call to MyMovableClass | TAINT | -| movableclass.cpp:59:21:59:32 | call to getUnTainted | movableclass.cpp:59:21:59:35 | call to MyMovableClass | | -| movableclass.cpp:59:21:59:35 | call to MyMovableClass | movableclass.cpp:63:8:63:9 | s1 | | -| movableclass.cpp:60:21:60:30 | call to getTainted | movableclass.cpp:60:21:60:33 | call to MyMovableClass | | -| movableclass.cpp:60:21:60:33 | call to MyMovableClass | movableclass.cpp:64:8:64:9 | s2 | | +| movableclass.cpp:59:21:59:32 | call to getUnTainted | movableclass.cpp:63:8:63:9 | s1 | | +| movableclass.cpp:60:21:60:30 | call to getTainted | movableclass.cpp:64:8:64:9 | s2 | | | movableclass.cpp:61:18:61:19 | call to MyMovableClass | movableclass.cpp:65:8:65:9 | s3 | | | movableclass.cpp:65:13:65:18 | call to source | movableclass.cpp:65:13:65:20 | call to MyMovableClass | TAINT | | movableclass.cpp:65:13:65:20 | call to MyMovableClass | movableclass.cpp:65:8:65:9 | ref arg s3 | TAINT | @@ -3189,36 +3191,42 @@ | stl.h:292:30:292:40 | call to allocator | stl.h:292:21:292:41 | noexcept(...) | TAINT | | stl.h:292:53:292:63 | 0 | stl.h:292:46:292:64 | (no string representation) | TAINT | | stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field first | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | | stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | Unknown literal | stl.h:385:9:385:9 | constructor init of field second | TAINT | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | | stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [post-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | +| stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | | stl.h:385:9:385:9 | constructor init of field first [pre-this] | stl.h:385:9:385:9 | constructor init of field second [pre-this] | | | stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | -| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | -| stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | +| stl.h:385:9:385:9 | this | stl.h:385:9:385:9 | constructor init of field first [pre-this] | | | stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | | stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | | stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | | stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | | stl.h:392:3:392:3 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | | stl.h:392:3:392:6 | this | stl.h:392:36:392:43 | constructor init of field first [pre-this] | | -| stl.h:392:18:392:18 | x | stl.h:392:18:392:18 | x | | -| stl.h:392:18:392:18 | x | stl.h:392:18:392:18 | x | | -| stl.h:392:18:392:18 | x | stl.h:392:18:392:18 | x | | -| stl.h:392:18:392:18 | x | stl.h:392:18:392:18 | x | | -| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | | stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | | stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | | stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | | stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | | stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | | stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | -| stl.h:392:18:392:18 | x | stl.h:392:42:392:42 | x | | -| stl.h:392:31:392:31 | y | stl.h:392:31:392:31 | y | | -| stl.h:392:31:392:31 | y | stl.h:392:31:392:31 | y | | -| stl.h:392:31:392:31 | y | stl.h:392:31:392:31 | y | | -| stl.h:392:31:392:31 | y | stl.h:392:31:392:31 | y | | -| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | -| stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | | stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | | stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | | stl.h:392:31:392:31 | y | stl.h:392:53:392:53 | y | | @@ -3232,10 +3240,6 @@ | stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | | stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | | stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | -| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | -| stl.h:392:36:392:43 | constructor init of field first [post-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | -| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | -| stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | | stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | | stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | | stl.h:392:36:392:43 | constructor init of field first [pre-this] | stl.h:392:46:392:54 | constructor init of field second [pre-this] | | @@ -3247,82 +3251,64 @@ | stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | | stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | | stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | -| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | -| stl.h:392:42:392:42 | x | stl.h:392:36:392:43 | constructor init of field first | TAINT | | stl.h:392:46:392:54 | call to unknown function | stl.h:392:46:392:54 | constructor init of field second | TAINT | | stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | | stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | | stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | | stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | | stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | -| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | -| stl.h:392:53:392:53 | y | stl.h:392:46:392:54 | constructor init of field second | TAINT | -| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | | -| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | | -| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | | -| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | | -| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | | -| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | | -| stl.h:398:109:398:109 | x | stl.h:398:109:398:109 | x | | -| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | | -| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | | -| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | | -| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | | -| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | | -| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | | -| stl.h:398:109:398:109 | x | stl.h:399:40:399:40 | x | | -| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | | -| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | | -| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | | -| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | | -| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | | -| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | | -| stl.h:398:117:398:117 | y | stl.h:398:117:398:117 | y | | -| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | | -| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | | -| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | | -| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | | -| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | | -| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | | -| stl.h:398:117:398:117 | y | stl.h:399:61:399:61 | y | | -| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:10:399:63 | call to pair | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:23:399:38 | ref arg call to forward | stl.h:398:109:398:109 | x | | -| stl.h:399:23:399:38 | ref arg call to forward | stl.h:398:109:398:109 | x | | -| stl.h:399:23:399:38 | ref arg call to forward | stl.h:398:109:398:109 | x | | -| stl.h:399:23:399:38 | ref arg call to forward | stl.h:398:109:398:109 | x | | -| stl.h:399:23:399:38 | ref arg call to forward | stl.h:399:40:399:40 | x [inner post update] | | -| stl.h:399:23:399:38 | ref arg call to forward | stl.h:399:40:399:40 | x [inner post update] | | -| stl.h:399:23:399:38 | ref arg call to forward | stl.h:399:40:399:40 | x [inner post update] | | -| stl.h:399:23:399:38 | ref arg call to forward | stl.h:399:40:399:40 | x [inner post update] | | -| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | | -| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | | -| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | | -| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | | -| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | | -| stl.h:399:40:399:40 | x | stl.h:399:23:399:38 | call to forward | | -| stl.h:399:44:399:59 | call to forward | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:44:399:59 | call to forward | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:44:399:59 | ref arg call to forward | stl.h:398:117:398:117 | y | | -| stl.h:399:44:399:59 | ref arg call to forward | stl.h:398:117:398:117 | y | | -| stl.h:399:44:399:59 | ref arg call to forward | stl.h:398:117:398:117 | y | | -| stl.h:399:44:399:59 | ref arg call to forward | stl.h:398:117:398:117 | y | | -| stl.h:399:44:399:59 | ref arg call to forward | stl.h:399:61:399:61 | y [inner post update] | | -| stl.h:399:44:399:59 | ref arg call to forward | stl.h:399:61:399:61 | y [inner post update] | | -| stl.h:399:44:399:59 | ref arg call to forward | stl.h:399:61:399:61 | y [inner post update] | | -| stl.h:399:44:399:59 | ref arg call to forward | stl.h:399:61:399:61 | y [inner post update] | | -| stl.h:399:61:399:61 | y | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:61:399:61 | y | stl.h:399:10:399:63 | call to pair | TAINT | -| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | | -| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | | -| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | | -| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | | -| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | | -| stl.h:399:61:399:61 | y | stl.h:399:44:399:59 | call to forward | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:398:87:398:87 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:87:398:87 | x | stl.h:399:58:399:58 | x | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:398:95:398:95 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:398:95:398:95 | y | stl.h:399:79:399:79 | y | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:58:399:58 | x | stl.h:399:41:399:56 | call to forward | | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:62:399:77 | call to forward | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:3:399:82 | call to pair | TAINT | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | +| stl.h:399:79:399:79 | y | stl.h:399:62:399:77 | call to forward | | | string.cpp:25:12:25:17 | call to source | string.cpp:29:7:29:7 | a | | | string.cpp:26:16:26:20 | 123 | string.cpp:26:16:26:21 | call to basic_string | TAINT | | string.cpp:26:16:26:21 | call to basic_string | string.cpp:30:7:30:7 | b | | @@ -5060,16 +5046,10 @@ | swap1.cpp:56:30:56:34 | data1 | swap1.cpp:56:18:56:22 | ref arg data1 | | | swap1.cpp:61:22:61:22 | x | swap1.cpp:61:22:61:22 | x | | | swap1.cpp:61:22:61:22 | x | swap1.cpp:63:9:63:9 | x | | -| swap1.cpp:61:22:61:22 | x | swap2.cpp:61:22:61:22 | x | | -| swap1.cpp:61:22:61:22 | x | swap2.cpp:63:9:63:9 | x | | | swap1.cpp:61:32:61:32 | y | swap1.cpp:61:32:61:32 | y | | | swap1.cpp:61:32:61:32 | y | swap1.cpp:63:16:63:16 | y | | -| swap1.cpp:61:32:61:32 | y | swap2.cpp:61:32:61:32 | y | | -| swap1.cpp:61:32:61:32 | y | swap2.cpp:63:16:63:16 | y | | | swap1.cpp:63:9:63:9 | ref arg x | swap1.cpp:61:22:61:22 | x | | -| swap1.cpp:63:9:63:9 | ref arg x | swap2.cpp:61:22:61:22 | x | | | swap1.cpp:63:16:63:16 | ref arg y | swap1.cpp:61:32:61:32 | y | | -| swap1.cpp:63:16:63:16 | ref arg y | swap2.cpp:61:32:61:32 | y | | | swap1.cpp:69:23:69:23 | x | swap1.cpp:71:5:71:5 | x | | | swap1.cpp:69:23:69:23 | x | swap1.cpp:73:10:73:10 | x | | | swap1.cpp:69:23:69:23 | x | swap1.cpp:76:9:76:9 | x | | @@ -5230,17 +5210,11 @@ | swap2.cpp:56:50:56:53 | that | swap2.cpp:56:43:56:47 | ref arg data2 | | | swap2.cpp:56:50:56:53 | that [post update] | swap2.cpp:53:26:53:29 | that | | | swap2.cpp:56:55:56:59 | data2 | swap2.cpp:56:43:56:47 | ref arg data2 | | -| swap2.cpp:61:22:61:22 | x | swap1.cpp:61:22:61:22 | x | | -| swap2.cpp:61:22:61:22 | x | swap1.cpp:63:9:63:9 | x | | | swap2.cpp:61:22:61:22 | x | swap2.cpp:61:22:61:22 | x | | | swap2.cpp:61:22:61:22 | x | swap2.cpp:63:9:63:9 | x | | -| swap2.cpp:61:32:61:32 | y | swap1.cpp:61:32:61:32 | y | | -| swap2.cpp:61:32:61:32 | y | swap1.cpp:63:16:63:16 | y | | | swap2.cpp:61:32:61:32 | y | swap2.cpp:61:32:61:32 | y | | | swap2.cpp:61:32:61:32 | y | swap2.cpp:63:16:63:16 | y | | -| swap2.cpp:63:9:63:9 | ref arg x | swap1.cpp:61:22:61:22 | x | | | swap2.cpp:63:9:63:9 | ref arg x | swap2.cpp:61:22:61:22 | x | | -| swap2.cpp:63:16:63:16 | ref arg y | swap1.cpp:61:32:61:32 | y | | | swap2.cpp:63:16:63:16 | ref arg y | swap2.cpp:61:32:61:32 | y | | | swap2.cpp:69:23:69:23 | x | swap2.cpp:71:5:71:5 | x | | | swap2.cpp:69:23:69:23 | x | swap2.cpp:73:10:73:10 | x | | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp index 6b4d32f074f4..cf02b3fa967d 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/map.cpp @@ -2,9 +2,9 @@ #include "stl.h" using namespace std; - +namespace { char *source(); - +} void sink(char *); void sink(const char *); void sink(bool); @@ -84,10 +84,10 @@ void test_pair() sink(make_pair("123", "456").first); sink(make_pair("123", "456").second); sink(make_pair(source(), "456")); // tainted [NOT DETECTED] - sink(make_pair(source(), "456").first); // tainted [NOT DETECTED] + sink(make_pair(source(), "456").first); // tainted sink(make_pair(source(), "456").second); sink(make_pair("123", source())); // tainted - sink(make_pair("123", source()).first); // [FALSE POSITIVE] + sink(make_pair("123", source()).first); sink(make_pair("123", source()).second); // tainted std::pair, char *> m; diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp index c0003388307a..7f121bb27c9e 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/movableclass.cpp @@ -19,10 +19,10 @@ class MyMovableClass { int v; }; -MyMovableClass &&getUnTainted() { return MyMovableClass(1); } -MyMovableClass &&getTainted() { return MyMovableClass(source()); } +MyMovableClass getUnTainted() { return MyMovableClass(1); } +MyMovableClass getTainted() { return MyMovableClass(source()); } -void test_copyableclass() +void test_movableclass() { { MyMovableClass s1(1); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp index bcc764e35730..f6feee3711ae 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/set.cpp @@ -2,9 +2,9 @@ #include "stl.h" using namespace std; - +namespace { char *source(); - +} void sink(char *); void sink(std::set); void sink(std::set::iterator); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/stl.h b/cpp/ql/test/library-tests/dataflow/taint-tests/stl.h index 10266fc23fc5..35b1e66c2a80 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/stl.h +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/stl.h @@ -1,28 +1,28 @@ typedef unsigned long size_t; -template -struct remove_const { typedef T type; }; -template -struct remove_const { typedef T type; }; -// `remove_const_t` removes any `const` specifier from `T` -template -using remove_const_t = typename remove_const::type; -template -struct remove_reference { typedef T type; }; -template -struct remove_reference { typedef T type; }; -template -struct remove_reference { typedef T type; }; -// `remove_reference_t` removes any `&` from `T` -template -using remove_reference_t = typename remove_reference::type; + + + + + + + + + + + + + + + +#include "type_traits.h" namespace std { @@ -395,8 +395,8 @@ namespace std { void swap(pair& p) /*noexcept(...)*/; }; - template constexpr pair, remove_reference_t> make_pair(T1&& x, T2&& y) { - return pair(std::forward(x), std::forward(y)); + template constexpr pair, decay_t> make_pair(T1&& x, T2&& y) { + return pair, decay_t>(std::forward(x), std::forward(y)); } } diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp index 6a0bf47e4d7d..3c56fcb5f05d 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/string.cpp @@ -2,9 +2,9 @@ #include "stl.h" using namespace std; - +namespace { char *source(); - +} namespace ns_char { char source(); @@ -499,7 +499,7 @@ void test_string_iterator_methods() } } -void test_constructors_more() { +void test_string_constructors_more() { char *cs1 = "abc"; char *cs2 = source(); std::string s1(cs1); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp index e700bccb9300..5414f976a374 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/stringstream.cpp @@ -2,9 +2,9 @@ #include "stl.h" using namespace std; - +namespace { char *source(); - +} namespace ns_char { char source(); diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/structlikeclass.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/structlikeclass.cpp index 727a0fff53b9..e4d54bb264da 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/structlikeclass.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/structlikeclass.cpp @@ -1,6 +1,6 @@ int source(); -void sink(...) {}; +void sink(...); class StructLikeClass { public: diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp index 7ba05b86f729..b8a73d9520f7 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/swap1.cpp @@ -13,7 +13,7 @@ namespace std template T &&move(T &t) noexcept { return static_cast(t); } // simplified signature (and implementation) } // namespace std - +namespace Swap1 { namespace IntWrapper { struct Class @@ -84,7 +84,7 @@ void test_copy_assignment_operator() swap(z1, z2); - sink(z2.data1); // tainted [FALSE NEGATIVE in IR] + sink(z2.data1); // tainted sink(z1.data1); // clean [FALSE POSITIVE] } @@ -144,3 +144,5 @@ void test_move_assignment_method() sink(y.data1); // tainted sink(x.data1); // tainted } + +} diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp index e5203f344f2e..d55f3a33dfdb 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/swap2.cpp @@ -13,7 +13,7 @@ namespace std template T &&move(T &t) noexcept { return static_cast(t); } // simplified signature (and implementation) } // namespace std - +namespace Swap2 { namespace IntWrapper { struct Class @@ -84,7 +84,7 @@ void test_copy_assignment_operator() swap(z1, z2); - sink(z2.data1); // tainted [FALSE NEGATIVE in IR] + sink(z2.data1); // tainted sink(z1.data1); // clean [FALSE POSITIVE] } @@ -144,3 +144,5 @@ void test_move_assignment_method() sink(y.data1); // tainted sink(x.data1); // tainted } + +} diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp index f5406ea82423..fe187330f3e1 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp @@ -1,5 +1,5 @@ int source(); -void sink(...) {}; +void sink(...); void arithAssignments(int source1, int clean1) { sink(clean1); // clean diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected index dfd9c810a062..fb54a993bd54 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.expected @@ -48,7 +48,9 @@ | map.cpp:77:9:77:14 | second | map.cpp:66:37:66:42 | call to source | | map.cpp:78:7:78:7 | k | map.cpp:66:37:66:42 | call to source | | map.cpp:81:7:81:7 | l | map.cpp:66:37:66:42 | call to source | +| map.cpp:87:34:87:38 | first | map.cpp:87:17:87:22 | call to source | | map.cpp:89:7:89:32 | call to pair | map.cpp:89:24:89:29 | call to source | +| map.cpp:91:34:91:39 | second | map.cpp:91:24:91:29 | call to source | | map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source | | map.cpp:112:10:112:25 | call to insert_or_assign | map.cpp:112:46:112:51 | call to source | | map.cpp:114:7:114:8 | call to map | map.cpp:108:39:108:44 | call to source | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected index 65076e7a571f..3e10cf54d335 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_diff.expected @@ -15,7 +15,6 @@ | arrayassignment.cpp:146:7:146:13 | arrayassignment.cpp:144:12:144:17 | IR only | | copyableclass.cpp:67:11:67:11 | copyableclass.cpp:67:13:67:18 | AST only | | copyableclass.cpp:67:11:67:21 | copyableclass.cpp:67:13:67:18 | IR only | -| copyableclass_declonly.cpp:42:8:42:9 | copyableclass_declonly.cpp:34:30:34:35 | AST only | | copyableclass_declonly.cpp:67:11:67:11 | copyableclass_declonly.cpp:67:13:67:18 | AST only | | map.cpp:49:9:49:13 | map.cpp:48:37:48:42 | IR only | | map.cpp:54:9:54:13 | map.cpp:48:37:48:42 | IR only | @@ -27,22 +26,8 @@ | map.cpp:79:9:79:13 | map.cpp:66:37:66:42 | IR only | | map.cpp:80:9:80:14 | map.cpp:66:37:66:42 | IR only | | map.cpp:90:34:90:38 | map.cpp:90:24:90:29 | IR only | -| map.cpp:91:34:91:39 | map.cpp:91:24:91:29 | IR only | | map.cpp:108:7:108:54 | map.cpp:108:39:108:44 | IR only | | map.cpp:111:7:111:48 | map.cpp:111:34:111:39 | IR only | -| map.cpp:114:7:114:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:116:7:116:8 | map.cpp:110:62:110:67 | AST only | -| map.cpp:117:7:117:8 | map.cpp:111:34:111:39 | AST only | -| map.cpp:118:7:118:8 | map.cpp:112:46:112:51 | AST only | -| map.cpp:123:10:123:13 | map.cpp:111:34:111:39 | AST only | -| map.cpp:124:10:124:13 | map.cpp:112:46:112:51 | AST only | -| map.cpp:129:10:129:13 | map.cpp:111:34:111:39 | AST only | -| map.cpp:130:10:130:13 | map.cpp:112:46:112:51 | AST only | -| map.cpp:137:7:137:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:138:7:138:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:139:7:139:8 | map.cpp:108:39:108:44 | AST only | -| map.cpp:140:10:140:13 | map.cpp:108:39:108:44 | AST only | -| map.cpp:141:10:141:13 | map.cpp:108:39:108:44 | AST only | | map.cpp:155:12:155:16 | map.cpp:108:39:108:44 | IR only | | map.cpp:156:12:156:17 | map.cpp:108:39:108:44 | IR only | | map.cpp:161:12:161:16 | map.cpp:108:39:108:44 | IR only | @@ -52,44 +37,10 @@ | map.cpp:184:7:184:31 | map.cpp:108:39:108:44 | IR only | | map.cpp:185:7:185:32 | map.cpp:108:39:108:44 | IR only | | map.cpp:187:7:187:32 | map.cpp:108:39:108:44 | IR only | -| map.cpp:193:7:193:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:196:7:196:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:199:7:199:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:200:7:200:9 | map.cpp:191:49:191:54 | AST only | -| map.cpp:201:7:201:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:202:7:202:9 | map.cpp:192:49:192:54 | AST only | -| map.cpp:210:7:210:9 | map.cpp:206:49:206:54 | AST only | -| map.cpp:213:7:213:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:216:7:216:9 | map.cpp:206:49:206:54 | AST only | -| map.cpp:218:7:218:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:219:7:219:9 | map.cpp:209:49:209:54 | AST only | -| map.cpp:225:7:225:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:225:7:225:9 | map.cpp:224:49:224:54 | AST only | -| map.cpp:227:7:227:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:227:7:227:9 | map.cpp:224:49:224:54 | AST only | -| map.cpp:229:7:229:9 | map.cpp:223:49:223:54 | AST only | -| map.cpp:229:7:229:9 | map.cpp:224:49:224:54 | AST only | | map.cpp:235:7:235:40 | map.cpp:235:26:235:31 | IR only | -| map.cpp:236:7:236:9 | map.cpp:235:26:235:31 | AST only | -| map.cpp:240:7:240:9 | map.cpp:239:44:239:49 | AST only | | map.cpp:246:7:246:44 | map.cpp:246:30:246:35 | IR only | -| map.cpp:247:7:247:9 | map.cpp:246:30:246:35 | AST only | -| map.cpp:251:7:251:9 | map.cpp:250:43:250:48 | AST only | | map.cpp:260:7:260:54 | map.cpp:260:39:260:44 | IR only | | map.cpp:263:7:263:48 | map.cpp:263:34:263:39 | IR only | -| map.cpp:266:7:266:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:268:7:268:8 | map.cpp:262:62:262:67 | AST only | -| map.cpp:269:7:269:8 | map.cpp:263:34:263:39 | AST only | -| map.cpp:270:7:270:8 | map.cpp:264:46:264:51 | AST only | -| map.cpp:275:10:275:13 | map.cpp:263:34:263:39 | AST only | -| map.cpp:276:10:276:13 | map.cpp:264:46:264:51 | AST only | -| map.cpp:281:10:281:13 | map.cpp:263:34:263:39 | AST only | -| map.cpp:282:10:282:13 | map.cpp:264:46:264:51 | AST only | -| map.cpp:289:7:289:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:290:7:290:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:291:7:291:8 | map.cpp:260:39:260:44 | AST only | -| map.cpp:292:10:292:13 | map.cpp:260:39:260:44 | AST only | -| map.cpp:293:10:293:13 | map.cpp:260:39:260:44 | AST only | | map.cpp:307:12:307:16 | map.cpp:260:39:260:44 | IR only | | map.cpp:308:12:308:17 | map.cpp:260:39:260:44 | IR only | | map.cpp:313:12:313:16 | map.cpp:260:39:260:44 | IR only | @@ -99,105 +50,25 @@ | map.cpp:334:7:334:31 | map.cpp:260:39:260:44 | IR only | | map.cpp:335:7:335:32 | map.cpp:260:39:260:44 | IR only | | map.cpp:336:7:336:32 | map.cpp:260:39:260:44 | IR only | -| map.cpp:342:7:342:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:345:7:345:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:348:7:348:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:349:7:349:9 | map.cpp:340:49:340:54 | AST only | -| map.cpp:350:7:350:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:351:7:351:9 | map.cpp:341:49:341:54 | AST only | -| map.cpp:359:7:359:9 | map.cpp:355:49:355:54 | AST only | -| map.cpp:362:7:362:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:365:7:365:9 | map.cpp:355:49:355:54 | AST only | -| map.cpp:367:7:367:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:368:7:368:9 | map.cpp:358:49:358:54 | AST only | -| map.cpp:374:7:374:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:374:7:374:9 | map.cpp:373:49:373:54 | AST only | -| map.cpp:376:7:376:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:376:7:376:9 | map.cpp:373:49:373:54 | AST only | -| map.cpp:378:7:378:9 | map.cpp:372:49:372:54 | AST only | -| map.cpp:378:7:378:9 | map.cpp:373:49:373:54 | AST only | | map.cpp:384:7:384:40 | map.cpp:384:26:384:31 | IR only | -| map.cpp:385:7:385:9 | map.cpp:384:26:384:31 | AST only | -| map.cpp:389:7:389:9 | map.cpp:388:44:388:49 | AST only | | map.cpp:396:7:396:44 | map.cpp:396:30:396:35 | IR only | +| map.cpp:397:40:397:45 | map.cpp:396:30:396:35 | IR only | | map.cpp:397:40:397:45 | map.cpp:397:30:397:35 | IR only | -| map.cpp:398:7:398:9 | map.cpp:396:30:396:35 | AST only | -| map.cpp:398:7:398:9 | map.cpp:397:30:397:35 | AST only | -| map.cpp:402:7:402:9 | map.cpp:401:43:401:48 | AST only | -| map.cpp:417:7:417:9 | map.cpp:416:30:416:35 | AST only | | map.cpp:418:7:418:16 | map.cpp:416:30:416:35 | AST only | -| map.cpp:420:7:420:9 | map.cpp:419:33:419:38 | AST only | | map.cpp:421:7:421:16 | map.cpp:419:33:419:38 | AST only | | map.cpp:431:7:431:67 | map.cpp:431:52:431:57 | IR only | -| map.cpp:432:7:432:9 | map.cpp:431:52:431:57 | AST only | | movableclass.cpp:65:11:65:11 | movableclass.cpp:65:13:65:18 | AST only | | movableclass.cpp:65:11:65:21 | movableclass.cpp:65:13:65:18 | IR only | | set.cpp:20:7:20:31 | set.cpp:20:17:20:22 | IR only | -| set.cpp:26:7:26:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:28:7:28:8 | set.cpp:22:29:22:34 | AST only | -| set.cpp:30:7:30:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:44:7:44:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:45:7:45:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:46:7:46:8 | set.cpp:20:17:20:22 | AST only | -| set.cpp:47:7:47:9 | set.cpp:20:17:20:22 | AST only | -| set.cpp:48:10:48:13 | set.cpp:20:17:20:22 | AST only | -| set.cpp:49:10:49:13 | set.cpp:20:17:20:22 | AST only | | set.cpp:61:8:61:11 | set.cpp:20:17:20:22 | IR only | | set.cpp:71:7:71:32 | set.cpp:67:13:67:18 | IR only | | set.cpp:72:7:72:33 | set.cpp:67:13:67:18 | IR only | -| set.cpp:78:7:78:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:81:7:81:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:84:7:84:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:85:7:85:9 | set.cpp:76:13:76:18 | AST only | -| set.cpp:86:7:86:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:87:7:87:9 | set.cpp:77:13:77:18 | AST only | -| set.cpp:95:7:95:9 | set.cpp:91:13:91:18 | AST only | -| set.cpp:98:7:98:9 | set.cpp:94:13:94:18 | AST only | -| set.cpp:101:7:101:9 | set.cpp:91:13:91:18 | AST only | -| set.cpp:103:7:103:9 | set.cpp:94:13:94:18 | AST only | -| set.cpp:104:7:104:9 | set.cpp:94:13:94:18 | AST only | -| set.cpp:110:7:110:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:110:7:110:9 | set.cpp:109:13:109:18 | AST only | -| set.cpp:112:7:112:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:112:7:112:9 | set.cpp:109:13:109:18 | AST only | -| set.cpp:114:7:114:9 | set.cpp:108:13:108:18 | AST only | -| set.cpp:114:7:114:9 | set.cpp:109:13:109:18 | AST only | | set.cpp:120:7:120:33 | set.cpp:120:19:120:24 | IR only | -| set.cpp:121:7:121:9 | set.cpp:120:19:120:24 | AST only | -| set.cpp:125:7:125:9 | set.cpp:124:37:124:42 | AST only | | set.cpp:134:7:134:31 | set.cpp:134:17:134:22 | IR only | -| set.cpp:140:7:140:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:142:7:142:8 | set.cpp:136:29:136:34 | AST only | -| set.cpp:144:7:144:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:158:7:158:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:159:7:159:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:160:7:160:8 | set.cpp:134:17:134:22 | AST only | -| set.cpp:161:7:161:9 | set.cpp:134:17:134:22 | AST only | -| set.cpp:162:10:162:13 | set.cpp:134:17:134:22 | AST only | -| set.cpp:163:10:163:13 | set.cpp:134:17:134:22 | AST only | | set.cpp:175:8:175:11 | set.cpp:134:17:134:22 | IR only | | set.cpp:183:7:183:32 | set.cpp:181:13:181:18 | IR only | | set.cpp:184:7:184:33 | set.cpp:181:13:181:18 | IR only | -| set.cpp:190:7:190:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:193:7:193:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:196:7:196:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:197:7:197:9 | set.cpp:188:13:188:18 | AST only | -| set.cpp:198:7:198:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:199:7:199:9 | set.cpp:189:13:189:18 | AST only | -| set.cpp:207:7:207:9 | set.cpp:203:13:203:18 | AST only | -| set.cpp:210:7:210:9 | set.cpp:206:13:206:18 | AST only | -| set.cpp:213:7:213:9 | set.cpp:203:13:203:18 | AST only | -| set.cpp:215:7:215:9 | set.cpp:206:13:206:18 | AST only | -| set.cpp:216:7:216:9 | set.cpp:206:13:206:18 | AST only | -| set.cpp:222:7:222:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:222:7:222:9 | set.cpp:221:13:221:18 | AST only | -| set.cpp:224:7:224:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:224:7:224:9 | set.cpp:221:13:221:18 | AST only | -| set.cpp:226:7:226:9 | set.cpp:220:13:220:18 | AST only | -| set.cpp:226:7:226:9 | set.cpp:221:13:221:18 | AST only | | set.cpp:232:7:232:33 | set.cpp:232:19:232:24 | IR only | -| set.cpp:233:7:233:9 | set.cpp:232:19:232:24 | AST only | -| set.cpp:237:7:237:9 | set.cpp:236:37:236:42 | AST only | | smart_pointer.cpp:12:10:12:10 | smart_pointer.cpp:11:52:11:57 | AST only | | smart_pointer.cpp:24:10:24:10 | smart_pointer.cpp:23:52:23:57 | AST only | | standalone_iterators.cpp:41:10:41:10 | standalone_iterators.cpp:39:45:39:51 | AST only | @@ -211,6 +82,10 @@ | string.cpp:46:13:46:17 | string.cpp:14:10:14:15 | AST only | | string.cpp:70:7:70:8 | string.cpp:62:19:62:24 | AST only | | string.cpp:126:8:126:11 | string.cpp:120:16:120:21 | IR only | +| string.cpp:145:8:145:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:146:8:146:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:147:8:147:14 | string.cpp:142:18:142:23 | IR only | +| string.cpp:150:8:150:20 | string.cpp:150:13:150:18 | IR only | | string.cpp:162:11:162:11 | string.cpp:155:18:155:23 | AST only | | string.cpp:166:11:166:11 | string.cpp:166:14:166:19 | AST only | | string.cpp:167:11:167:11 | string.cpp:166:14:166:19 | AST only | @@ -223,6 +98,7 @@ | string.cpp:247:10:247:16 | string.cpp:234:17:234:22 | AST only | | string.cpp:251:10:251:16 | string.cpp:235:11:235:25 | AST only | | string.cpp:312:9:312:12 | string.cpp:309:16:309:21 | AST only | +| string.cpp:323:7:323:29 | string.cpp:320:16:320:21 | IR only | | string.cpp:340:7:340:7 | string.cpp:336:9:336:23 | AST only | | string.cpp:341:7:341:7 | string.cpp:337:12:337:26 | AST only | | string.cpp:342:7:342:7 | string.cpp:336:9:336:23 | AST only | @@ -231,8 +107,8 @@ | string.cpp:363:11:363:16 | string.cpp:358:18:358:23 | AST only | | string.cpp:382:8:382:14 | string.cpp:374:18:374:23 | IR only | | string.cpp:383:13:383:15 | string.cpp:374:18:374:23 | IR only | -| string.cpp:396:8:396:8 | string.cpp:389:18:389:23 | AST only | -| string.cpp:397:8:397:8 | string.cpp:389:18:389:23 | AST only | +| string.cpp:396:8:396:15 | string.cpp:389:18:389:23 | IR only | +| string.cpp:397:8:397:15 | string.cpp:389:18:389:23 | IR only | | string.cpp:399:8:399:8 | string.cpp:389:18:389:23 | AST only | | string.cpp:401:8:401:8 | string.cpp:389:18:389:23 | AST only | | string.cpp:404:8:404:11 | string.cpp:389:18:389:23 | IR only | @@ -241,9 +117,7 @@ | string.cpp:411:8:411:8 | string.cpp:389:18:389:23 | AST only | | string.cpp:415:8:415:11 | string.cpp:389:18:389:23 | IR only | | string.cpp:418:8:418:8 | string.cpp:389:18:389:23 | AST only | -| string.cpp:419:8:419:10 | string.cpp:389:18:389:23 | AST only | | string.cpp:421:8:421:8 | string.cpp:389:18:389:23 | AST only | -| string.cpp:422:8:422:10 | string.cpp:389:18:389:23 | AST only | | string.cpp:436:10:436:15 | string.cpp:431:14:431:19 | AST only | | string.cpp:449:10:449:15 | string.cpp:449:32:449:46 | AST only | | string.cpp:462:10:462:15 | string.cpp:457:18:457:23 | AST only | @@ -268,7 +142,9 @@ | stringstream.cpp:35:11:35:11 | stringstream.cpp:29:16:29:21 | AST only | | stringstream.cpp:39:7:39:9 | stringstream.cpp:33:23:33:28 | AST only | | stringstream.cpp:41:7:41:9 | stringstream.cpp:29:16:29:21 | AST only | +| stringstream.cpp:43:7:43:15 | stringstream.cpp:32:14:32:19 | IR only | | stringstream.cpp:44:11:44:13 | stringstream.cpp:33:23:33:28 | AST only | +| stringstream.cpp:45:7:45:15 | stringstream.cpp:34:14:34:19 | IR only | | stringstream.cpp:46:11:46:13 | stringstream.cpp:29:16:29:21 | AST only | | stringstream.cpp:56:11:56:13 | stringstream.cpp:56:15:56:29 | AST only | | stringstream.cpp:57:44:57:46 | stringstream.cpp:57:25:57:39 | AST only | @@ -278,6 +154,7 @@ | stringstream.cpp:67:7:67:10 | stringstream.cpp:64:36:64:41 | AST only | | stringstream.cpp:76:11:76:11 | stringstream.cpp:70:32:70:37 | AST only | | stringstream.cpp:78:11:78:11 | stringstream.cpp:70:32:70:37 | AST only | +| stringstream.cpp:83:7:83:15 | stringstream.cpp:70:32:70:37 | IR only | | stringstream.cpp:100:11:100:11 | stringstream.cpp:100:31:100:36 | AST only | | stringstream.cpp:143:11:143:22 | stringstream.cpp:143:14:143:19 | IR only | | stringstream.cpp:146:11:146:11 | stringstream.cpp:143:14:143:19 | AST only | @@ -307,13 +184,13 @@ | stringstream.cpp:266:62:266:66 | stringstream.cpp:266:41:266:46 | AST only | | stringstream.cpp:267:7:267:9 | stringstream.cpp:266:41:266:46 | AST only | | swap1.cpp:78:12:78:16 | swap1.cpp:69:23:69:23 | AST only | -| swap1.cpp:87:13:87:17 | swap1.cpp:82:16:82:21 | AST only | | swap1.cpp:88:13:88:17 | swap1.cpp:81:27:81:28 | AST only | | swap1.cpp:102:12:102:16 | swap1.cpp:93:23:93:23 | AST only | | swap1.cpp:115:18:115:22 | swap1.cpp:108:23:108:31 | AST only | | swap1.cpp:129:12:129:16 | swap1.cpp:120:23:120:23 | AST only | | swap1.cpp:144:12:144:16 | swap1.cpp:135:23:135:23 | AST only | | swap2.cpp:78:12:78:16 | swap2.cpp:69:23:69:23 | AST only | +| swap2.cpp:87:13:87:17 | swap2.cpp:82:16:82:21 | IR only | | swap2.cpp:88:13:88:17 | swap2.cpp:81:27:81:28 | AST only | | swap2.cpp:102:12:102:16 | swap2.cpp:93:23:93:23 | AST only | | swap2.cpp:115:18:115:22 | swap2.cpp:108:23:108:31 | AST only | @@ -358,7 +235,6 @@ | vector.cpp:171:13:171:13 | vector.cpp:170:14:170:19 | AST only | | vector.cpp:180:13:180:13 | vector.cpp:179:14:179:19 | AST only | | vector.cpp:201:13:201:13 | vector.cpp:200:14:200:19 | AST only | -| vector.cpp:261:8:261:9 | vector.cpp:239:15:239:20 | AST only | | vector.cpp:286:10:286:13 | vector.cpp:284:15:284:20 | AST only | | vector.cpp:287:7:287:18 | vector.cpp:284:15:284:20 | AST only | | vector.cpp:290:7:290:8 | vector.cpp:289:17:289:30 | AST only | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected index b9402f216a74..5ba1707dd76c 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_ir.expected @@ -26,6 +26,7 @@ | copyableclass.cpp:67:11:67:21 | (reference dereference) | copyableclass.cpp:67:13:67:18 | call to source | | copyableclass_declonly.cpp:40:8:40:9 | s1 | copyableclass_declonly.cpp:34:30:34:35 | call to source | | copyableclass_declonly.cpp:41:8:41:9 | s2 | copyableclass_declonly.cpp:35:32:35:37 | call to source | +| copyableclass_declonly.cpp:42:8:42:9 | s3 | copyableclass_declonly.cpp:34:30:34:35 | call to source | | copyableclass_declonly.cpp:43:8:43:9 | s4 | copyableclass_declonly.cpp:38:8:38:13 | call to source | | copyableclass_declonly.cpp:65:8:65:9 | s1 | copyableclass_declonly.cpp:60:56:60:61 | call to source | | copyableclass_declonly.cpp:66:8:66:9 | s2 | copyableclass_declonly.cpp:63:32:63:37 | call to source | @@ -66,6 +67,7 @@ | map.cpp:79:9:79:13 | first | map.cpp:66:37:66:42 | call to source | | map.cpp:80:9:80:14 | second | map.cpp:66:37:66:42 | call to source | | map.cpp:81:7:81:7 | l | map.cpp:66:37:66:42 | call to source | +| map.cpp:87:34:87:38 | first | map.cpp:87:17:87:22 | call to source | | map.cpp:89:7:89:32 | call to pair | map.cpp:89:24:89:29 | call to source | | map.cpp:90:34:90:38 | first | map.cpp:90:24:90:29 | call to source | | map.cpp:91:34:91:39 | second | map.cpp:91:24:91:29 | call to source | @@ -73,10 +75,23 @@ | map.cpp:110:10:110:15 | call to insert | map.cpp:110:62:110:67 | call to source | | map.cpp:111:7:111:48 | call to iterator | map.cpp:111:34:111:39 | call to source | | map.cpp:112:10:112:25 | call to insert_or_assign | map.cpp:112:46:112:51 | call to source | +| map.cpp:114:7:114:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:116:7:116:8 | call to map | map.cpp:110:62:110:67 | call to source | +| map.cpp:117:7:117:8 | call to map | map.cpp:111:34:111:39 | call to source | +| map.cpp:118:7:118:8 | call to map | map.cpp:112:46:112:51 | call to source | | map.cpp:120:10:120:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:122:10:122:13 | call to find | map.cpp:110:62:110:67 | call to source | +| map.cpp:123:10:123:13 | call to find | map.cpp:111:34:111:39 | call to source | +| map.cpp:124:10:124:13 | call to find | map.cpp:112:46:112:51 | call to source | | map.cpp:126:10:126:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:128:10:128:13 | call to find | map.cpp:110:62:110:67 | call to source | +| map.cpp:129:10:129:13 | call to find | map.cpp:111:34:111:39 | call to source | +| map.cpp:130:10:130:13 | call to find | map.cpp:112:46:112:51 | call to source | +| map.cpp:137:7:137:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:138:7:138:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:139:7:139:8 | call to map | map.cpp:108:39:108:44 | call to source | +| map.cpp:140:10:140:13 | call to find | map.cpp:108:39:108:44 | call to source | +| map.cpp:141:10:141:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:142:10:142:13 | call to find | map.cpp:108:39:108:44 | call to source | | map.cpp:154:8:154:10 | call to pair | map.cpp:108:39:108:44 | call to source | | map.cpp:155:12:155:16 | first | map.cpp:108:39:108:44 | call to source | @@ -91,20 +106,54 @@ | map.cpp:185:7:185:32 | call to iterator | map.cpp:108:39:108:44 | call to source | | map.cpp:186:10:186:20 | call to upper_bound | map.cpp:108:39:108:44 | call to source | | map.cpp:187:7:187:32 | call to iterator | map.cpp:108:39:108:44 | call to source | +| map.cpp:193:7:193:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:196:7:196:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:199:7:199:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:200:7:200:9 | call to map | map.cpp:191:49:191:54 | call to source | +| map.cpp:201:7:201:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:202:7:202:9 | call to map | map.cpp:192:49:192:54 | call to source | +| map.cpp:210:7:210:9 | call to map | map.cpp:206:49:206:54 | call to source | +| map.cpp:213:7:213:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:216:7:216:9 | call to map | map.cpp:206:49:206:54 | call to source | +| map.cpp:218:7:218:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:219:7:219:9 | call to map | map.cpp:209:49:209:54 | call to source | +| map.cpp:225:7:225:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:225:7:225:9 | call to map | map.cpp:224:49:224:54 | call to source | | map.cpp:226:11:226:15 | call to erase | map.cpp:223:49:223:54 | call to source | | map.cpp:226:11:226:15 | call to erase | map.cpp:224:49:224:54 | call to source | +| map.cpp:227:7:227:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:227:7:227:9 | call to map | map.cpp:224:49:224:54 | call to source | +| map.cpp:229:7:229:9 | call to map | map.cpp:223:49:223:54 | call to source | +| map.cpp:229:7:229:9 | call to map | map.cpp:224:49:224:54 | call to source | | map.cpp:235:7:235:40 | call to iterator | map.cpp:235:26:235:31 | call to source | +| map.cpp:236:7:236:9 | call to map | map.cpp:235:26:235:31 | call to source | | map.cpp:239:11:239:22 | call to emplace_hint | map.cpp:239:44:239:49 | call to source | +| map.cpp:240:7:240:9 | call to map | map.cpp:239:44:239:49 | call to source | | map.cpp:246:7:246:44 | call to iterator | map.cpp:246:30:246:35 | call to source | +| map.cpp:247:7:247:9 | call to map | map.cpp:246:30:246:35 | call to source | | map.cpp:250:11:250:21 | call to try_emplace | map.cpp:250:43:250:48 | call to source | +| map.cpp:251:7:251:9 | call to map | map.cpp:250:43:250:48 | call to source | | map.cpp:260:7:260:54 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:262:10:262:15 | call to insert | map.cpp:262:62:262:67 | call to source | | map.cpp:263:7:263:48 | call to iterator | map.cpp:263:34:263:39 | call to source | | map.cpp:264:10:264:25 | call to insert_or_assign | map.cpp:264:46:264:51 | call to source | +| map.cpp:266:7:266:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:268:7:268:8 | call to unordered_map | map.cpp:262:62:262:67 | call to source | +| map.cpp:269:7:269:8 | call to unordered_map | map.cpp:263:34:263:39 | call to source | +| map.cpp:270:7:270:8 | call to unordered_map | map.cpp:264:46:264:51 | call to source | | map.cpp:272:10:272:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:274:10:274:13 | call to find | map.cpp:262:62:262:67 | call to source | +| map.cpp:275:10:275:13 | call to find | map.cpp:263:34:263:39 | call to source | +| map.cpp:276:10:276:13 | call to find | map.cpp:264:46:264:51 | call to source | | map.cpp:278:10:278:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:280:10:280:13 | call to find | map.cpp:262:62:262:67 | call to source | +| map.cpp:281:10:281:13 | call to find | map.cpp:263:34:263:39 | call to source | +| map.cpp:282:10:282:13 | call to find | map.cpp:264:46:264:51 | call to source | +| map.cpp:289:7:289:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:290:7:290:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:291:7:291:8 | call to unordered_map | map.cpp:260:39:260:44 | call to source | +| map.cpp:292:10:292:13 | call to find | map.cpp:260:39:260:44 | call to source | +| map.cpp:293:10:293:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:294:10:294:13 | call to find | map.cpp:260:39:260:44 | call to source | | map.cpp:306:8:306:10 | call to pair | map.cpp:260:39:260:44 | call to source | | map.cpp:307:12:307:16 | first | map.cpp:260:39:260:44 | call to source | @@ -116,16 +165,42 @@ | map.cpp:334:7:334:31 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:335:7:335:32 | call to iterator | map.cpp:260:39:260:44 | call to source | | map.cpp:336:7:336:32 | call to iterator | map.cpp:260:39:260:44 | call to source | +| map.cpp:342:7:342:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:345:7:345:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:348:7:348:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:349:7:349:9 | call to unordered_map | map.cpp:340:49:340:54 | call to source | +| map.cpp:350:7:350:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:351:7:351:9 | call to unordered_map | map.cpp:341:49:341:54 | call to source | +| map.cpp:359:7:359:9 | call to unordered_map | map.cpp:355:49:355:54 | call to source | +| map.cpp:362:7:362:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:365:7:365:9 | call to unordered_map | map.cpp:355:49:355:54 | call to source | +| map.cpp:367:7:367:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:368:7:368:9 | call to unordered_map | map.cpp:358:49:358:54 | call to source | +| map.cpp:374:7:374:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:374:7:374:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | | map.cpp:375:11:375:15 | call to erase | map.cpp:372:49:372:54 | call to source | | map.cpp:375:11:375:15 | call to erase | map.cpp:373:49:373:54 | call to source | +| map.cpp:376:7:376:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:376:7:376:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | +| map.cpp:378:7:378:9 | call to unordered_map | map.cpp:372:49:372:54 | call to source | +| map.cpp:378:7:378:9 | call to unordered_map | map.cpp:373:49:373:54 | call to source | | map.cpp:384:7:384:40 | call to iterator | map.cpp:384:26:384:31 | call to source | +| map.cpp:385:7:385:9 | call to unordered_map | map.cpp:384:26:384:31 | call to source | | map.cpp:388:11:388:22 | call to emplace_hint | map.cpp:388:44:388:49 | call to source | +| map.cpp:389:7:389:9 | call to unordered_map | map.cpp:388:44:388:49 | call to source | | map.cpp:396:7:396:44 | call to iterator | map.cpp:396:30:396:35 | call to source | +| map.cpp:397:40:397:45 | second | map.cpp:396:30:396:35 | call to source | | map.cpp:397:40:397:45 | second | map.cpp:397:30:397:35 | call to source | +| map.cpp:398:7:398:9 | call to unordered_map | map.cpp:396:30:396:35 | call to source | +| map.cpp:398:7:398:9 | call to unordered_map | map.cpp:397:30:397:35 | call to source | | map.cpp:401:11:401:21 | call to try_emplace | map.cpp:401:43:401:48 | call to source | +| map.cpp:402:7:402:9 | call to unordered_map | map.cpp:401:43:401:48 | call to source | | map.cpp:416:7:416:41 | call to pair | map.cpp:416:30:416:35 | call to source | +| map.cpp:417:7:417:9 | call to unordered_map | map.cpp:416:30:416:35 | call to source | | map.cpp:419:7:419:41 | call to pair | map.cpp:419:33:419:38 | call to source | +| map.cpp:420:7:420:9 | call to unordered_map | map.cpp:419:33:419:38 | call to source | | map.cpp:431:7:431:67 | call to iterator | map.cpp:431:52:431:57 | call to source | +| map.cpp:432:7:432:9 | call to unordered_map | map.cpp:431:52:431:57 | call to source | | map.cpp:433:11:433:22 | call to emplace_hint | map.cpp:431:52:431:57 | call to source | | movableclass.cpp:44:8:44:9 | s1 | movableclass.cpp:39:21:39:26 | call to source | | movableclass.cpp:45:8:45:9 | s2 | movableclass.cpp:40:23:40:28 | call to source | @@ -136,9 +211,18 @@ | movableclass.cpp:65:11:65:21 | (reference dereference) | movableclass.cpp:65:13:65:18 | call to source | | set.cpp:20:7:20:31 | call to iterator | set.cpp:20:17:20:22 | call to source | | set.cpp:22:10:22:15 | call to insert | set.cpp:22:29:22:34 | call to source | +| set.cpp:26:7:26:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:28:7:28:8 | call to set | set.cpp:22:29:22:34 | call to source | +| set.cpp:30:7:30:8 | call to set | set.cpp:20:17:20:22 | call to source | | set.cpp:32:10:32:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:34:10:34:13 | call to find | set.cpp:22:29:22:34 | call to source | | set.cpp:36:10:36:13 | call to find | set.cpp:20:17:20:22 | call to source | +| set.cpp:44:7:44:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:45:7:45:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:46:7:46:8 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:47:7:47:9 | call to set | set.cpp:20:17:20:22 | call to source | +| set.cpp:48:10:48:13 | call to find | set.cpp:20:17:20:22 | call to source | +| set.cpp:49:10:49:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:50:10:50:13 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:51:11:51:14 | call to find | set.cpp:20:17:20:22 | call to source | | set.cpp:61:8:61:8 | call to operator* | set.cpp:20:17:20:22 | call to source | @@ -147,25 +231,72 @@ | set.cpp:70:11:70:21 | call to upper_bound | set.cpp:67:13:67:18 | call to source | | set.cpp:71:7:71:32 | call to iterator | set.cpp:67:13:67:18 | call to source | | set.cpp:72:7:72:33 | call to iterator | set.cpp:67:13:67:18 | call to source | +| set.cpp:78:7:78:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:81:7:81:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:84:7:84:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:85:7:85:9 | call to set | set.cpp:76:13:76:18 | call to source | +| set.cpp:86:7:86:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:87:7:87:9 | call to set | set.cpp:77:13:77:18 | call to source | +| set.cpp:95:7:95:9 | call to set | set.cpp:91:13:91:18 | call to source | +| set.cpp:98:7:98:9 | call to set | set.cpp:94:13:94:18 | call to source | +| set.cpp:101:7:101:9 | call to set | set.cpp:91:13:91:18 | call to source | +| set.cpp:103:7:103:9 | call to set | set.cpp:94:13:94:18 | call to source | +| set.cpp:104:7:104:9 | call to set | set.cpp:94:13:94:18 | call to source | +| set.cpp:110:7:110:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:110:7:110:9 | call to set | set.cpp:109:13:109:18 | call to source | | set.cpp:111:11:111:15 | call to erase | set.cpp:108:13:108:18 | call to source | | set.cpp:111:11:111:15 | call to erase | set.cpp:109:13:109:18 | call to source | +| set.cpp:112:7:112:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:112:7:112:9 | call to set | set.cpp:109:13:109:18 | call to source | +| set.cpp:114:7:114:9 | call to set | set.cpp:108:13:108:18 | call to source | +| set.cpp:114:7:114:9 | call to set | set.cpp:109:13:109:18 | call to source | | set.cpp:120:7:120:33 | call to iterator | set.cpp:120:19:120:24 | call to source | +| set.cpp:121:7:121:9 | call to set | set.cpp:120:19:120:24 | call to source | | set.cpp:124:11:124:22 | call to emplace_hint | set.cpp:124:37:124:42 | call to source | +| set.cpp:125:7:125:9 | call to set | set.cpp:124:37:124:42 | call to source | | set.cpp:134:7:134:31 | call to iterator | set.cpp:134:17:134:22 | call to source | | set.cpp:136:10:136:15 | call to insert | set.cpp:136:29:136:34 | call to source | +| set.cpp:140:7:140:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:142:7:142:8 | call to unordered_set | set.cpp:136:29:136:34 | call to source | +| set.cpp:144:7:144:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | | set.cpp:146:10:146:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:148:10:148:13 | call to find | set.cpp:136:29:136:34 | call to source | | set.cpp:150:10:150:13 | call to find | set.cpp:134:17:134:22 | call to source | +| set.cpp:158:7:158:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:159:7:159:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:160:7:160:8 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:161:7:161:9 | call to unordered_set | set.cpp:134:17:134:22 | call to source | +| set.cpp:162:10:162:13 | call to find | set.cpp:134:17:134:22 | call to source | +| set.cpp:163:10:163:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:164:10:164:13 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:165:11:165:14 | call to find | set.cpp:134:17:134:22 | call to source | | set.cpp:175:8:175:8 | call to operator* | set.cpp:134:17:134:22 | call to source | | set.cpp:175:8:175:11 | (reference dereference) | set.cpp:134:17:134:22 | call to source | | set.cpp:183:7:183:32 | call to iterator | set.cpp:181:13:181:18 | call to source | | set.cpp:184:7:184:33 | call to iterator | set.cpp:181:13:181:18 | call to source | +| set.cpp:190:7:190:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:193:7:193:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:196:7:196:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:197:7:197:9 | call to unordered_set | set.cpp:188:13:188:18 | call to source | +| set.cpp:198:7:198:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:199:7:199:9 | call to unordered_set | set.cpp:189:13:189:18 | call to source | +| set.cpp:207:7:207:9 | call to unordered_set | set.cpp:203:13:203:18 | call to source | +| set.cpp:210:7:210:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source | +| set.cpp:213:7:213:9 | call to unordered_set | set.cpp:203:13:203:18 | call to source | +| set.cpp:215:7:215:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source | +| set.cpp:216:7:216:9 | call to unordered_set | set.cpp:206:13:206:18 | call to source | +| set.cpp:222:7:222:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:222:7:222:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | | set.cpp:223:11:223:15 | call to erase | set.cpp:220:13:220:18 | call to source | | set.cpp:223:11:223:15 | call to erase | set.cpp:221:13:221:18 | call to source | +| set.cpp:224:7:224:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:224:7:224:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | +| set.cpp:226:7:226:9 | call to unordered_set | set.cpp:220:13:220:18 | call to source | +| set.cpp:226:7:226:9 | call to unordered_set | set.cpp:221:13:221:18 | call to source | | set.cpp:232:7:232:33 | call to iterator | set.cpp:232:19:232:24 | call to source | +| set.cpp:233:7:233:9 | call to unordered_set | set.cpp:232:19:232:24 | call to source | | set.cpp:236:11:236:22 | call to emplace_hint | set.cpp:236:37:236:42 | call to source | +| set.cpp:237:7:237:9 | call to unordered_set | set.cpp:236:37:236:42 | call to source | | smart_pointer.cpp:13:10:13:10 | Argument 0 indirection | smart_pointer.cpp:11:52:11:57 | call to source | | smart_pointer.cpp:25:10:25:10 | Argument 0 indirection | smart_pointer.cpp:23:52:23:57 | call to source | | smart_pointer.cpp:52:12:52:14 | call to get | smart_pointer.cpp:51:52:51:57 | call to source | @@ -189,9 +320,13 @@ | string.cpp:130:8:130:8 | c | string.cpp:120:16:120:21 | call to source | | string.cpp:135:8:135:8 | (reference dereference) | string.cpp:133:28:133:33 | call to source | | string.cpp:135:8:135:8 | c | string.cpp:133:28:133:33 | call to source | +| string.cpp:145:8:145:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:145:11:145:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:146:8:146:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:146:11:146:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:147:8:147:14 | Argument 0 indirection | string.cpp:142:18:142:23 | call to source | | string.cpp:147:11:147:11 | call to operator+ | string.cpp:142:18:142:23 | call to source | +| string.cpp:150:8:150:20 | Argument 0 indirection | string.cpp:150:13:150:18 | call to source | | string.cpp:150:11:150:11 | call to operator+ | string.cpp:150:13:150:18 | call to source | | string.cpp:159:8:159:9 | Argument 0 indirection | string.cpp:155:18:155:23 | call to source | | string.cpp:163:8:163:9 | Argument 0 indirection | string.cpp:155:18:155:23 | call to source | @@ -220,18 +355,25 @@ | string.cpp:295:7:295:8 | Argument 0 indirection | string.cpp:291:17:291:22 | call to source | | string.cpp:301:7:301:8 | Argument 0 indirection | string.cpp:289:17:289:22 | call to source | | string.cpp:303:7:303:8 | Argument 0 indirection | string.cpp:291:17:291:22 | call to source | +| string.cpp:323:7:323:29 | Argument 0 indirection | string.cpp:320:16:320:21 | call to source | | string.cpp:323:9:323:14 | call to substr | string.cpp:320:16:320:21 | call to source | | string.cpp:364:8:364:9 | Argument 0 indirection | string.cpp:358:18:358:23 | call to source | | string.cpp:382:8:382:8 | call to operator* | string.cpp:374:18:374:23 | call to source | | string.cpp:382:8:382:14 | (reference dereference) | string.cpp:374:18:374:23 | call to source | | string.cpp:383:13:383:13 | call to operator[] | string.cpp:374:18:374:23 | call to source | | string.cpp:383:13:383:15 | (reference dereference) | string.cpp:374:18:374:23 | call to source | +| string.cpp:396:8:396:8 | call to operator* | string.cpp:389:18:389:23 | call to source | +| string.cpp:396:8:396:15 | (reference dereference) | string.cpp:389:18:389:23 | call to source | +| string.cpp:397:8:397:8 | call to operator* | string.cpp:389:18:389:23 | call to source | +| string.cpp:397:8:397:15 | (reference dereference) | string.cpp:389:18:389:23 | call to source | | string.cpp:404:8:404:8 | call to operator* | string.cpp:389:18:389:23 | call to source | | string.cpp:404:8:404:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source | | string.cpp:407:8:407:8 | call to operator* | string.cpp:389:18:389:23 | call to source | | string.cpp:407:8:407:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source | | string.cpp:415:8:415:8 | call to operator* | string.cpp:389:18:389:23 | call to source | | string.cpp:415:8:415:11 | (reference dereference) | string.cpp:389:18:389:23 | call to source | +| string.cpp:419:8:419:10 | call to iterator | string.cpp:389:18:389:23 | call to source | +| string.cpp:422:8:422:10 | call to iterator | string.cpp:389:18:389:23 | call to source | | string.cpp:437:7:437:8 | Argument 0 indirection | string.cpp:431:14:431:19 | call to source | | string.cpp:450:8:450:8 | Argument 0 indirection | string.cpp:449:32:449:46 | call to source | | string.cpp:463:8:463:8 | Argument 0 indirection | string.cpp:457:18:457:23 | call to source | @@ -254,13 +396,16 @@ | stringstream.cpp:34:23:34:31 | (reference dereference) | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:38:7:38:9 | Argument 0 indirection | stringstream.cpp:32:14:32:19 | call to source | | stringstream.cpp:40:7:40:9 | Argument 0 indirection | stringstream.cpp:34:14:34:19 | call to source | +| stringstream.cpp:43:7:43:15 | Argument 0 indirection | stringstream.cpp:32:14:32:19 | call to source | | stringstream.cpp:43:11:43:13 | call to str | stringstream.cpp:32:14:32:19 | call to source | +| stringstream.cpp:45:7:45:15 | Argument 0 indirection | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:45:11:45:13 | call to str | stringstream.cpp:34:14:34:19 | call to source | | stringstream.cpp:52:7:52:9 | Argument 0 indirection | stringstream.cpp:49:10:49:15 | call to source | | stringstream.cpp:53:7:53:9 | Argument 0 indirection | stringstream.cpp:50:10:50:15 | call to source | | stringstream.cpp:59:7:59:9 | Argument 0 indirection | stringstream.cpp:56:15:56:29 | call to source | | stringstream.cpp:66:7:66:10 | Argument 0 indirection | stringstream.cpp:63:18:63:23 | call to source | | stringstream.cpp:81:7:81:9 | Argument 0 indirection | stringstream.cpp:70:32:70:37 | source | +| stringstream.cpp:83:7:83:15 | Argument 0 indirection | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:83:11:83:13 | call to str | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:85:7:85:8 | v2 | stringstream.cpp:70:32:70:37 | source | | stringstream.cpp:103:7:103:9 | Argument 0 indirection | stringstream.cpp:91:19:91:24 | call to source | @@ -274,10 +419,15 @@ | stringstream.cpp:143:11:143:22 | (reference dereference) | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:149:7:149:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:150:7:150:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:157:7:157:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:157:7:157:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:158:7:158:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:158:7:158:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:168:7:168:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:168:7:168:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:170:7:170:8 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:170:7:170:8 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | +| stringstream.cpp:172:7:172:9 | Argument 0 indirection | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:172:7:172:9 | call to basic_string | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:175:7:175:20 | ... = ... | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:177:7:177:21 | ... = ... | stringstream.cpp:143:14:143:19 | call to source | @@ -285,16 +435,22 @@ | stringstream.cpp:183:7:183:8 | c4 | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:185:7:185:8 | c6 | stringstream.cpp:143:14:143:19 | call to source | | stringstream.cpp:197:10:197:12 | call to get | stringstream.cpp:196:18:196:32 | call to source | +| stringstream.cpp:219:7:219:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:219:7:219:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:220:7:220:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:220:7:220:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:227:7:227:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:227:7:227:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:228:7:228:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:228:7:228:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:231:7:231:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:231:7:231:8 | call to basic_string | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:239:7:239:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:240:7:240:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:247:7:247:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:248:7:248:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | | stringstream.cpp:251:7:251:8 | Argument 0 indirection | stringstream.cpp:203:24:203:29 | call to source | +| stringstream.cpp:263:7:263:8 | Argument 0 indirection | stringstream.cpp:257:24:257:29 | call to source | | stringstream.cpp:263:7:263:8 | call to basic_string | stringstream.cpp:257:24:257:29 | call to source | | structlikeclass.cpp:35:8:35:9 | s1 | structlikeclass.cpp:29:22:29:27 | call to source | | structlikeclass.cpp:36:8:36:9 | s2 | structlikeclass.cpp:30:24:30:29 | call to source | @@ -307,6 +463,7 @@ | swap1.cpp:78:12:78:16 | data1 | swap1.cpp:71:15:71:20 | call to source | | swap1.cpp:79:12:79:16 | data1 | swap1.cpp:71:15:71:20 | call to source | | swap1.cpp:83:13:83:17 | data1 | swap1.cpp:82:16:82:21 | call to source | +| swap1.cpp:87:13:87:17 | data1 | swap1.cpp:82:16:82:21 | call to source | | swap1.cpp:88:13:88:17 | data1 | swap1.cpp:82:16:82:21 | call to source | | swap1.cpp:97:12:97:16 | data1 | swap1.cpp:95:15:95:20 | call to source | | swap1.cpp:102:12:102:16 | data1 | swap1.cpp:95:15:95:20 | call to source | @@ -323,6 +480,7 @@ | swap2.cpp:78:12:78:16 | data1 | swap2.cpp:71:15:71:20 | call to source | | swap2.cpp:79:12:79:16 | data1 | swap2.cpp:71:15:71:20 | call to source | | swap2.cpp:83:13:83:17 | data1 | swap2.cpp:82:16:82:21 | call to source | +| swap2.cpp:87:13:87:17 | data1 | swap2.cpp:82:16:82:21 | call to source | | swap2.cpp:88:13:88:17 | data1 | swap2.cpp:82:16:82:21 | call to source | | swap2.cpp:97:12:97:16 | data1 | swap2.cpp:95:15:95:20 | call to source | | swap2.cpp:102:12:102:16 | data1 | swap2.cpp:95:15:95:20 | call to source | @@ -408,6 +566,7 @@ | vector.cpp:258:8:258:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:259:8:259:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:260:8:260:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | +| vector.cpp:261:8:261:9 | Argument 0 indirection | vector.cpp:239:15:239:20 | call to source | | vector.cpp:273:8:273:9 | Argument 0 indirection | vector.cpp:269:18:269:31 | call to source | | vector.cpp:274:8:274:9 | Argument 0 indirection | vector.cpp:270:18:270:35 | call to source | | vector.cpp:275:8:275:9 | Argument 0 indirection | vector.cpp:271:18:271:34 | call to source | diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/type_traits.h b/cpp/ql/test/library-tests/dataflow/taint-tests/type_traits.h new file mode 100644 index 000000000000..448b6e85acb9 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/type_traits.h @@ -0,0 +1,35 @@ +template +struct remove_const { typedef T type; }; + +template +struct remove_const { typedef T type; }; + +// `remove_const_t` removes any `const` specifier from `T` +template +using remove_const_t = typename remove_const::type; + +template +struct remove_reference { typedef T type; }; + +template +struct remove_reference { typedef T type; }; + +template +struct remove_reference { typedef T type; }; + +// `remove_reference_t` removes any `&` from `T` +template +using remove_reference_t = typename remove_reference::type; + +template +struct decay_impl { + typedef T type; +}; + +template +struct decay_impl { + typedef T* type; +}; + +template +using decay_t = typename decay_impl>::type; diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp index b15bf5ea0d2a..33dc31fc60a1 100644 --- a/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp +++ b/cpp/ql/test/library-tests/dataflow/taint-tests/vector.cpp @@ -312,7 +312,7 @@ void test_vector_insert() { sink(d); // tainted } -void test_constructors_more() { +void test_vector_constructors_more() { std::vector v1; std::vector v2; v2.push_back(source()); diff --git a/cpp/ql/test/library-tests/exprs/unevaluated/unevaluated.expected b/cpp/ql/test/library-tests/exprs/unevaluated/unevaluated.expected index 6015065b4f70..7eaeb6879ec0 100644 --- a/cpp/ql/test/library-tests/exprs/unevaluated/unevaluated.expected +++ b/cpp/ql/test/library-tests/exprs/unevaluated/unevaluated.expected @@ -13,3 +13,4 @@ | test.cpp:42:11:42:11 | x | | test.cpp:57:9:57:9 | 4 | | test.cpp:63:9:63:19 | call to getAVirtual | +| test.cpp:63:9:63:21 | temporary object | diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 5bc52587faae..44d379e46fef 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -6014,6 +6014,9 @@ ir.cpp: # 716| Type = [TemplateParameter] T # 716| Value = [Literal] 0 # 716| ValueCategory = prvalue +# 716| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 716| Type = [TemplateParameter] T +# 716| ValueCategory = prvalue(load) # 715| [MemberFunction,TemplateFunction] long Outer::Func(U, V) # 715| : # 715| getParameter(0): [Parameter] x @@ -6032,6 +6035,9 @@ ir.cpp: # 716| Type = [LongType] long # 716| Value = [Literal] 0 # 716| ValueCategory = prvalue +# 716| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 716| Type = [LongType] long +# 716| ValueCategory = prvalue(load) # 720| [TopLevelFunction] double CallNestedTemplateFunc() # 720| : # 720| getEntryPoint(): [BlockStmt] { ... } @@ -6694,6 +6700,9 @@ ir.cpp: # 809| Conversion = [GlvalueConversion] glvalue conversion # 809| Type = [SpecifiedType] const Base # 809| ValueCategory = lvalue +# 809| getExpr(): [TemporaryObjectExpr] temporary object +# 809| Type = [Struct,VirtualBaseClass] Base +# 809| ValueCategory = lvalue # 809| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 809| Type = [Struct,VirtualBaseClass] Base # 809| ValueCategory = lvalue @@ -6724,6 +6733,9 @@ ir.cpp: # 810| Conversion = [GlvalueConversion] glvalue conversion # 810| Type = [SpecifiedType] const Base # 810| ValueCategory = lvalue +# 810| getExpr(): [TemporaryObjectExpr] temporary object +# 810| Type = [Struct,VirtualBaseClass] Base +# 810| ValueCategory = lvalue # 810| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 810| Type = [Struct,VirtualBaseClass] Base # 810| ValueCategory = lvalue @@ -6928,6 +6940,9 @@ ir.cpp: # 823| Conversion = [GlvalueConversion] glvalue conversion # 823| Type = [SpecifiedType] const Base # 823| ValueCategory = lvalue +# 823| getExpr(): [TemporaryObjectExpr] temporary object +# 823| Type = [Struct,VirtualBaseClass] Base +# 823| ValueCategory = lvalue # 823| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 823| Type = [Struct,VirtualBaseClass] Base # 823| ValueCategory = lvalue @@ -6962,6 +6977,9 @@ ir.cpp: # 824| Conversion = [GlvalueConversion] glvalue conversion # 824| Type = [SpecifiedType] const Base # 824| ValueCategory = lvalue +# 824| getExpr(): [TemporaryObjectExpr] temporary object +# 824| Type = [Struct,VirtualBaseClass] Base +# 824| ValueCategory = lvalue # 824| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) # 824| Type = [Struct,VirtualBaseClass] Base # 824| ValueCategory = lvalue @@ -7248,16 +7266,16 @@ ir.cpp: # 850| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b # 850| Type = [Struct] PolymorphicBase # 850| getVariable().getInitializer(): [Initializer] initializer for b -#-----| getExpr(): [ConstructorCall] call to PolymorphicBase -#-----| Type = [VoidType] void -#-----| ValueCategory = prvalue +# 850| getExpr(): [ConstructorCall] call to PolymorphicBase +# 850| Type = [VoidType] void +# 850| ValueCategory = prvalue # 851| getStmt(1): [DeclStmt] declaration # 851| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d # 851| Type = [Struct] PolymorphicDerived # 851| getVariable().getInitializer(): [Initializer] initializer for d -#-----| getExpr(): [ConstructorCall] call to PolymorphicDerived -#-----| Type = [VoidType] void -#-----| ValueCategory = prvalue +# 851| getExpr(): [ConstructorCall] call to PolymorphicDerived +# 851| Type = [VoidType] void +# 851| ValueCategory = prvalue # 853| getStmt(2): [DeclStmt] declaration # 853| getDeclarationEntry(0): [VariableDeclarationEntry] definition of pb # 853| Type = [PointerType] PolymorphicBase * @@ -9677,7 +9695,7 @@ ir.cpp: # 1178| getEntryPoint(): [BlockStmt] { ... } # 1179| getStmt(0): [ReturnStmt] return ... # 1179| getExpr(): [ConstructorCall] call to String -# 1179| Type = [Struct] String +# 1179| Type = [VoidType] void # 1179| ValueCategory = prvalue # 1179| getArgument(0): foo # 1179| Type = [ArrayType] const char[4] @@ -10555,6 +10573,752 @@ ir.cpp: # 1322| Type = [VoidPointerType] void * # 1322| ValueCategory = prvalue # 1323| getStmt(1): [ReturnStmt] return ... +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] Point defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [Literal] 0 +# 1327| Type = [Struct] Point +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] String defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [ConstructorCall] call to String +# 1327| Type = [VoidType] void +# 1327| ValueCategory = prvalue +# 1326| [TemplateFunction,TopLevelFunction] T defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [Literal] 0 +# 1327| Type = [TemplateParameter] T +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue +# 1327| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1327| Type = [TemplateParameter] T +# 1327| ValueCategory = prvalue(load) +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [ConstructorCall] call to copy_constructor +# 1327| Type = [VoidType] void +# 1327| ValueCategory = prvalue +# 1326| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only defaultConstruct() +# 1326| : +# 1326| getEntryPoint(): [BlockStmt] { ... } +# 1327| getStmt(0): [ReturnStmt] return ... +# 1327| getExpr(): [Literal] 0 +# 1327| Type = [Class] destructor_only +# 1327| Value = [Literal] 0 +# 1327| ValueCategory = prvalue +# 1330| [CopyAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only const&) +# 1330| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const constructor_only & +# 1330| [MoveAssignmentOperator] constructor_only& constructor_only::operator=(constructor_only&&) +# 1330| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] constructor_only && +# 1330| [CopyConstructor] void constructor_only::constructor_only(constructor_only const&) +# 1330| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const constructor_only & +# 1330| [MoveConstructor] void constructor_only::constructor_only(constructor_only&&) +# 1330| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] constructor_only && +# 1335| [ConversionConstructor] void constructor_only::constructor_only(int) +# 1335| : +# 1335| getParameter(0): [Parameter] x +# 1335| Type = [IntType] int +# 1338| [CopyAssignmentOperator] copy_constructor& copy_constructor::operator=(copy_constructor const&) +# 1338| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const copy_constructor & +# 1343| [Constructor] void copy_constructor::copy_constructor() +# 1343| : +# 1344| [CopyConstructor] void copy_constructor::copy_constructor(copy_constructor const&) +# 1344| : +# 1344| getParameter(0): [Parameter] (unnamed parameter 0) +# 1344| Type = [LValueReferenceType] const copy_constructor & +# 1346| [MemberFunction] void copy_constructor::method() +# 1346| : +# 1349| [CopyAssignmentOperator] destructor_only& destructor_only::operator=(destructor_only const&) +# 1349| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const destructor_only & +# 1349| [Constructor] void destructor_only::destructor_only() +# 1349| : +# 1351| [Destructor] void destructor_only::~destructor_only() +# 1351| : +# 1353| [MemberFunction] void destructor_only::method() +# 1353| : +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(Point const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const Point & +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(String const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const String & +# 1357| [TemplateFunction,TopLevelFunction] void acceptRef(T const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const T & +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(copy_constructor const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const copy_constructor & +# 1357| [FunctionTemplateInstantiation,TopLevelFunction] void acceptRef(destructor_only const&) +# 1357| : +# 1357| getParameter(0): [Parameter] v +# 1357| Type = [LValueReferenceType] const destructor_only & +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(Point) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [Struct] Point +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(String) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [Struct] String +# 1360| [TemplateFunction,TopLevelFunction] void acceptValue(T) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [TemplateParameter] T +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(copy_constructor) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [Class] copy_constructor +# 1360| [FunctionTemplateInstantiation,TopLevelFunction] void acceptValue(destructor_only) +# 1360| : +# 1360| getParameter(0): [Parameter] v +# 1360| Type = [Class] destructor_only +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] POD_Derived returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] POD_Middle returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] Point returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] String returnValue() +# 1363| : +# 1363| [TemplateFunction,TopLevelFunction] T returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] UnusualFields returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] copy_constructor returnValue() +# 1363| : +# 1363| [FunctionTemplateInstantiation,TopLevelFunction] destructor_only returnValue() +# 1363| : +# 1365| [TopLevelFunction] void temporary_string() +# 1365| : +# 1365| getEntryPoint(): [BlockStmt] { ... } +# 1366| getStmt(0): [DeclStmt] declaration +# 1366| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 1366| Type = [Struct] String +# 1366| getVariable().getInitializer(): [Initializer] initializer for s +# 1366| getExpr(): [FunctionCall] call to returnValue +# 1366| Type = [Struct] String +# 1366| ValueCategory = prvalue +# 1367| getStmt(1): [DeclStmt] declaration +# 1367| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rs +# 1367| Type = [LValueReferenceType] const String & +# 1367| getVariable().getInitializer(): [Initializer] initializer for rs +# 1367| getExpr(): [FunctionCall] call to returnValue +# 1367| Type = [Struct] String +# 1367| ValueCategory = prvalue +# 1367| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1367| Type = [LValueReferenceType] const String & +# 1367| ValueCategory = prvalue +# 1367| getExpr(): [CStyleCast] (const String)... +# 1367| Conversion = [GlvalueConversion] glvalue conversion +# 1367| Type = [SpecifiedType] const String +# 1367| ValueCategory = lvalue +# 1367| getExpr(): [TemporaryObjectExpr] temporary object +# 1367| Type = [Struct] String +# 1367| ValueCategory = lvalue +# 1369| getStmt(2): [ExprStmt] ExprStmt +# 1369| getExpr(): [FunctionCall] call to acceptRef +# 1369| Type = [VoidType] void +# 1369| ValueCategory = prvalue +# 1369| getArgument(0): [VariableAccess] s +# 1369| Type = [Struct] String +# 1369| ValueCategory = lvalue +# 1369| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1369| Type = [LValueReferenceType] const String & +# 1369| ValueCategory = prvalue +# 1369| getExpr(): [CStyleCast] (const String)... +# 1369| Conversion = [GlvalueConversion] glvalue conversion +# 1369| Type = [SpecifiedType] const String +# 1369| ValueCategory = lvalue +# 1370| getStmt(3): [ExprStmt] ExprStmt +# 1370| getExpr(): [FunctionCall] call to acceptRef +# 1370| Type = [VoidType] void +# 1370| ValueCategory = prvalue +# 1370| getArgument(0): [ConstructorCall] call to String +# 1370| Type = [VoidType] void +# 1370| ValueCategory = prvalue +# 1370| getArgument(0): foo +# 1370| Type = [ArrayType] const char[4] +# 1370| Value = [StringLiteral] "foo" +# 1370| ValueCategory = lvalue +# 1370| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1370| Type = [PointerType] const char * +# 1370| ValueCategory = prvalue +# 1370| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1370| Type = [LValueReferenceType] const String & +# 1370| ValueCategory = prvalue +# 1370| getExpr(): [TemporaryObjectExpr] temporary object +# 1370| Type = [SpecifiedType] const String +# 1370| ValueCategory = lvalue +# 1371| getStmt(4): [ExprStmt] ExprStmt +# 1371| getExpr(): [FunctionCall] call to acceptValue +# 1371| Type = [VoidType] void +# 1371| ValueCategory = prvalue +# 1371| getArgument(0): [ConstructorCall] call to String +# 1371| Type = [VoidType] void +# 1371| ValueCategory = prvalue +# 1371| getArgument(0): [VariableAccess] s +# 1371| Type = [Struct] String +# 1371| ValueCategory = lvalue +# 1371| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1371| Type = [LValueReferenceType] const String & +# 1371| ValueCategory = prvalue +# 1371| getExpr(): [CStyleCast] (const String)... +# 1371| Conversion = [GlvalueConversion] glvalue conversion +# 1371| Type = [SpecifiedType] const String +# 1371| ValueCategory = lvalue +# 1371| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1371| Type = [Struct] String +# 1371| ValueCategory = lvalue +# 1372| getStmt(5): [ExprStmt] ExprStmt +# 1372| getExpr(): [FunctionCall] call to acceptValue +# 1372| Type = [VoidType] void +# 1372| ValueCategory = prvalue +# 1372| getArgument(0): [ConstructorCall] call to String +# 1372| Type = [VoidType] void +# 1372| ValueCategory = prvalue +# 1372| getArgument(0): foo +# 1372| Type = [ArrayType] const char[4] +# 1372| Value = [StringLiteral] "foo" +# 1372| ValueCategory = lvalue +# 1372| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1372| Type = [PointerType] const char * +# 1372| ValueCategory = prvalue +# 1372| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1372| Type = [Struct] String +# 1372| ValueCategory = lvalue +# 1373| getStmt(6): [ExprStmt] ExprStmt +# 1373| getExpr(): [FunctionCall] call to c_str +# 1373| Type = [PointerType] const char * +# 1373| ValueCategory = prvalue +# 1373| getQualifier(): [ConstructorCall] call to String +# 1373| Type = [VoidType] void +# 1373| ValueCategory = prvalue +# 1373| getQualifier().getFullyConverted(): [CStyleCast] (const String)... +# 1373| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion +# 1373| Type = [SpecifiedType] const String +# 1373| ValueCategory = prvalue +# 1373| getExpr(): [TemporaryObjectExpr] temporary object +# 1373| Type = [Struct] String +# 1373| ValueCategory = prvalue(load) +# 1374| getStmt(7): [ExprStmt] ExprStmt +# 1374| getExpr(): [FunctionCall] call to c_str +# 1374| Type = [PointerType] const char * +# 1374| ValueCategory = prvalue +# 1374| getQualifier(): [FunctionCall] call to returnValue +# 1374| Type = [Struct] String +# 1374| ValueCategory = prvalue +# 1374| getQualifier().getFullyConverted(): [CStyleCast] (const String)... +# 1374| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion +# 1374| Type = [SpecifiedType] const String +# 1374| ValueCategory = prvalue +# 1374| getExpr(): [TemporaryObjectExpr] temporary object +# 1374| Type = [Struct] String +# 1374| ValueCategory = prvalue(load) +# 1376| getStmt(8): [ExprStmt] ExprStmt +# 1376| getExpr(): [FunctionCall] call to defaultConstruct +# 1376| Type = [Struct] String +# 1376| ValueCategory = prvalue +# 1376| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1376| Type = [Struct] String +# 1376| ValueCategory = prvalue(load) +# 1377| getStmt(9): [ReturnStmt] return ... +# 1379| [TopLevelFunction] void temporary_destructor_only() +# 1379| : +# 1379| getEntryPoint(): [BlockStmt] { ... } +# 1380| getStmt(0): [DeclStmt] declaration +# 1380| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1380| Type = [Class] destructor_only +# 1380| getVariable().getInitializer(): [Initializer] initializer for d +# 1380| getExpr(): [FunctionCall] call to returnValue +# 1380| Type = [Class] destructor_only +# 1380| ValueCategory = prvalue +# 1381| getStmt(1): [DeclStmt] declaration +# 1381| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1381| Type = [LValueReferenceType] const destructor_only & +# 1381| getVariable().getInitializer(): [Initializer] initializer for rd +# 1381| getExpr(): [FunctionCall] call to returnValue +# 1381| Type = [Class] destructor_only +# 1381| ValueCategory = prvalue +# 1381| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1381| Type = [LValueReferenceType] const destructor_only & +# 1381| ValueCategory = prvalue +# 1381| getExpr(): [CStyleCast] (const destructor_only)... +# 1381| Conversion = [GlvalueConversion] glvalue conversion +# 1381| Type = [SpecifiedType] const destructor_only +# 1381| ValueCategory = lvalue +# 1381| getExpr(): [TemporaryObjectExpr] temporary object +# 1381| Type = [Class] destructor_only +# 1381| ValueCategory = lvalue +# 1382| getStmt(2): [DeclStmt] declaration +# 1382| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d2 +# 1382| Type = [Class] destructor_only +# 1383| getStmt(3): [ExprStmt] ExprStmt +# 1383| getExpr(): [FunctionCall] call to acceptRef +# 1383| Type = [VoidType] void +# 1383| ValueCategory = prvalue +# 1383| getArgument(0): [VariableAccess] d +# 1383| Type = [Class] destructor_only +# 1383| ValueCategory = lvalue +# 1383| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1383| Type = [LValueReferenceType] const destructor_only & +# 1383| ValueCategory = prvalue +# 1383| getExpr(): [CStyleCast] (const destructor_only)... +# 1383| Conversion = [GlvalueConversion] glvalue conversion +# 1383| Type = [SpecifiedType] const destructor_only +# 1383| ValueCategory = lvalue +# 1384| getStmt(4): [ExprStmt] ExprStmt +# 1384| getExpr(): [FunctionCall] call to acceptValue +# 1384| Type = [VoidType] void +# 1384| ValueCategory = prvalue +# 1384| getArgument(0): [VariableAccess] d +# 1384| Type = [Class] destructor_only +# 1384| ValueCategory = prvalue(load) +# 1384| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1384| Type = [Class] destructor_only +# 1384| ValueCategory = lvalue +# 1385| getStmt(5): [ExprStmt] ExprStmt +# 1385| getExpr(): [FunctionCall] call to method +# 1385| Type = [VoidType] void +# 1385| ValueCategory = prvalue +# 1385| getQualifier(): [Literal] 0 +# 1385| Type = [Class] destructor_only +# 1385| Value = [Literal] 0 +# 1385| ValueCategory = prvalue +# 1385| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1385| Type = [Class] destructor_only +# 1385| ValueCategory = prvalue(load) +# 1386| getStmt(6): [ExprStmt] ExprStmt +# 1386| getExpr(): [FunctionCall] call to method +# 1386| Type = [VoidType] void +# 1386| ValueCategory = prvalue +# 1386| getQualifier(): [FunctionCall] call to returnValue +# 1386| Type = [Class] destructor_only +# 1386| ValueCategory = prvalue +# 1386| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1386| Type = [Class] destructor_only +# 1386| ValueCategory = prvalue(load) +# 1388| getStmt(7): [ExprStmt] ExprStmt +# 1388| getExpr(): [FunctionCall] call to defaultConstruct +# 1388| Type = [Class] destructor_only +# 1388| ValueCategory = prvalue +# 1388| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1388| Type = [Class] destructor_only +# 1388| ValueCategory = prvalue(load) +# 1389| getStmt(8): [ReturnStmt] return ... +# 1391| [TopLevelFunction] void temporary_copy_constructor() +# 1391| : +# 1391| getEntryPoint(): [BlockStmt] { ... } +# 1392| getStmt(0): [DeclStmt] declaration +# 1392| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d +# 1392| Type = [Class] copy_constructor +# 1392| getVariable().getInitializer(): [Initializer] initializer for d +# 1392| getExpr(): [FunctionCall] call to returnValue +# 1392| Type = [Class] copy_constructor +# 1392| ValueCategory = prvalue +# 1393| getStmt(1): [DeclStmt] declaration +# 1393| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rd +# 1393| Type = [LValueReferenceType] const copy_constructor & +# 1393| getVariable().getInitializer(): [Initializer] initializer for rd +# 1393| getExpr(): [FunctionCall] call to returnValue +# 1393| Type = [Class] copy_constructor +# 1393| ValueCategory = prvalue +# 1393| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1393| Type = [LValueReferenceType] const copy_constructor & +# 1393| ValueCategory = prvalue +# 1393| getExpr(): [CStyleCast] (const copy_constructor)... +# 1393| Conversion = [GlvalueConversion] glvalue conversion +# 1393| Type = [SpecifiedType] const copy_constructor +# 1393| ValueCategory = lvalue +# 1393| getExpr(): [TemporaryObjectExpr] temporary object +# 1393| Type = [Class] copy_constructor +# 1393| ValueCategory = lvalue +# 1394| getStmt(2): [DeclStmt] declaration +# 1394| getDeclarationEntry(0): [VariableDeclarationEntry] definition of d2 +# 1394| Type = [Class] copy_constructor +# 1394| getVariable().getInitializer(): [Initializer] initializer for d2 +# 1394| getExpr(): [ConstructorCall] call to copy_constructor +# 1394| Type = [VoidType] void +# 1394| ValueCategory = prvalue +# 1395| getStmt(3): [ExprStmt] ExprStmt +# 1395| getExpr(): [FunctionCall] call to acceptRef +# 1395| Type = [VoidType] void +# 1395| ValueCategory = prvalue +# 1395| getArgument(0): [VariableAccess] d +# 1395| Type = [Class] copy_constructor +# 1395| ValueCategory = lvalue +# 1395| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1395| Type = [LValueReferenceType] const copy_constructor & +# 1395| ValueCategory = prvalue +# 1395| getExpr(): [CStyleCast] (const copy_constructor)... +# 1395| Conversion = [GlvalueConversion] glvalue conversion +# 1395| Type = [SpecifiedType] const copy_constructor +# 1395| ValueCategory = lvalue +# 1396| getStmt(4): [ExprStmt] ExprStmt +# 1396| getExpr(): [FunctionCall] call to acceptValue +# 1396| Type = [VoidType] void +# 1396| ValueCategory = prvalue +# 1396| getArgument(0): [ConstructorCall] call to copy_constructor +# 1396| Type = [VoidType] void +# 1396| ValueCategory = prvalue +# 1396| getArgument(0): [VariableAccess] d +# 1396| Type = [Class] copy_constructor +# 1396| ValueCategory = lvalue +# 1396| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1396| Type = [LValueReferenceType] const copy_constructor & +# 1396| ValueCategory = prvalue +# 1396| getExpr(): [CStyleCast] (const copy_constructor)... +# 1396| Conversion = [GlvalueConversion] glvalue conversion +# 1396| Type = [SpecifiedType] const copy_constructor +# 1396| ValueCategory = lvalue +# 1396| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1396| Type = [Class] copy_constructor +# 1396| ValueCategory = lvalue +# 1397| getStmt(5): [ExprStmt] ExprStmt +# 1397| getExpr(): [FunctionCall] call to method +# 1397| Type = [VoidType] void +# 1397| ValueCategory = prvalue +# 1397| getQualifier(): [ConstructorCall] call to copy_constructor +# 1397| Type = [VoidType] void +# 1397| ValueCategory = prvalue +# 1397| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1397| Type = [Class] copy_constructor +# 1397| ValueCategory = prvalue(load) +# 1398| getStmt(6): [ExprStmt] ExprStmt +# 1398| getExpr(): [FunctionCall] call to method +# 1398| Type = [VoidType] void +# 1398| ValueCategory = prvalue +# 1398| getQualifier(): [FunctionCall] call to returnValue +# 1398| Type = [Class] copy_constructor +# 1398| ValueCategory = prvalue +# 1398| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1398| Type = [Class] copy_constructor +# 1398| ValueCategory = prvalue(load) +# 1399| getStmt(7): [ExprStmt] ExprStmt +# 1399| getExpr(): [FunctionCall] call to defaultConstruct +# 1399| Type = [Class] copy_constructor +# 1399| ValueCategory = prvalue +# 1399| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1399| Type = [Class] copy_constructor +# 1399| ValueCategory = prvalue(load) +# 1401| getStmt(8): [DeclStmt] declaration +# 1401| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 1401| Type = [IntType] int +# 1401| getVariable().getInitializer(): [Initializer] initializer for y +# 1401| getExpr(): [ValueFieldAccess] y +# 1401| Type = [IntType] int +# 1401| ValueCategory = prvalue +# 1401| getQualifier(): [FunctionCall] call to returnValue +# 1401| Type = [Class] copy_constructor +# 1401| ValueCategory = prvalue +# 1401| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1401| Type = [Class] copy_constructor +# 1401| ValueCategory = prvalue(load) +# 1402| getStmt(9): [ReturnStmt] return ... +# 1404| [TopLevelFunction] void temporary_point() +# 1404| : +# 1404| getEntryPoint(): [BlockStmt] { ... } +# 1405| getStmt(0): [DeclStmt] declaration +# 1405| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p +# 1405| Type = [Struct] Point +# 1405| getVariable().getInitializer(): [Initializer] initializer for p +# 1405| getExpr(): [FunctionCall] call to returnValue +# 1405| Type = [Struct] Point +# 1405| ValueCategory = prvalue +# 1406| getStmt(1): [DeclStmt] declaration +# 1406| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rp +# 1406| Type = [LValueReferenceType] const Point & +# 1406| getVariable().getInitializer(): [Initializer] initializer for rp +# 1406| getExpr(): [FunctionCall] call to returnValue +# 1406| Type = [Struct] Point +# 1406| ValueCategory = prvalue +# 1406| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1406| Type = [LValueReferenceType] const Point & +# 1406| ValueCategory = prvalue +# 1406| getExpr(): [CStyleCast] (const Point)... +# 1406| Conversion = [GlvalueConversion] glvalue conversion +# 1406| Type = [SpecifiedType] const Point +# 1406| ValueCategory = lvalue +# 1406| getExpr(): [TemporaryObjectExpr] temporary object +# 1406| Type = [Struct] Point +# 1406| ValueCategory = lvalue +# 1408| getStmt(2): [ExprStmt] ExprStmt +# 1408| getExpr(): [FunctionCall] call to acceptRef +# 1408| Type = [VoidType] void +# 1408| ValueCategory = prvalue +# 1408| getArgument(0): [VariableAccess] p +# 1408| Type = [Struct] Point +# 1408| ValueCategory = lvalue +# 1408| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 1408| Type = [LValueReferenceType] const Point & +# 1408| ValueCategory = prvalue +# 1408| getExpr(): [CStyleCast] (const Point)... +# 1408| Conversion = [GlvalueConversion] glvalue conversion +# 1408| Type = [SpecifiedType] const Point +# 1408| ValueCategory = lvalue +# 1409| getStmt(3): [ExprStmt] ExprStmt +# 1409| getExpr(): [FunctionCall] call to acceptValue +# 1409| Type = [VoidType] void +# 1409| ValueCategory = prvalue +# 1409| getArgument(0): [VariableAccess] p +# 1409| Type = [Struct] Point +# 1409| ValueCategory = prvalue(load) +# 1410| getStmt(4): [ExprStmt] ExprStmt +# 1410| getExpr(): [ValueFieldAccess] x +# 1410| Type = [IntType] int +# 1410| Value = [ValueFieldAccess] 0 +# 1410| ValueCategory = prvalue +# 1410| getQualifier(): [Literal] 0 +# 1410| Type = [Struct] Point +# 1410| Value = [Literal] 0 +# 1410| ValueCategory = prvalue +# 1410| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 1410| Type = [Struct] Point +# 1410| ValueCategory = prvalue(load) +# 1411| getStmt(5): [DeclStmt] declaration +# 1411| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 1411| Type = [IntType] int +# 1411| getVariable().getInitializer(): [Initializer] initializer for y +# 1411| getExpr(): [ValueFieldAccess] y +# 1411| Type = [IntType] int +# 1411| ValueCategory = prvalue +# 1411| getQualifier(): [FunctionCall] call to returnValue +# 1411| Type = [Struct] Point +# 1411| ValueCategory = prvalue +# 1413| getStmt(6): [ExprStmt] ExprStmt +# 1413| getExpr(): [FunctionCall] call to defaultConstruct +# 1413| Type = [Struct] Point +# 1413| ValueCategory = prvalue +# 1414| getStmt(7): [ReturnStmt] return ... +# 1416| [CopyAssignmentOperator] UnusualFields& UnusualFields::operator=(UnusualFields const&) +# 1416| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const UnusualFields & +# 1416| [Constructor] void UnusualFields::UnusualFields() +# 1416| : +# 1416| [CopyConstructor] void UnusualFields::UnusualFields(UnusualFields const&) +# 1416| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const UnusualFields & +# 1416| [MoveConstructor] void UnusualFields::UnusualFields(UnusualFields&&) +# 1416| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] UnusualFields && +# 1421| [TopLevelFunction] void temporary_unusual_fields() +# 1421| : +# 1421| getEntryPoint(): [BlockStmt] { ... } +# 1422| getStmt(0): [DeclStmt] declaration +# 1422| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rx +# 1422| Type = [LValueReferenceType] const int & +# 1422| getVariable().getInitializer(): [Initializer] initializer for rx +# 1422| getExpr(): [ValueFieldAccess] r +# 1422| Type = [LValueReferenceType] int & +# 1422| ValueCategory = prvalue +# 1422| getQualifier(): [FunctionCall] call to returnValue +# 1422| Type = [Struct] UnusualFields +# 1422| ValueCategory = prvalue +# 1422| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1422| Type = [LValueReferenceType] const int & +# 1422| ValueCategory = prvalue +# 1422| getExpr(): [CStyleCast] (const int)... +# 1422| Conversion = [GlvalueConversion] glvalue conversion +# 1422| Type = [SpecifiedType] const int +# 1422| ValueCategory = lvalue +# 1422| getExpr(): [ReferenceDereferenceExpr] (reference dereference) +# 1422| Type = [IntType] int +# 1422| ValueCategory = lvalue +# 1423| getStmt(1): [DeclStmt] declaration +# 1423| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 1423| Type = [IntType] int +# 1423| getVariable().getInitializer(): [Initializer] initializer for x +# 1423| getExpr(): [ValueFieldAccess] r +# 1423| Type = [LValueReferenceType] int & +# 1423| ValueCategory = prvalue +# 1423| getQualifier(): [FunctionCall] call to returnValue +# 1423| Type = [Struct] UnusualFields +# 1423| ValueCategory = prvalue +# 1423| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference) +# 1423| Type = [IntType] int +# 1423| ValueCategory = prvalue(load) +# 1425| getStmt(2): [DeclStmt] declaration +# 1425| getDeclarationEntry(0): [VariableDeclarationEntry] definition of rf +# 1425| Type = [LValueReferenceType] const float & +# 1425| getVariable().getInitializer(): [Initializer] initializer for rf +# 1425| getExpr(): [ArrayExpr] access to array +# 1425| Type = [FloatType] float +# 1425| ValueCategory = lvalue +# 1425| getArrayBase(): [ValueFieldAccess] a +# 1425| Type = [ArrayType] float[10] +# 1425| ValueCategory = prvalue +# 1425| getQualifier(): [FunctionCall] call to returnValue +# 1425| Type = [Struct] UnusualFields +# 1425| ValueCategory = prvalue +# 1425| getArrayOffset(): [Literal] 3 +# 1425| Type = [IntType] int +# 1425| Value = [Literal] 3 +# 1425| ValueCategory = prvalue +# 1425| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1425| Type = [PointerType] float * +# 1425| ValueCategory = prvalue +# 1425| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to) +# 1425| Type = [LValueReferenceType] const float & +# 1425| ValueCategory = prvalue +# 1425| getExpr(): [CStyleCast] (const float)... +# 1425| Conversion = [GlvalueConversion] glvalue conversion +# 1425| Type = [SpecifiedType] const float +# 1425| ValueCategory = lvalue +# 1426| getStmt(3): [DeclStmt] declaration +# 1426| getDeclarationEntry(0): [VariableDeclarationEntry] definition of f +# 1426| Type = [FloatType] float +# 1426| getVariable().getInitializer(): [Initializer] initializer for f +# 1426| getExpr(): [ArrayExpr] access to array +# 1426| Type = [FloatType] float +# 1426| ValueCategory = prvalue(load) +# 1426| getArrayBase(): [ValueFieldAccess] a +# 1426| Type = [ArrayType] float[10] +# 1426| ValueCategory = prvalue +# 1426| getQualifier(): [FunctionCall] call to returnValue +# 1426| Type = [Struct] UnusualFields +# 1426| ValueCategory = prvalue +# 1426| getArrayOffset(): [Literal] 5 +# 1426| Type = [IntType] int +# 1426| Value = [Literal] 5 +# 1426| ValueCategory = prvalue +# 1426| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 1426| Type = [PointerType] float * +# 1426| ValueCategory = prvalue +# 1427| getStmt(4): [ReturnStmt] return ... +# 1429| [CopyAssignmentOperator] POD_Base& POD_Base::operator=(POD_Base const&) +# 1429| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Base & +# 1429| [MoveAssignmentOperator] POD_Base& POD_Base::operator=(POD_Base&&) +# 1429| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Base && +# 1432| [ConstMemberFunction] float POD_Base::f() const +# 1432| : +# 1435| [CopyAssignmentOperator] POD_Middle& POD_Middle::operator=(POD_Middle const&) +# 1435| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Middle & +# 1435| [MoveAssignmentOperator] POD_Middle& POD_Middle::operator=(POD_Middle&&) +# 1435| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Middle && +# 1435| [Constructor] void POD_Middle::POD_Middle() +# 1435| : +# 1439| [CopyAssignmentOperator] POD_Derived& POD_Derived::operator=(POD_Derived const&) +# 1439| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const POD_Derived & +# 1439| [MoveAssignmentOperator] POD_Derived& POD_Derived::operator=(POD_Derived&&) +# 1439| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] POD_Derived && +# 1439| [Constructor] void POD_Derived::POD_Derived() +# 1439| : +# 1443| [TopLevelFunction] void temporary_hierarchy() +# 1443| : +# 1443| getEntryPoint(): [BlockStmt] { ... } +# 1444| getStmt(0): [DeclStmt] declaration +# 1444| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b +# 1444| Type = [Struct] POD_Base +# 1444| getVariable().getInitializer(): [Initializer] initializer for b +# 1444| getExpr(): [FunctionCall] call to returnValue +# 1444| Type = [Struct] POD_Middle +# 1444| ValueCategory = prvalue +# 1444| getExpr().getFullyConverted(): [CStyleCast] (POD_Base)... +# 1444| Conversion = [BaseClassConversion] base class conversion +# 1444| Type = [Struct] POD_Base +# 1444| ValueCategory = prvalue +# 1445| getStmt(1): [ExprStmt] ExprStmt +# 1445| getExpr(): [AssignExpr] ... = ... +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = lvalue +# 1445| getLValue(): [VariableAccess] b +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = lvalue +# 1445| getRValue(): [FunctionCall] call to returnValue +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = prvalue +# 1445| getRValue().getFullyConverted(): [CStyleCast] (POD_Base)... +# 1445| Conversion = [BaseClassConversion] base class conversion +# 1445| Type = [Struct] POD_Base +# 1445| ValueCategory = prvalue(load) +# 1445| getExpr(): [CStyleCast] (POD_Middle)... +# 1445| Conversion = [BaseClassConversion] base class conversion +# 1445| Type = [Struct] POD_Middle +# 1445| ValueCategory = lvalue +# 1445| getExpr(): [TemporaryObjectExpr] temporary object +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = lvalue +# 1445| getExpr(): [ParenthesisExpr] (...) +# 1445| Type = [Struct] POD_Derived +# 1445| ValueCategory = prvalue +# 1446| getStmt(2): [DeclStmt] declaration +# 1446| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 1446| Type = [IntType] int +# 1446| getVariable().getInitializer(): [Initializer] initializer for x +# 1446| getExpr(): [ValueFieldAccess] x +# 1446| Type = [IntType] int +# 1446| ValueCategory = prvalue +# 1446| getQualifier(): [FunctionCall] call to returnValue +# 1446| Type = [Struct] POD_Derived +# 1446| ValueCategory = prvalue +# 1446| getQualifier().getFullyConverted(): [CStyleCast] (POD_Base)... +# 1446| Conversion = [BaseClassConversion] base class conversion +# 1446| Type = [Struct] POD_Base +# 1446| ValueCategory = prvalue +# 1446| getExpr(): [CStyleCast] (POD_Middle)... +# 1446| Conversion = [BaseClassConversion] base class conversion +# 1446| Type = [Struct] POD_Middle +# 1446| ValueCategory = prvalue +# 1447| getStmt(3): [DeclStmt] declaration +# 1447| getDeclarationEntry(0): [VariableDeclarationEntry] definition of f +# 1447| Type = [FloatType] float +# 1447| getVariable().getInitializer(): [Initializer] initializer for f +# 1447| getExpr(): [FunctionCall] call to f +# 1447| Type = [FloatType] float +# 1447| ValueCategory = prvalue +# 1447| getQualifier(): [FunctionCall] call to returnValue +# 1447| Type = [Struct] POD_Derived +# 1447| ValueCategory = prvalue +# 1447| getQualifier().getFullyConverted(): [CStyleCast] (const POD_Base)... +# 1447| Conversion = [BaseClassConversion] base class conversion +# 1447| Type = [SpecifiedType] const POD_Base +# 1447| ValueCategory = prvalue +# 1447| getExpr(): [CStyleCast] (POD_Middle)... +# 1447| Conversion = [BaseClassConversion] base class conversion +# 1447| Type = [Struct] POD_Middle +# 1447| ValueCategory = prvalue +# 1447| getExpr(): [ParenthesisExpr] (...) +# 1447| Type = [Struct] POD_Derived +# 1447| ValueCategory = prvalue +# 1448| getStmt(4): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index 64172ad18738..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand @@ -25,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index 64172ad18738..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand @@ -25,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index c2e40440569b..9e52504441c0 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -1322,4 +1322,129 @@ void f(int* p) new (p) int; } +template +T defaultConstruct() { + return T(); +} + +class constructor_only { +public: + int x; + +public: + constructor_only(int x); +}; + +class copy_constructor { +public: + int y; + +public: + copy_constructor(); + copy_constructor(const copy_constructor&); + + void method(); +}; + +class destructor_only { +public: + ~destructor_only(); + + void method(); +}; + +template +void acceptRef(const T& v); + +template +void acceptValue(T v); + +template +T returnValue(); + +void temporary_string() { + String s = returnValue(); // No temporary + const String& rs = returnValue(); // Binding a reference variable to a temporary + + acceptRef(s); // No temporary + acceptRef("foo"); // Binding a const reference to a temporary + acceptValue(s); + acceptValue("foo"); + String().c_str(); + returnValue().c_str(); // Member access on a temporary + + defaultConstruct(); +} + +void temporary_destructor_only() { + destructor_only d = returnValue(); + const destructor_only& rd = returnValue(); + destructor_only d2; + acceptRef(d); + acceptValue(d); + destructor_only().method(); + returnValue().method(); + + defaultConstruct(); +} + +void temporary_copy_constructor() { + copy_constructor d = returnValue(); + const copy_constructor& rd = returnValue(); + copy_constructor d2; + acceptRef(d); + acceptValue(d); + copy_constructor().method(); + returnValue().method(); + defaultConstruct(); + + int y = returnValue().y; +} + +void temporary_point() { + Point p = returnValue(); // No temporary + const Point& rp = returnValue(); // Binding a reference variable to a temporary + + acceptRef(p); // No temporary + acceptValue(p); + Point().x; + int y = returnValue().y; + + defaultConstruct(); +} + +struct UnusualFields { + int& r; + float a[10]; +}; + +void temporary_unusual_fields() { + const int& rx = returnValue().r; + int x = returnValue().r; + + const float& rf = returnValue().a[3]; + float f = returnValue().a[5]; +} + +struct POD_Base { + int x; + + float f() const; +}; + +struct POD_Middle : POD_Base { + int y; +}; + +struct POD_Derived : POD_Middle { + int z; +}; + +void temporary_hierarchy() { + POD_Base b = returnValue(); + b = (returnValue()); // Multiple conversions plus parens + int x = returnValue().x; + float f = (returnValue()).f(); +} + // semmle-extractor-options: -std=c++17 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index 64172ad18738..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand @@ -25,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType 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 645abc35b96a..a080bfc3b9d2 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -3824,23 +3824,26 @@ ir.cpp: # 715| long Outer::Func(void*, char) # 715| Block 0 -# 715| v715_1(void) = EnterFunction : -# 715| mu715_2(unknown) = AliasedDefinition : -# 715| mu715_3(unknown) = InitializeNonLocal : -# 715| r715_4(glval) = VariableAddress[x] : -# 715| mu715_5(void *) = InitializeParameter[x] : &:r715_4 -# 715| r715_6(void *) = Load[x] : &:r715_4, ~m? -# 715| mu715_7(unknown) = InitializeIndirection[x] : &:r715_6 -# 715| r715_8(glval) = VariableAddress[y] : -# 715| mu715_9(char) = InitializeParameter[y] : &:r715_8 -# 716| r716_1(glval) = VariableAddress[#return] : -# 716| r716_2(long) = Constant[0] : -# 716| mu716_3(long) = Store[#return] : &:r716_1, r716_2 -# 715| v715_10(void) = ReturnIndirection[x] : &:r715_6, ~m? -# 715| r715_11(glval) = VariableAddress[#return] : -# 715| v715_12(void) = ReturnValue : &:r715_11, ~m? -# 715| v715_13(void) = AliasedUse : ~m? -# 715| v715_14(void) = ExitFunction : +# 715| v715_1(void) = EnterFunction : +# 715| mu715_2(unknown) = AliasedDefinition : +# 715| mu715_3(unknown) = InitializeNonLocal : +# 715| r715_4(glval) = VariableAddress[x] : +# 715| mu715_5(void *) = InitializeParameter[x] : &:r715_4 +# 715| r715_6(void *) = Load[x] : &:r715_4, ~m? +# 715| mu715_7(unknown) = InitializeIndirection[x] : &:r715_6 +# 715| r715_8(glval) = VariableAddress[y] : +# 715| mu715_9(char) = InitializeParameter[y] : &:r715_8 +# 716| r716_1(glval) = VariableAddress[#return] : +# 716| r716_2(glval) = VariableAddress[#temp716:12] : +# 716| r716_3(long) = Constant[0] : +# 716| mu716_4(long) = Store[#temp716:12] : &:r716_2, r716_3 +# 716| r716_5(long) = Load[#temp716:12] : &:r716_2, ~m? +# 716| mu716_6(long) = Store[#return] : &:r716_1, r716_5 +# 715| v715_10(void) = ReturnIndirection[x] : &:r715_6, ~m? +# 715| r715_11(glval) = VariableAddress[#return] : +# 715| v715_12(void) = ReturnValue : &:r715_11, ~m? +# 715| v715_13(void) = AliasedUse : ~m? +# 715| v715_14(void) = ExitFunction : # 720| double CallNestedTemplateFunc() # 720| Block 0 @@ -4522,44 +4525,48 @@ ir.cpp: # 808| r808_12(glval) = CopyValue : r808_6 # 809| r809_1(glval) = VariableAddress[b] : # 809| r809_2(glval) = FunctionAddress[operator=] : -# 809| r809_3(glval) = FunctionAddress[Base] : -# 809| r809_4(glval) = VariableAddress[m] : -# 809| r809_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r809_4 -# 809| r809_6(Base &) = CopyValue : r809_5 -# 809| v809_7(void) = Call[Base] : func:r809_3, 0:r809_6 -# 809| mu809_8(unknown) = ^CallSideEffect : ~m? -# 809| mu809_9(Base) = ^IndirectMayWriteSideEffect[-1] : -# 809| v809_10(void) = ^BufferReadSideEffect[0] : &:r809_6, ~m? -# 809| mu809_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_6 -# 809| r809_12(glval) = Convert : v809_7 -# 809| r809_13(Base &) = CopyValue : r809_12 -# 809| r809_14(Base &) = Call[operator=] : func:r809_2, this:r809_1, 0:r809_13 -# 809| mu809_15(unknown) = ^CallSideEffect : ~m? -# 809| v809_16(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m? -# 809| v809_17(void) = ^BufferReadSideEffect[0] : &:r809_13, ~m? -# 809| mu809_18(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 -# 809| mu809_19(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_13 -# 809| r809_20(glval) = CopyValue : r809_14 +# 809| r809_3(glval) = VariableAddress[#temp809:7] : +# 809| mu809_4(Base) = Uninitialized[#temp809:7] : &:r809_3 +# 809| r809_5(glval) = FunctionAddress[Base] : +# 809| r809_6(glval) = VariableAddress[m] : +# 809| r809_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r809_6 +# 809| r809_8(Base &) = CopyValue : r809_7 +# 809| v809_9(void) = Call[Base] : func:r809_5, this:r809_3, 0:r809_8 +# 809| mu809_10(unknown) = ^CallSideEffect : ~m? +# 809| mu809_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_3 +# 809| v809_12(void) = ^BufferReadSideEffect[0] : &:r809_8, ~m? +# 809| mu809_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_8 +# 809| r809_14(glval) = Convert : r809_3 +# 809| r809_15(Base &) = CopyValue : r809_14 +# 809| r809_16(Base &) = Call[operator=] : func:r809_2, this:r809_1, 0:r809_15 +# 809| mu809_17(unknown) = ^CallSideEffect : ~m? +# 809| v809_18(void) = ^BufferReadSideEffect[-1] : &:r809_1, ~m? +# 809| v809_19(void) = ^BufferReadSideEffect[0] : &:r809_15, ~m? +# 809| mu809_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 +# 809| mu809_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r809_15 +# 809| r809_22(glval) = CopyValue : r809_16 # 810| r810_1(glval) = VariableAddress[b] : # 810| r810_2(glval) = FunctionAddress[operator=] : -# 810| r810_3(glval) = FunctionAddress[Base] : -# 810| r810_4(glval) = VariableAddress[m] : -# 810| r810_5(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_4 -# 810| r810_6(Base &) = CopyValue : r810_5 -# 810| v810_7(void) = Call[Base] : func:r810_3, 0:r810_6 -# 810| mu810_8(unknown) = ^CallSideEffect : ~m? -# 810| mu810_9(Base) = ^IndirectMayWriteSideEffect[-1] : -# 810| v810_10(void) = ^BufferReadSideEffect[0] : &:r810_6, ~m? -# 810| mu810_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_6 -# 810| r810_12(glval) = Convert : v810_7 -# 810| r810_13(Base &) = CopyValue : r810_12 -# 810| r810_14(Base &) = Call[operator=] : func:r810_2, this:r810_1, 0:r810_13 -# 810| mu810_15(unknown) = ^CallSideEffect : ~m? -# 810| v810_16(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m? -# 810| v810_17(void) = ^BufferReadSideEffect[0] : &:r810_13, ~m? -# 810| mu810_18(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 -# 810| mu810_19(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_13 -# 810| r810_20(glval) = CopyValue : r810_14 +# 810| r810_3(glval) = VariableAddress[#temp810:7] : +# 810| mu810_4(Base) = Uninitialized[#temp810:7] : &:r810_3 +# 810| r810_5(glval) = FunctionAddress[Base] : +# 810| r810_6(glval) = VariableAddress[m] : +# 810| r810_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_6 +# 810| r810_8(Base &) = CopyValue : r810_7 +# 810| v810_9(void) = Call[Base] : func:r810_5, this:r810_3, 0:r810_8 +# 810| mu810_10(unknown) = ^CallSideEffect : ~m? +# 810| mu810_11(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_3 +# 810| v810_12(void) = ^BufferReadSideEffect[0] : &:r810_8, ~m? +# 810| mu810_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_8 +# 810| r810_14(glval) = Convert : r810_3 +# 810| r810_15(Base &) = CopyValue : r810_14 +# 810| r810_16(Base &) = Call[operator=] : func:r810_2, this:r810_1, 0:r810_15 +# 810| mu810_17(unknown) = ^CallSideEffect : ~m? +# 810| v810_18(void) = ^BufferReadSideEffect[-1] : &:r810_1, ~m? +# 810| v810_19(void) = ^BufferReadSideEffect[0] : &:r810_15, ~m? +# 810| mu810_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 +# 810| mu810_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r810_15 +# 810| r810_22(glval) = CopyValue : r810_16 # 811| r811_1(glval) = VariableAddress[pm] : # 811| r811_2(Middle *) = Load[pm] : &:r811_1, ~m? # 811| r811_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r811_2 @@ -4636,46 +4643,50 @@ ir.cpp: # 822| r822_13(glval) = CopyValue : r822_7 # 823| r823_1(glval) = VariableAddress[b] : # 823| r823_2(glval) = FunctionAddress[operator=] : -# 823| r823_3(glval) = FunctionAddress[Base] : -# 823| r823_4(glval) = VariableAddress[d] : -# 823| r823_5(glval) = ConvertToNonVirtualBase[Derived : Middle] : r823_4 -# 823| r823_6(glval) = ConvertToNonVirtualBase[Middle : Base] : r823_5 -# 823| r823_7(Base &) = CopyValue : r823_6 -# 823| v823_8(void) = Call[Base] : func:r823_3, 0:r823_7 -# 823| mu823_9(unknown) = ^CallSideEffect : ~m? -# 823| mu823_10(Base) = ^IndirectMayWriteSideEffect[-1] : -# 823| v823_11(void) = ^BufferReadSideEffect[0] : &:r823_7, ~m? -# 823| mu823_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_7 -# 823| r823_13(glval) = Convert : v823_8 -# 823| r823_14(Base &) = CopyValue : r823_13 -# 823| r823_15(Base &) = Call[operator=] : func:r823_2, this:r823_1, 0:r823_14 -# 823| mu823_16(unknown) = ^CallSideEffect : ~m? -# 823| v823_17(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m? -# 823| v823_18(void) = ^BufferReadSideEffect[0] : &:r823_14, ~m? -# 823| mu823_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 -# 823| mu823_20(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_14 -# 823| r823_21(glval) = CopyValue : r823_15 +# 823| r823_3(glval) = VariableAddress[#temp823:7] : +# 823| mu823_4(Base) = Uninitialized[#temp823:7] : &:r823_3 +# 823| r823_5(glval) = FunctionAddress[Base] : +# 823| r823_6(glval) = VariableAddress[d] : +# 823| r823_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r823_6 +# 823| r823_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r823_7 +# 823| r823_9(Base &) = CopyValue : r823_8 +# 823| v823_10(void) = Call[Base] : func:r823_5, this:r823_3, 0:r823_9 +# 823| mu823_11(unknown) = ^CallSideEffect : ~m? +# 823| mu823_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_3 +# 823| v823_13(void) = ^BufferReadSideEffect[0] : &:r823_9, ~m? +# 823| mu823_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_9 +# 823| r823_15(glval) = Convert : r823_3 +# 823| r823_16(Base &) = CopyValue : r823_15 +# 823| r823_17(Base &) = Call[operator=] : func:r823_2, this:r823_1, 0:r823_16 +# 823| mu823_18(unknown) = ^CallSideEffect : ~m? +# 823| v823_19(void) = ^BufferReadSideEffect[-1] : &:r823_1, ~m? +# 823| v823_20(void) = ^BufferReadSideEffect[0] : &:r823_16, ~m? +# 823| mu823_21(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 +# 823| mu823_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r823_16 +# 823| r823_23(glval) = CopyValue : r823_17 # 824| r824_1(glval) = VariableAddress[b] : # 824| r824_2(glval) = FunctionAddress[operator=] : -# 824| r824_3(glval) = FunctionAddress[Base] : -# 824| r824_4(glval) = VariableAddress[d] : -# 824| r824_5(glval) = ConvertToNonVirtualBase[Derived : Middle] : r824_4 -# 824| r824_6(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_5 -# 824| r824_7(Base &) = CopyValue : r824_6 -# 824| v824_8(void) = Call[Base] : func:r824_3, 0:r824_7 -# 824| mu824_9(unknown) = ^CallSideEffect : ~m? -# 824| mu824_10(Base) = ^IndirectMayWriteSideEffect[-1] : -# 824| v824_11(void) = ^BufferReadSideEffect[0] : &:r824_7, ~m? -# 824| mu824_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_7 -# 824| r824_13(glval) = Convert : v824_8 -# 824| r824_14(Base &) = CopyValue : r824_13 -# 824| r824_15(Base &) = Call[operator=] : func:r824_2, this:r824_1, 0:r824_14 -# 824| mu824_16(unknown) = ^CallSideEffect : ~m? -# 824| v824_17(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m? -# 824| v824_18(void) = ^BufferReadSideEffect[0] : &:r824_14, ~m? -# 824| mu824_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 -# 824| mu824_20(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_14 -# 824| r824_21(glval) = CopyValue : r824_15 +# 824| r824_3(glval) = VariableAddress[#temp824:7] : +# 824| mu824_4(Base) = Uninitialized[#temp824:7] : &:r824_3 +# 824| r824_5(glval) = FunctionAddress[Base] : +# 824| r824_6(glval) = VariableAddress[d] : +# 824| r824_7(glval) = ConvertToNonVirtualBase[Derived : Middle] : r824_6 +# 824| r824_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_7 +# 824| r824_9(Base &) = CopyValue : r824_8 +# 824| v824_10(void) = Call[Base] : func:r824_5, this:r824_3, 0:r824_9 +# 824| mu824_11(unknown) = ^CallSideEffect : ~m? +# 824| mu824_12(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_3 +# 824| v824_13(void) = ^BufferReadSideEffect[0] : &:r824_9, ~m? +# 824| mu824_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_9 +# 824| r824_15(glval) = Convert : r824_3 +# 824| r824_16(Base &) = CopyValue : r824_15 +# 824| r824_17(Base &) = Call[operator=] : func:r824_2, this:r824_1, 0:r824_16 +# 824| mu824_18(unknown) = ^CallSideEffect : ~m? +# 824| v824_19(void) = ^BufferReadSideEffect[-1] : &:r824_1, ~m? +# 824| v824_20(void) = ^BufferReadSideEffect[0] : &:r824_16, ~m? +# 824| mu824_21(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 +# 824| mu824_22(unknown) = ^BufferMayWriteSideEffect[0] : &:r824_16 +# 824| r824_23(glval) = CopyValue : r824_17 # 825| r825_1(glval) = VariableAddress[pd] : # 825| r825_2(Derived *) = Load[pd] : &:r825_1, ~m? # 825| r825_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r825_2 @@ -4826,16 +4837,16 @@ ir.cpp: # 849| mu849_3(unknown) = InitializeNonLocal : # 850| r850_1(glval) = VariableAddress[b] : # 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 -#-----| r0_1(glval) = FunctionAddress[PolymorphicBase] : -#-----| v0_2(void) = Call[PolymorphicBase] : func:r0_1, this:r850_1 -#-----| mu0_3(unknown) = ^CallSideEffect : ~m? -#-----| mu0_4(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +# 850| r850_3(glval) = FunctionAddress[PolymorphicBase] : +# 850| v850_4(void) = Call[PolymorphicBase] : func:r850_3, this:r850_1 +# 850| mu850_5(unknown) = ^CallSideEffect : ~m? +# 850| mu850_6(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 # 851| r851_1(glval) = VariableAddress[d] : # 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 -#-----| r0_5(glval) = FunctionAddress[PolymorphicDerived] : -#-----| v0_6(void) = Call[PolymorphicDerived] : func:r0_5, this:r851_1 -#-----| mu0_7(unknown) = ^CallSideEffect : ~m? -#-----| mu0_8(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 +# 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : +# 851| v851_4(void) = Call[PolymorphicDerived] : func:r851_3, this:r851_1 +# 851| mu851_5(unknown) = ^CallSideEffect : ~m? +# 851| mu851_6(PolymorphicDerived) = ^IndirectMayWriteSideEffect[-1] : &:r851_1 # 853| r853_1(glval) = VariableAddress[pb] : # 853| r853_2(glval) = VariableAddress[b] : # 853| r853_3(PolymorphicBase *) = CopyValue : r853_2 @@ -6616,7 +6627,7 @@ ir.cpp: # 1179| r1179_3(glval) = FunctionAddress[String] : # 1179| r1179_4(glval) = StringConstant["foo"] : # 1179| r1179_5(char *) = Convert : r1179_4 -# 1179| r1179_6(String) = Call[String] : func:r1179_3, this:r1179_1, 0:r1179_5 +# 1179| v1179_6(void) = Call[String] : func:r1179_3, this:r1179_1, 0:r1179_5 # 1179| mu1179_7(unknown) = ^CallSideEffect : ~m? # 1179| mu1179_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1179_1 # 1179| v1179_9(void) = ^BufferReadSideEffect[0] : &:r1179_5, ~m? @@ -7433,6 +7444,486 @@ ir.cpp: # 1320| v1320_10(void) = AliasedUse : ~m? # 1320| v1320_11(void) = ExitFunction : +# 1326| Point defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| mu1326_2(unknown) = AliasedDefinition : +# 1326| mu1326_3(unknown) = InitializeNonLocal : +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| r1327_2(Point) = Constant[0] : +# 1327| mu1327_3(Point) = Store[#return] : &:r1327_1, r1327_2 +# 1326| r1326_4(glval) = VariableAddress[#return] : +# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? +# 1326| v1326_6(void) = AliasedUse : ~m? +# 1326| v1326_7(void) = ExitFunction : + +# 1326| String defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| mu1326_2(unknown) = AliasedDefinition : +# 1326| mu1326_3(unknown) = InitializeNonLocal : +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| mu1327_2(String) = Uninitialized[#return] : &:r1327_1 +# 1327| r1327_3(glval) = FunctionAddress[String] : +# 1327| v1327_4(void) = Call[String] : func:r1327_3, this:r1327_1 +# 1327| mu1327_5(unknown) = ^CallSideEffect : ~m? +# 1327| mu1327_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1 +# 1326| r1326_4(glval) = VariableAddress[#return] : +# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? +# 1326| v1326_6(void) = AliasedUse : ~m? +# 1326| v1326_7(void) = ExitFunction : + +# 1326| copy_constructor defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| mu1326_2(unknown) = AliasedDefinition : +# 1326| mu1326_3(unknown) = InitializeNonLocal : +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| mu1327_2(copy_constructor) = Uninitialized[#return] : &:r1327_1 +# 1327| r1327_3(glval) = FunctionAddress[copy_constructor] : +# 1327| v1327_4(void) = Call[copy_constructor] : func:r1327_3, this:r1327_1 +# 1327| mu1327_5(unknown) = ^CallSideEffect : ~m? +# 1327| mu1327_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1327_1 +# 1326| r1326_4(glval) = VariableAddress[#return] : +# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? +# 1326| v1326_6(void) = AliasedUse : ~m? +# 1326| v1326_7(void) = ExitFunction : + +# 1326| destructor_only defaultConstruct() +# 1326| Block 0 +# 1326| v1326_1(void) = EnterFunction : +# 1326| mu1326_2(unknown) = AliasedDefinition : +# 1326| mu1326_3(unknown) = InitializeNonLocal : +# 1327| r1327_1(glval) = VariableAddress[#return] : +# 1327| r1327_2(destructor_only) = Constant[0] : +# 1327| mu1327_3(destructor_only) = Store[#return] : &:r1327_1, r1327_2 +# 1326| r1326_4(glval) = VariableAddress[#return] : +# 1326| v1326_5(void) = ReturnValue : &:r1326_4, ~m? +# 1326| v1326_6(void) = AliasedUse : ~m? +# 1326| v1326_7(void) = ExitFunction : + +# 1365| void temporary_string() +# 1365| Block 0 +# 1365| v1365_1(void) = EnterFunction : +# 1365| mu1365_2(unknown) = AliasedDefinition : +# 1365| mu1365_3(unknown) = InitializeNonLocal : +# 1366| r1366_1(glval) = VariableAddress[s] : +# 1366| r1366_2(glval) = FunctionAddress[returnValue] : +# 1366| r1366_3(String) = Call[returnValue] : func:r1366_2 +# 1366| mu1366_4(unknown) = ^CallSideEffect : ~m? +# 1366| mu1366_5(String) = Store[s] : &:r1366_1, r1366_3 +# 1367| r1367_1(glval) = VariableAddress[rs] : +# 1367| r1367_2(glval) = VariableAddress[#temp1367:24] : +# 1367| r1367_3(glval) = FunctionAddress[returnValue] : +# 1367| r1367_4(String) = Call[returnValue] : func:r1367_3 +# 1367| mu1367_5(unknown) = ^CallSideEffect : ~m? +# 1367| mu1367_6(String) = Store[#temp1367:24] : &:r1367_2, r1367_4 +# 1367| r1367_7(glval) = Convert : r1367_2 +# 1367| r1367_8(String &) = CopyValue : r1367_7 +# 1367| mu1367_9(String &) = Store[rs] : &:r1367_1, r1367_8 +# 1369| r1369_1(glval) = FunctionAddress[acceptRef] : +# 1369| r1369_2(glval) = VariableAddress[s] : +# 1369| r1369_3(glval) = Convert : r1369_2 +# 1369| r1369_4(String &) = CopyValue : r1369_3 +# 1369| v1369_5(void) = Call[acceptRef] : func:r1369_1, 0:r1369_4 +# 1369| mu1369_6(unknown) = ^CallSideEffect : ~m? +# 1369| v1369_7(void) = ^BufferReadSideEffect[0] : &:r1369_4, ~m? +# 1369| mu1369_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1369_4 +# 1370| r1370_1(glval) = FunctionAddress[acceptRef] : +# 1370| r1370_2(glval) = VariableAddress[#temp1370:23] : +# 1370| mu1370_3(String) = Uninitialized[#temp1370:23] : &:r1370_2 +# 1370| r1370_4(glval) = FunctionAddress[String] : +# 1370| r1370_5(glval) = StringConstant["foo"] : +# 1370| r1370_6(char *) = Convert : r1370_5 +# 1370| v1370_7(void) = Call[String] : func:r1370_4, this:r1370_2, 0:r1370_6 +# 1370| mu1370_8(unknown) = ^CallSideEffect : ~m? +# 1370| mu1370_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1370_2 +# 1370| v1370_10(void) = ^BufferReadSideEffect[0] : &:r1370_6, ~m? +# 1370| mu1370_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1370_6 +# 1370| r1370_12(String &) = CopyValue : r1370_2 +# 1370| v1370_13(void) = Call[acceptRef] : func:r1370_1, 0:r1370_12 +# 1370| mu1370_14(unknown) = ^CallSideEffect : ~m? +# 1370| v1370_15(void) = ^BufferReadSideEffect[0] : &:r1370_12, ~m? +# 1370| mu1370_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r1370_12 +# 1371| r1371_1(glval) = FunctionAddress[acceptValue] : +# 1371| r1371_2(glval) = VariableAddress[#temp1371:17] : +# 1371| mu1371_3(String) = Uninitialized[#temp1371:17] : &:r1371_2 +# 1371| r1371_4(glval) = FunctionAddress[String] : +# 1371| r1371_5(glval) = VariableAddress[s] : +# 1371| r1371_6(glval) = Convert : r1371_5 +# 1371| r1371_7(String &) = CopyValue : r1371_6 +# 1371| v1371_8(void) = Call[String] : func:r1371_4, this:r1371_2, 0:r1371_7 +# 1371| mu1371_9(unknown) = ^CallSideEffect : ~m? +# 1371| mu1371_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1371_2 +# 1371| v1371_11(void) = ^BufferReadSideEffect[0] : &:r1371_7, ~m? +# 1371| mu1371_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1371_7 +# 1371| r1371_13(String) = Load[#temp1371:17] : &:r1371_2, ~m? +# 1371| v1371_14(void) = Call[acceptValue] : func:r1371_1, 0:r1371_13 +# 1371| mu1371_15(unknown) = ^CallSideEffect : ~m? +# 1372| r1372_1(glval) = FunctionAddress[acceptValue] : +# 1372| r1372_2(glval) = VariableAddress[#temp1372:25] : +# 1372| mu1372_3(String) = Uninitialized[#temp1372:25] : &:r1372_2 +# 1372| r1372_4(glval) = FunctionAddress[String] : +# 1372| r1372_5(glval) = StringConstant["foo"] : +# 1372| r1372_6(char *) = Convert : r1372_5 +# 1372| v1372_7(void) = Call[String] : func:r1372_4, this:r1372_2, 0:r1372_6 +# 1372| mu1372_8(unknown) = ^CallSideEffect : ~m? +# 1372| mu1372_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1372_2 +# 1372| v1372_10(void) = ^BufferReadSideEffect[0] : &:r1372_6, ~m? +# 1372| mu1372_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1372_6 +# 1372| r1372_12(String) = Load[#temp1372:25] : &:r1372_2, ~m? +# 1372| v1372_13(void) = Call[acceptValue] : func:r1372_1, 0:r1372_12 +# 1372| mu1372_14(unknown) = ^CallSideEffect : ~m? +# 1373| r1373_1(glval) = VariableAddress[#temp1373:5] : +# 1373| mu1373_2(String) = Uninitialized[#temp1373:5] : &:r1373_1 +# 1373| r1373_3(glval) = FunctionAddress[String] : +# 1373| v1373_4(void) = Call[String] : func:r1373_3, this:r1373_1 +# 1373| mu1373_5(unknown) = ^CallSideEffect : ~m? +# 1373| mu1373_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_1 +# 1373| r1373_7(glval) = Convert : r1373_1 +# 1373| r1373_8(glval) = FunctionAddress[c_str] : +# 1373| r1373_9(char *) = Call[c_str] : func:r1373_8, this:r1373_7 +# 1373| mu1373_10(unknown) = ^CallSideEffect : ~m? +# 1373| v1373_11(void) = ^BufferReadSideEffect[-1] : &:r1373_7, ~m? +# 1373| mu1373_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1373_7 +# 1374| r1374_1(glval) = VariableAddress[#temp1374:5] : +# 1374| r1374_2(glval) = FunctionAddress[returnValue] : +# 1374| r1374_3(String) = Call[returnValue] : func:r1374_2 +# 1374| mu1374_4(unknown) = ^CallSideEffect : ~m? +# 1374| mu1374_5(String) = Store[#temp1374:5] : &:r1374_1, r1374_3 +# 1374| r1374_6(glval) = Convert : r1374_1 +# 1374| r1374_7(glval) = FunctionAddress[c_str] : +# 1374| r1374_8(char *) = Call[c_str] : func:r1374_7, this:r1374_6 +# 1374| mu1374_9(unknown) = ^CallSideEffect : ~m? +# 1374| v1374_10(void) = ^BufferReadSideEffect[-1] : &:r1374_6, ~m? +# 1374| mu1374_11(String) = ^IndirectMayWriteSideEffect[-1] : &:r1374_6 +# 1376| r1376_1(glval) = VariableAddress[#temp1376:5] : +# 1376| r1376_2(glval) = FunctionAddress[defaultConstruct] : +# 1376| r1376_3(String) = Call[defaultConstruct] : func:r1376_2 +# 1376| mu1376_4(unknown) = ^CallSideEffect : ~m? +# 1376| mu1376_5(String) = Store[#temp1376:5] : &:r1376_1, r1376_3 +# 1376| r1376_6(String) = Load[#temp1376:5] : &:r1376_1, ~m? +# 1377| v1377_1(void) = NoOp : +# 1365| v1365_4(void) = ReturnVoid : +# 1365| v1365_5(void) = AliasedUse : ~m? +# 1365| v1365_6(void) = ExitFunction : + +# 1379| void temporary_destructor_only() +# 1379| Block 0 +# 1379| v1379_1(void) = EnterFunction : +# 1379| mu1379_2(unknown) = AliasedDefinition : +# 1379| mu1379_3(unknown) = InitializeNonLocal : +# 1380| r1380_1(glval) = VariableAddress[d] : +# 1380| r1380_2(glval) = FunctionAddress[returnValue] : +# 1380| r1380_3(destructor_only) = Call[returnValue] : func:r1380_2 +# 1380| mu1380_4(unknown) = ^CallSideEffect : ~m? +# 1380| mu1380_5(destructor_only) = Store[d] : &:r1380_1, r1380_3 +# 1381| r1381_1(glval) = VariableAddress[rd] : +# 1381| r1381_2(glval) = VariableAddress[#temp1381:33] : +# 1381| r1381_3(glval) = FunctionAddress[returnValue] : +# 1381| r1381_4(destructor_only) = Call[returnValue] : func:r1381_3 +# 1381| mu1381_5(unknown) = ^CallSideEffect : ~m? +# 1381| mu1381_6(destructor_only) = Store[#temp1381:33] : &:r1381_2, r1381_4 +# 1381| r1381_7(glval) = Convert : r1381_2 +# 1381| r1381_8(destructor_only &) = CopyValue : r1381_7 +# 1381| mu1381_9(destructor_only &) = Store[rd] : &:r1381_1, r1381_8 +# 1382| r1382_1(glval) = VariableAddress[d2] : +# 1382| mu1382_2(destructor_only) = Uninitialized[d2] : &:r1382_1 +# 1383| r1383_1(glval) = FunctionAddress[acceptRef] : +# 1383| r1383_2(glval) = VariableAddress[d] : +# 1383| r1383_3(glval) = Convert : r1383_2 +# 1383| r1383_4(destructor_only &) = CopyValue : r1383_3 +# 1383| v1383_5(void) = Call[acceptRef] : func:r1383_1, 0:r1383_4 +# 1383| mu1383_6(unknown) = ^CallSideEffect : ~m? +# 1383| v1383_7(void) = ^BufferReadSideEffect[0] : &:r1383_4, ~m? +# 1383| mu1383_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1383_4 +# 1384| r1384_1(glval) = FunctionAddress[acceptValue] : +# 1384| r1384_2(glval) = VariableAddress[#temp1384:17] : +# 1384| r1384_3(glval) = VariableAddress[d] : +# 1384| r1384_4(destructor_only) = Load[d] : &:r1384_3, ~m? +# 1384| mu1384_5(destructor_only) = Store[#temp1384:17] : &:r1384_2, r1384_4 +# 1384| r1384_6(destructor_only) = Load[#temp1384:17] : &:r1384_2, ~m? +# 1384| v1384_7(void) = Call[acceptValue] : func:r1384_1, 0:r1384_6 +# 1384| mu1384_8(unknown) = ^CallSideEffect : ~m? +# 1385| r1385_1(glval) = VariableAddress[#temp1385:5] : +# 1385| r1385_2(destructor_only) = Constant[0] : +# 1385| mu1385_3(destructor_only) = Store[#temp1385:5] : &:r1385_1, r1385_2 +# 1385| r1385_4(glval) = FunctionAddress[method] : +# 1385| v1385_5(void) = Call[method] : func:r1385_4, this:r1385_1 +# 1385| mu1385_6(unknown) = ^CallSideEffect : ~m? +# 1385| v1385_7(void) = ^BufferReadSideEffect[-1] : &:r1385_1, ~m? +# 1385| mu1385_8(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1385_1 +# 1386| r1386_1(glval) = VariableAddress[#temp1386:5] : +# 1386| r1386_2(glval) = FunctionAddress[returnValue] : +# 1386| r1386_3(destructor_only) = Call[returnValue] : func:r1386_2 +# 1386| mu1386_4(unknown) = ^CallSideEffect : ~m? +# 1386| mu1386_5(destructor_only) = Store[#temp1386:5] : &:r1386_1, r1386_3 +# 1386| r1386_6(glval) = FunctionAddress[method] : +# 1386| v1386_7(void) = Call[method] : func:r1386_6, this:r1386_1 +# 1386| mu1386_8(unknown) = ^CallSideEffect : ~m? +# 1386| v1386_9(void) = ^BufferReadSideEffect[-1] : &:r1386_1, ~m? +# 1386| mu1386_10(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1386_1 +# 1388| r1388_1(glval) = VariableAddress[#temp1388:5] : +# 1388| r1388_2(glval) = FunctionAddress[defaultConstruct] : +# 1388| r1388_3(destructor_only) = Call[defaultConstruct] : func:r1388_2 +# 1388| mu1388_4(unknown) = ^CallSideEffect : ~m? +# 1388| mu1388_5(destructor_only) = Store[#temp1388:5] : &:r1388_1, r1388_3 +# 1388| r1388_6(destructor_only) = Load[#temp1388:5] : &:r1388_1, ~m? +# 1389| v1389_1(void) = NoOp : +# 1379| v1379_4(void) = ReturnVoid : +# 1379| v1379_5(void) = AliasedUse : ~m? +# 1379| v1379_6(void) = ExitFunction : + +# 1391| void temporary_copy_constructor() +# 1391| Block 0 +# 1391| v1391_1(void) = EnterFunction : +# 1391| mu1391_2(unknown) = AliasedDefinition : +# 1391| mu1391_3(unknown) = InitializeNonLocal : +# 1392| r1392_1(glval) = VariableAddress[d] : +# 1392| r1392_2(glval) = FunctionAddress[returnValue] : +# 1392| r1392_3(copy_constructor) = Call[returnValue] : func:r1392_2 +# 1392| mu1392_4(unknown) = ^CallSideEffect : ~m? +# 1392| mu1392_5(copy_constructor) = Store[d] : &:r1392_1, r1392_3 +# 1393| r1393_1(glval) = VariableAddress[rd] : +# 1393| r1393_2(glval) = VariableAddress[#temp1393:34] : +# 1393| r1393_3(glval) = FunctionAddress[returnValue] : +# 1393| r1393_4(copy_constructor) = Call[returnValue] : func:r1393_3 +# 1393| mu1393_5(unknown) = ^CallSideEffect : ~m? +# 1393| mu1393_6(copy_constructor) = Store[#temp1393:34] : &:r1393_2, r1393_4 +# 1393| r1393_7(glval) = Convert : r1393_2 +# 1393| r1393_8(copy_constructor &) = CopyValue : r1393_7 +# 1393| mu1393_9(copy_constructor &) = Store[rd] : &:r1393_1, r1393_8 +# 1394| r1394_1(glval) = VariableAddress[d2] : +# 1394| mu1394_2(copy_constructor) = Uninitialized[d2] : &:r1394_1 +# 1394| r1394_3(glval) = FunctionAddress[copy_constructor] : +# 1394| v1394_4(void) = Call[copy_constructor] : func:r1394_3, this:r1394_1 +# 1394| mu1394_5(unknown) = ^CallSideEffect : ~m? +# 1394| mu1394_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1394_1 +# 1395| r1395_1(glval) = FunctionAddress[acceptRef] : +# 1395| r1395_2(glval) = VariableAddress[d] : +# 1395| r1395_3(glval) = Convert : r1395_2 +# 1395| r1395_4(copy_constructor &) = CopyValue : r1395_3 +# 1395| v1395_5(void) = Call[acceptRef] : func:r1395_1, 0:r1395_4 +# 1395| mu1395_6(unknown) = ^CallSideEffect : ~m? +# 1395| v1395_7(void) = ^BufferReadSideEffect[0] : &:r1395_4, ~m? +# 1395| mu1395_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1395_4 +# 1396| r1396_1(glval) = FunctionAddress[acceptValue] : +# 1396| r1396_2(glval) = VariableAddress[#temp1396:17] : +# 1396| mu1396_3(copy_constructor) = Uninitialized[#temp1396:17] : &:r1396_2 +# 1396| r1396_4(glval) = FunctionAddress[copy_constructor] : +# 1396| r1396_5(glval) = VariableAddress[d] : +# 1396| r1396_6(glval) = Convert : r1396_5 +# 1396| r1396_7(copy_constructor &) = CopyValue : r1396_6 +# 1396| v1396_8(void) = Call[copy_constructor] : func:r1396_4, this:r1396_2, 0:r1396_7 +# 1396| mu1396_9(unknown) = ^CallSideEffect : ~m? +# 1396| mu1396_10(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1396_2 +# 1396| v1396_11(void) = ^BufferReadSideEffect[0] : &:r1396_7, ~m? +# 1396| mu1396_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1396_7 +# 1396| r1396_13(copy_constructor) = Load[#temp1396:17] : &:r1396_2, ~m? +# 1396| v1396_14(void) = Call[acceptValue] : func:r1396_1, 0:r1396_13 +# 1396| mu1396_15(unknown) = ^CallSideEffect : ~m? +# 1397| r1397_1(glval) = VariableAddress[#temp1397:5] : +# 1397| mu1397_2(copy_constructor) = Uninitialized[#temp1397:5] : &:r1397_1 +# 1397| r1397_3(glval) = FunctionAddress[copy_constructor] : +# 1397| v1397_4(void) = Call[copy_constructor] : func:r1397_3, this:r1397_1 +# 1397| mu1397_5(unknown) = ^CallSideEffect : ~m? +# 1397| mu1397_6(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 +# 1397| r1397_7(glval) = FunctionAddress[method] : +# 1397| v1397_8(void) = Call[method] : func:r1397_7, this:r1397_1 +# 1397| mu1397_9(unknown) = ^CallSideEffect : ~m? +# 1397| v1397_10(void) = ^BufferReadSideEffect[-1] : &:r1397_1, ~m? +# 1397| mu1397_11(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1397_1 +# 1398| r1398_1(glval) = VariableAddress[#temp1398:5] : +# 1398| r1398_2(glval) = FunctionAddress[returnValue] : +# 1398| r1398_3(copy_constructor) = Call[returnValue] : func:r1398_2 +# 1398| mu1398_4(unknown) = ^CallSideEffect : ~m? +# 1398| mu1398_5(copy_constructor) = Store[#temp1398:5] : &:r1398_1, r1398_3 +# 1398| r1398_6(glval) = FunctionAddress[method] : +# 1398| v1398_7(void) = Call[method] : func:r1398_6, this:r1398_1 +# 1398| mu1398_8(unknown) = ^CallSideEffect : ~m? +# 1398| v1398_9(void) = ^BufferReadSideEffect[-1] : &:r1398_1, ~m? +# 1398| mu1398_10(copy_constructor) = ^IndirectMayWriteSideEffect[-1] : &:r1398_1 +# 1399| r1399_1(glval) = VariableAddress[#temp1399:5] : +# 1399| r1399_2(glval) = FunctionAddress[defaultConstruct] : +# 1399| r1399_3(copy_constructor) = Call[defaultConstruct] : func:r1399_2 +# 1399| mu1399_4(unknown) = ^CallSideEffect : ~m? +# 1399| mu1399_5(copy_constructor) = Store[#temp1399:5] : &:r1399_1, r1399_3 +# 1399| r1399_6(copy_constructor) = Load[#temp1399:5] : &:r1399_1, ~m? +# 1401| r1401_1(glval) = VariableAddress[y] : +# 1401| r1401_2(glval) = VariableAddress[#temp1401:13] : +# 1401| r1401_3(glval) = FunctionAddress[returnValue] : +# 1401| r1401_4(copy_constructor) = Call[returnValue] : func:r1401_3 +# 1401| mu1401_5(unknown) = ^CallSideEffect : ~m? +# 1401| mu1401_6(copy_constructor) = Store[#temp1401:13] : &:r1401_2, r1401_4 +# 1401| r1401_7(glval) = FieldAddress[y] : r1401_2 +# 1401| r1401_8(int) = Load[?] : &:r1401_7, ~m? +# 1401| mu1401_9(int) = Store[y] : &:r1401_1, r1401_8 +# 1402| v1402_1(void) = NoOp : +# 1391| v1391_4(void) = ReturnVoid : +# 1391| v1391_5(void) = AliasedUse : ~m? +# 1391| v1391_6(void) = ExitFunction : + +# 1404| void temporary_point() +# 1404| Block 0 +# 1404| v1404_1(void) = EnterFunction : +# 1404| mu1404_2(unknown) = AliasedDefinition : +# 1404| mu1404_3(unknown) = InitializeNonLocal : +# 1405| r1405_1(glval) = VariableAddress[p] : +# 1405| r1405_2(glval) = FunctionAddress[returnValue] : +# 1405| r1405_3(Point) = Call[returnValue] : func:r1405_2 +# 1405| mu1405_4(unknown) = ^CallSideEffect : ~m? +# 1405| mu1405_5(Point) = Store[p] : &:r1405_1, r1405_3 +# 1406| r1406_1(glval) = VariableAddress[rp] : +# 1406| r1406_2(glval) = VariableAddress[#temp1406:23] : +# 1406| r1406_3(glval) = FunctionAddress[returnValue] : +# 1406| r1406_4(Point) = Call[returnValue] : func:r1406_3 +# 1406| mu1406_5(unknown) = ^CallSideEffect : ~m? +# 1406| mu1406_6(Point) = Store[#temp1406:23] : &:r1406_2, r1406_4 +# 1406| r1406_7(glval) = Convert : r1406_2 +# 1406| r1406_8(Point &) = CopyValue : r1406_7 +# 1406| mu1406_9(Point &) = Store[rp] : &:r1406_1, r1406_8 +# 1408| r1408_1(glval) = FunctionAddress[acceptRef] : +# 1408| r1408_2(glval) = VariableAddress[p] : +# 1408| r1408_3(glval) = Convert : r1408_2 +# 1408| r1408_4(Point &) = CopyValue : r1408_3 +# 1408| v1408_5(void) = Call[acceptRef] : func:r1408_1, 0:r1408_4 +# 1408| mu1408_6(unknown) = ^CallSideEffect : ~m? +# 1408| v1408_7(void) = ^BufferReadSideEffect[0] : &:r1408_4, ~m? +# 1408| mu1408_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r1408_4 +# 1409| r1409_1(glval) = FunctionAddress[acceptValue] : +# 1409| r1409_2(glval) = VariableAddress[p] : +# 1409| r1409_3(Point) = Load[p] : &:r1409_2, ~m? +# 1409| v1409_4(void) = Call[acceptValue] : func:r1409_1, 0:r1409_3 +# 1409| mu1409_5(unknown) = ^CallSideEffect : ~m? +# 1410| r1410_1(int) = Constant[0] : +# 1411| r1411_1(glval) = VariableAddress[y] : +# 1411| r1411_2(glval) = FunctionAddress[returnValue] : +# 1411| r1411_3(Point) = Call[returnValue] : func:r1411_2 +# 1411| mu1411_4(unknown) = ^CallSideEffect : ~m? +# 1411| r1411_5(glval) = VariableAddress[#temp1411:13] : +# 1411| mu1411_6(Point) = Store[#temp1411:13] : &:r1411_5, r1411_3 +# 1411| r1411_7(glval) = FieldAddress[y] : r1411_5 +# 1411| r1411_8(int) = Load[?] : &:r1411_7, ~m? +# 1411| mu1411_9(int) = Store[y] : &:r1411_1, r1411_8 +# 1413| r1413_1(glval) = FunctionAddress[defaultConstruct] : +# 1413| r1413_2(Point) = Call[defaultConstruct] : func:r1413_1 +# 1413| mu1413_3(unknown) = ^CallSideEffect : ~m? +# 1414| v1414_1(void) = NoOp : +# 1404| v1404_4(void) = ReturnVoid : +# 1404| v1404_5(void) = AliasedUse : ~m? +# 1404| v1404_6(void) = ExitFunction : + +# 1421| void temporary_unusual_fields() +# 1421| Block 0 +# 1421| v1421_1(void) = EnterFunction : +# 1421| mu1421_2(unknown) = AliasedDefinition : +# 1421| mu1421_3(unknown) = InitializeNonLocal : +# 1422| r1422_1(glval) = VariableAddress[rx] : +# 1422| r1422_2(glval) = FunctionAddress[returnValue] : +# 1422| r1422_3(UnusualFields) = Call[returnValue] : func:r1422_2 +# 1422| mu1422_4(unknown) = ^CallSideEffect : ~m? +# 1422| r1422_5(glval) = VariableAddress[#temp1422:21] : +# 1422| mu1422_6(UnusualFields) = Store[#temp1422:21] : &:r1422_5, r1422_3 +# 1422| r1422_7(glval) = FieldAddress[r] : r1422_5 +# 1422| r1422_8(int &) = Load[?] : &:r1422_7, ~m? +# 1422| r1422_9(glval) = CopyValue : r1422_8 +# 1422| r1422_10(glval) = Convert : r1422_9 +# 1422| r1422_11(int &) = CopyValue : r1422_10 +# 1422| mu1422_12(int &) = Store[rx] : &:r1422_1, r1422_11 +# 1423| r1423_1(glval) = VariableAddress[x] : +# 1423| r1423_2(glval) = FunctionAddress[returnValue] : +# 1423| r1423_3(UnusualFields) = Call[returnValue] : func:r1423_2 +# 1423| mu1423_4(unknown) = ^CallSideEffect : ~m? +# 1423| r1423_5(glval) = VariableAddress[#temp1423:13] : +# 1423| mu1423_6(UnusualFields) = Store[#temp1423:13] : &:r1423_5, r1423_3 +# 1423| r1423_7(glval) = FieldAddress[r] : r1423_5 +# 1423| r1423_8(int &) = Load[?] : &:r1423_7, ~m? +# 1423| r1423_9(int) = Load[?] : &:r1423_8, ~m? +# 1423| mu1423_10(int) = Store[x] : &:r1423_1, r1423_9 +# 1425| r1425_1(glval) = VariableAddress[rf] : +# 1425| r1425_2(glval) = FunctionAddress[returnValue] : +# 1425| r1425_3(UnusualFields) = Call[returnValue] : func:r1425_2 +# 1425| mu1425_4(unknown) = ^CallSideEffect : ~m? +# 1425| r1425_5(glval) = VariableAddress[#temp1425:23] : +# 1425| mu1425_6(UnusualFields) = Store[#temp1425:23] : &:r1425_5, r1425_3 +# 1425| r1425_7(glval) = FieldAddress[a] : r1425_5 +# 1425| r1425_8(float *) = Convert : r1425_7 +# 1425| r1425_9(int) = Constant[3] : +# 1425| r1425_10(glval) = PointerAdd[4] : r1425_8, r1425_9 +# 1425| r1425_11(glval) = Convert : r1425_10 +# 1425| r1425_12(float &) = CopyValue : r1425_11 +# 1425| mu1425_13(float &) = Store[rf] : &:r1425_1, r1425_12 +# 1426| r1426_1(glval) = VariableAddress[f] : +# 1426| r1426_2(glval) = FunctionAddress[returnValue] : +# 1426| r1426_3(UnusualFields) = Call[returnValue] : func:r1426_2 +# 1426| mu1426_4(unknown) = ^CallSideEffect : ~m? +# 1426| r1426_5(glval) = VariableAddress[#temp1426:15] : +# 1426| mu1426_6(UnusualFields) = Store[#temp1426:15] : &:r1426_5, r1426_3 +# 1426| r1426_7(glval) = FieldAddress[a] : r1426_5 +# 1426| r1426_8(float *) = Convert : r1426_7 +# 1426| r1426_9(int) = Constant[5] : +# 1426| r1426_10(glval) = PointerAdd[4] : r1426_8, r1426_9 +# 1426| r1426_11(float) = Load[?] : &:r1426_10, ~m? +# 1426| mu1426_12(float) = Store[f] : &:r1426_1, r1426_11 +# 1427| v1427_1(void) = NoOp : +# 1421| v1421_4(void) = ReturnVoid : +# 1421| v1421_5(void) = AliasedUse : ~m? +# 1421| v1421_6(void) = ExitFunction : + +# 1443| void temporary_hierarchy() +# 1443| Block 0 +# 1443| v1443_1(void) = EnterFunction : +# 1443| mu1443_2(unknown) = AliasedDefinition : +# 1443| mu1443_3(unknown) = InitializeNonLocal : +# 1444| r1444_1(glval) = VariableAddress[b] : +# 1444| r1444_2(glval) = FunctionAddress[returnValue] : +# 1444| r1444_3(POD_Middle) = Call[returnValue] : func:r1444_2 +# 1444| mu1444_4(unknown) = ^CallSideEffect : ~m? +# 1444| r1444_5(glval) = VariableAddress[#temp1444:18] : +# 1444| mu1444_6(POD_Middle) = Store[#temp1444:18] : &:r1444_5, r1444_3 +# 1444| r1444_7(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1444_5 +# 1444| r1444_8(POD_Base) = Load[?] : &:r1444_7, ~m? +# 1444| mu1444_9(POD_Base) = Store[b] : &:r1444_1, r1444_8 +# 1445| r1445_1(glval) = VariableAddress[#temp1445:9] : +# 1445| r1445_2(glval) = FunctionAddress[returnValue] : +# 1445| r1445_3(POD_Derived) = Call[returnValue] : func:r1445_2 +# 1445| mu1445_4(unknown) = ^CallSideEffect : ~m? +# 1445| mu1445_5(POD_Derived) = Store[#temp1445:9] : &:r1445_1, r1445_3 +# 1445| r1445_6(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1445_1 +# 1445| r1445_7(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1445_6 +# 1445| r1445_8(POD_Base) = Load[?] : &:r1445_7, ~m? +# 1445| r1445_9(glval) = VariableAddress[b] : +# 1445| mu1445_10(POD_Base) = Store[b] : &:r1445_9, r1445_8 +# 1446| r1446_1(glval) = VariableAddress[x] : +# 1446| r1446_2(glval) = FunctionAddress[returnValue] : +# 1446| r1446_3(POD_Derived) = Call[returnValue] : func:r1446_2 +# 1446| mu1446_4(unknown) = ^CallSideEffect : ~m? +# 1446| r1446_5(glval) = VariableAddress[#temp1446:13] : +# 1446| mu1446_6(POD_Derived) = Store[#temp1446:13] : &:r1446_5, r1446_3 +# 1446| r1446_7(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1446_5 +# 1446| r1446_8(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1446_7 +# 1446| r1446_9(glval) = FieldAddress[x] : r1446_8 +# 1446| r1446_10(int) = Load[?] : &:r1446_9, ~m? +# 1446| mu1446_11(int) = Store[x] : &:r1446_1, r1446_10 +# 1447| r1447_1(glval) = VariableAddress[f] : +# 1447| r1447_2(glval) = FunctionAddress[returnValue] : +# 1447| r1447_3(POD_Derived) = Call[returnValue] : func:r1447_2 +# 1447| mu1447_4(unknown) = ^CallSideEffect : ~m? +# 1447| r1447_5(glval) = VariableAddress[#temp1447:16] : +# 1447| mu1447_6(POD_Derived) = Store[#temp1447:16] : &:r1447_5, r1447_3 +# 1447| r1447_7(glval) = ConvertToNonVirtualBase[POD_Derived : POD_Middle] : r1447_5 +# 1447| r1447_8(glval) = ConvertToNonVirtualBase[POD_Middle : POD_Base] : r1447_7 +# 1447| r1447_9(glval) = FunctionAddress[f] : +# 1447| r1447_10(float) = Call[f] : func:r1447_9, this:r1447_8 +# 1447| mu1447_11(unknown) = ^CallSideEffect : ~m? +# 1447| v1447_12(void) = ^BufferReadSideEffect[-1] : &:r1447_8, ~m? +# 1447| mu1447_13(POD_Base) = ^IndirectMayWriteSideEffect[-1] : &:r1447_8 +# 1447| mu1447_14(float) = Store[f] : &:r1447_1, r1447_10 +# 1448| v1448_1(void) = NoOp : +# 1443| v1443_4(void) = ReturnVoid : +# 1443| v1443_5(void) = AliasedUse : ~m? +# 1443| v1443_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index 64172ad18738..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand @@ -25,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index 64172ad18738..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -1,8 +1,4 @@ missingOperand -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | unexpectedOperand duplicateOperand missingPhiOperand @@ -25,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected index 1c41692bcaad..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected @@ -21,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected index 1c41692bcaad..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected @@ -21,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected index 1c41692bcaad..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected @@ -21,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected index 1c41692bcaad..31e5b01229ce 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected @@ -21,6 +21,8 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/ptr_to_member/segfault/exprs.expected b/cpp/ql/test/library-tests/ptr_to_member/segfault/exprs.expected index e5539a762ab0..d808cf89139c 100644 --- a/cpp/ql/test/library-tests/ptr_to_member/segfault/exprs.expected +++ b/cpp/ql/test/library-tests/ptr_to_member/segfault/exprs.expected @@ -10,6 +10,9 @@ | segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index | | segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index | | segfault.cpp:25:58:25:64 | 0 | segfault.cpp:12:8:12:12 | index | +| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index | +| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index | +| segfault.cpp:25:58:25:64 | temporary object | segfault.cpp:12:8:12:12 | index | | segfault.cpp:29:23:29:44 | 0 | file://:0:0:0:0 | ..:: * | | segfault.cpp:29:23:29:44 | 0 | file://:0:0:0:0 | ..:: * | | segfault.cpp:29:23:29:44 | constructor init of field second | file://:0:0:0:0 | ..:: * | @@ -23,10 +26,14 @@ | segfault.cpp:35:9:35:56 | call to S | file://:0:0:0:0 | void | | segfault.cpp:35:9:35:56 | new | file://:0:0:0:0 | S<..(*)(..)> * | | segfault.cpp:35:24:35:46 | 0 | segfault.cpp:9:8:9:28 | piecewise_construct_t | +| segfault.cpp:35:24:35:46 | temporary object | segfault.cpp:9:8:9:28 | piecewise_construct_t | | segfault.cpp:35:49:35:55 | 0 | segfault.cpp:15:7:15:11 | tuple | +| segfault.cpp:35:49:35:55 | temporary object | segfault.cpp:15:7:15:11 | tuple | | segfault.cpp:40:5:40:5 | x | file://:0:0:0:0 | S * | | segfault.cpp:40:5:40:54 | ... = ... | file://:0:0:0:0 | S * | | segfault.cpp:40:9:40:54 | call to S | file://:0:0:0:0 | void | | segfault.cpp:40:9:40:54 | new | file://:0:0:0:0 | S * | | segfault.cpp:40:22:40:44 | 0 | segfault.cpp:9:8:9:28 | piecewise_construct_t | +| segfault.cpp:40:22:40:44 | temporary object | segfault.cpp:9:8:9:28 | piecewise_construct_t | | segfault.cpp:40:47:40:53 | 0 | segfault.cpp:15:7:15:11 | tuple | +| segfault.cpp:40:47:40:53 | temporary object | segfault.cpp:15:7:15:11 | tuple | diff --git a/cpp/ql/test/library-tests/question_mark_colon/cfg.expected b/cpp/ql/test/library-tests/question_mark_colon/cfg.expected index 82cda5c6f84c..9fa6fa1b53b9 100644 --- a/cpp/ql/test/library-tests/question_mark_colon/cfg.expected +++ b/cpp/ql/test/library-tests/question_mark_colon/cfg.expected @@ -1,3 +1,4 @@ +| 0 | 1 | file://:0:0:0:0 | temporary object | None | | 2 | 1 | question_mark_colon.c:2:7:2:7 | f | None | | 4 | 1 | question_mark_colon.c:4:14:8:1 | { ... } | declaration | | 4 | 17 | question_mark_colon.c:4:6:4:6 | g | None | diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index 389b3a9496d3..fcfef712b56c 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -1,23 +1,4 @@ missingOperand -| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | -| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | -| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) | -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | | misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() | unexpectedOperand duplicateOperand @@ -32,7 +13,6 @@ instructionWithoutSuccessor | condition_decls.cpp:41:22:41:23 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | | condition_decls.cpp:48:52:48:53 | Chi: call to BoxedInt | Instruction 'Chi: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | misc.c:171:10:171:13 | Uninitialized: definition of str2 | Instruction 'Uninitialized: definition of str2' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | -| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_mix.cpp:11:12:11:15 | Chi: call to C | Instruction 'Chi: call to C' has no successors in function '$@'. | ms_try_mix.cpp:10:6:10:18 | void ms_except_mix(int) | void ms_except_mix(int) | | ms_try_mix.cpp:28:12:28:15 | Chi: call to C | Instruction 'Chi: call to C' has no successors in function '$@'. | ms_try_mix.cpp:27:6:27:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | @@ -113,6 +93,11 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer +| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | +| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | +| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType 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 20f8815f2be7..25a9cf7a016d 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 @@ -1558,6 +1558,9 @@ postWithInFlow | misc.c:158:14:158:18 | Chi | PostUpdateNode should not be the target of local flow. | | misc.c:160:31:160:33 | Chi | PostUpdateNode should not be the target of local flow. | | misc.c:160:31:160:33 | Chi | PostUpdateNode should not be the target of local flow. | +| misc.c:220:3:223:3 | Chi | PostUpdateNode should not be the target of local flow. | +| misc.c:221:10:221:10 | Chi | PostUpdateNode should not be the target of local flow. | +| misc.c:222:10:222:10 | Chi | PostUpdateNode should not be the target of local flow. | | range_analysis.c:102:5:102:15 | Chi | PostUpdateNode should not be the target of local flow. | | static_init_templates.cpp:3:2:3:8 | Chi | PostUpdateNode should not be the target of local flow. | | static_init_templates.cpp:21:2:21:12 | Chi | PostUpdateNode should not be the target of local flow. | diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index 61da658e201c..d6612e5bfade 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -3,29 +3,7 @@ missingOperand | condition_decls.cpp:26:10:26:24 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:25:6:25:21 | void switch_decl_bind(int) | void switch_decl_bind(int) | | condition_decls.cpp:41:9:41:23 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | | condition_decls.cpp:48:39:48:53 | CopyValue: (condition decl) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | -| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | -| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | -| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) | -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | | misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() | -| misc.c:220:3:223:3 | Store: ... = ... | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:220:9:223:3 | FieldAddress: {...} | Instruction 'FieldAddress' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | try_catch.cpp:23:5:23:18 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | try_catch.cpp:19:6:19:23 | void throw_from_nonstmt(int) | void throw_from_nonstmt(int) | unexpectedOperand duplicateOperand @@ -53,9 +31,6 @@ instructionWithoutSuccessor | misc.c:174:17:174:22 | CallSideEffect: call to getInt | Instruction 'CallSideEffect: call to getInt' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | | misc.c:174:30:174:35 | CallSideEffect: call to getInt | Instruction 'CallSideEffect: call to getInt' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | | misc.c:174:55:174:60 | Store: (char ****)... | Instruction 'Store: (char ****)...' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | -| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:221:10:221:10 | Store: 1 | Instruction 'Store: 1' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | -| misc.c:222:10:222:10 | Store: 2 | Instruction 'Store: 2' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_except.cpp:7:13:7:17 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_except.cpp:9:19:9:19 | Load: j | Instruction 'Load: j' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | @@ -168,6 +143,11 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer +| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | +| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | +| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index 4307483dfee4..56e9f2e881a3 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -1,23 +1,4 @@ missingOperand -| conditional_destructors.cpp:30:9:30:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:30:18:30:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:9:33:13 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:33:18:33:22 | IndirectMayWriteSideEffect: call to C1 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:29:6:29:7 | void f1() | void f1() | -| conditional_destructors.cpp:39:9:39:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:39:18:39:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:9:42:13 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| conditional_destructors.cpp:42:18:42:22 | IndirectMayWriteSideEffect: call to C2 | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | conditional_destructors.cpp:38:6:38:7 | void f2() | void f2() | -| cpp11.cpp:77:19:77:21 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:76:8:76:8 | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | void lambda::apply<(void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)>(lambda::Val, (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)) | -| cpp11.cpp:82:11:82:14 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:81:8:81:8 | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val) | -| cpp11.cpp:82:45:82:48 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:82:51:82:51 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:82:20:82:20 | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | void (void lambda::apply2(int(*)(lambda::Val, lambda::Val), lambda::Val, lambda::Val))::(lambda [] type at line 82, col. 17)::operator()(lambda::Val) const | -| cpp11.cpp:88:25:88:30 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| cpp11.cpp:88:33:88:38 | IndirectMayWriteSideEffect: call to Val | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | cpp11.cpp:87:8:87:11 | void lambda::main() | void lambda::main() | -| destructors.cpp:51:36:51:38 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | destructors.cpp:49:7:49:7 | int cond_destruct::f(int) | int cond_destruct::f(int) | -| ir.cpp:809:7:809:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:810:7:810:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:823:7:823:13 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | -| ir.cpp:824:7:824:26 | IndirectMayWriteSideEffect: call to Base | Instruction 'IndirectMayWriteSideEffect' is missing an expected operand with tag 'Address' in function '$@'. | ir.cpp:799:6:799:25 | void HierarchyConversions() | void HierarchyConversions() | | misc.c:125:5:125:11 | CopyValue: (statement expression) | Instruction 'CopyValue' is missing an expected operand with tag 'Unary' in function '$@'. | misc.c:97:6:97:10 | void misc3() | void misc3() | unexpectedOperand duplicateOperand @@ -32,7 +13,6 @@ instructionWithoutSuccessor | condition_decls.cpp:41:22:41:23 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:40:6:40:20 | void while_decl_bind(int) | void while_decl_bind(int) | | condition_decls.cpp:48:52:48:53 | IndirectMayWriteSideEffect: call to BoxedInt | Instruction 'IndirectMayWriteSideEffect: call to BoxedInt' has no successors in function '$@'. | condition_decls.cpp:47:6:47:18 | void for_decl_bind(int) | void for_decl_bind(int) | | misc.c:171:10:171:13 | Uninitialized: definition of str2 | Instruction 'Uninitialized: definition of str2' has no successors in function '$@'. | misc.c:168:6:168:8 | void vla() | void vla() | -| misc.c:219:47:219:48 | InitializeIndirection: sp | Instruction 'InitializeIndirection: sp' has no successors in function '$@'. | misc.c:219:5:219:26 | int assign_designated_init(someStruct*) | int assign_designated_init(someStruct*) | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | Instruction 'Uninitialized: definition of x' has no successors in function '$@'. | ms_try_except.cpp:2:6:2:18 | void ms_try_except(int) | void ms_try_except(int) | | ms_try_mix.cpp:11:12:11:15 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect: call to C' has no successors in function '$@'. | ms_try_mix.cpp:10:6:10:18 | void ms_except_mix(int) | void ms_except_mix(int) | | ms_try_mix.cpp:28:12:28:15 | IndirectMayWriteSideEffect: call to C | Instruction 'IndirectMayWriteSideEffect: call to C' has no successors in function '$@'. | ms_try_mix.cpp:27:6:27:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | @@ -113,6 +93,11 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +thisArgumentIsNonPointer +| pmcallexpr.cpp:8:2:8:15 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | array_delete.cpp:5:6:5:6 | void f() | void f() | +| pointer_to_member.cpp:23:5:23:54 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | +| pointer_to_member.cpp:24:5:24:49 | Call: call to expression | Call instruction 'Call: call to expression' has a `this` argument operand that is not an address, in function '$@'. | pointer_to_member.cpp:14:5:14:9 | int usePM(int PM::*) | int usePM(int PM::*) | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/types/unspecified/exprs.expected b/cpp/ql/test/library-tests/types/unspecified/exprs.expected index ac49b6d061b8..93ae19533321 100644 --- a/cpp/ql/test/library-tests/types/unspecified/exprs.expected +++ b/cpp/ql/test/library-tests/types/unspecified/exprs.expected @@ -10,6 +10,7 @@ | test.cpp:13:15:13:15 | constructor init of field d | struct D | struct D | | test.cpp:19:30:19:30 | (reference to) | reference to {const {struct E}} | reference to {struct E} | | test.cpp:19:30:19:30 | call to E | void | void | +| test.cpp:19:30:19:30 | temporary object | const {struct E} | struct E | | test.cpp:19:30:19:30 | w | pointer to {int} | pointer to {int} | | test.cpp:23:12:23:12 | (const F *)... | pointer to {const {struct F}} | pointer to {struct F} | | test.cpp:23:12:23:12 | f | pointer to {struct F} | pointer to {struct F} | diff --git a/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected b/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected index 9d0e0c7773a7..a8b58e652589 100644 --- a/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected +++ b/cpp/ql/test/library-tests/virtual_functions/cfg/cfg.expected @@ -1,149 +1,149 @@ -| Base::Base | false | 215 | 215 | Base | -| Base::Base | false | 220 | 220 | return ... | -| Base::Base | false | 222 | 222 | { ... } | -| Base::Base | false | 363 | 363 | Base | -| Base::Base | false | 367 | 367 | Base | -| Base::Base | true | 220 | 215 | | -| Base::Base | true | 222 | 220 | | -| Base::Base_f | false | 407 | 407 | Base_f | -| Base::Base_f | false | 412 | 412 | declaration | -| Base::Base_f | false | 416 | 416 | 1 | -| Base::Base_f | false | 417 | 417 | return ... | -| Base::Base_f | false | 419 | 419 | { ... } | -| Base::Base_f | false | 424 | 424 | call to f | -| Base::Base_f | false | 426 | 426 | this | -| Base::Base_f | false | 427 | 427 | initializer for i | -| Base::Base_f | true | 412 | 427 | | -| Base::Base_f | true | 416 | 407 | | -| Base::Base_f | true | 417 | 416 | | -| Base::Base_f | true | 419 | 412 | | -| Base::Base_f | true | 426 | 424 | | -| Base::Base_f | true | 427 | 426 | | -| Base::Base_g | false | 371 | 371 | Base_g | -| Base::Base_g | false | 376 | 376 | declaration | -| Base::Base_g | false | 380 | 380 | 4 | -| Base::Base_g | false | 381 | 381 | return ... | -| Base::Base_g | false | 383 | 383 | { ... } | -| Base::Base_g | false | 388 | 388 | call to g | -| Base::Base_g | false | 391 | 391 | this | -| Base::Base_g | false | 392 | 392 | initializer for i | -| Base::Base_g | true | 376 | 392 | | -| Base::Base_g | true | 380 | 371 | | -| Base::Base_g | true | 381 | 380 | | -| Base::Base_g | true | 383 | 376 | | -| Base::Base_g | true | 388 | 381 | | -| Base::Base_g | true | 391 | 388 | | -| Base::Base_g | true | 392 | 391 | | -| Base::f | false | 301 | 301 | f | -| Base::f | false | 437 | 437 | call to abort | -| Base::f | false | 439 | 439 | ExprStmt | -| Base::f | false | 441 | 441 | return ... | -| Base::f | false | 443 | 443 | { ... } | -| Base::f | true | 439 | 437 | | -| Base::f | true | 441 | 301 | | -| Base::f | true | 443 | 439 | | -| Base::g | false | 230 | 230 | g | -| Base::g | false | 402 | 402 | 3 | -| Base::g | false | 403 | 403 | return ... | -| Base::g | false | 405 | 405 | { ... } | -| Base::g | true | 402 | 230 | | -| Base::g | true | 403 | 402 | | -| Base::g | true | 405 | 403 | | -| Base::operator= | false | 349 | 349 | operator= | -| Base::operator= | false | 359 | 359 | operator= | -| __va_list_tag::operator= | false | 92 | 92 | operator= | -| __va_list_tag::operator= | false | 99 | 99 | operator= | -| abort | false | 345 | 345 | abort | -| fun_f1 | false | 312 | 312 | fun_f1 | -| fun_f1 | false | 317 | 317 | declaration | -| fun_f1 | false | 319 | 319 | declaration | -| fun_f1 | false | 323 | 323 | 2 | -| fun_f1 | false | 324 | 324 | return ... | -| fun_f1 | false | 326 | 326 | { ... } | -| fun_f1 | false | 329 | 329 | call to Base | -| fun_f1 | false | 330 | 330 | new | -| fun_f1 | false | 332 | 332 | initializer for p1 | -| fun_f1 | false | 337 | 337 | call to f | -| fun_f1 | false | 339 | 339 | p1 | -| fun_f1 | false | 341 | 341 | initializer for i | -| fun_f1 | true | 317 | 332 | | -| fun_f1 | true | 319 | 341 | | -| fun_f1 | true | 323 | 312 | | -| fun_f1 | true | 324 | 323 | | -| fun_f1 | true | 326 | 317 | | -| fun_f1 | true | 329 | 330 | | -| fun_f1 | true | 330 | 319 | | -| fun_f1 | true | 332 | 329 | | -| fun_f1 | true | 337 | 324 | | -| fun_f1 | true | 339 | 337 | | -| fun_f1 | true | 341 | 339 | | -| fun_f2 | false | 276 | 276 | fun_f2 | -| fun_f2 | false | 281 | 281 | declaration | -| fun_f2 | false | 283 | 283 | declaration | -| fun_f2 | false | 287 | 287 | 2 | -| fun_f2 | false | 288 | 288 | return ... | -| fun_f2 | false | 290 | 290 | { ... } | -| fun_f2 | false | 293 | 293 | call to Base | -| fun_f2 | false | 294 | 294 | new | -| fun_f2 | false | 296 | 296 | initializer for p1 | -| fun_f2 | false | 304 | 304 | call to f | -| fun_f2 | false | 306 | 306 | p1 | -| fun_f2 | false | 308 | 308 | initializer for i | -| fun_f2 | true | 281 | 296 | | -| fun_f2 | true | 283 | 308 | | -| fun_f2 | true | 287 | 276 | | -| fun_f2 | true | 288 | 287 | | -| fun_f2 | true | 290 | 281 | | -| fun_f2 | true | 293 | 294 | | -| fun_f2 | true | 294 | 283 | | -| fun_f2 | true | 296 | 293 | | -| fun_f2 | true | 306 | 304 | | -| fun_f2 | true | 308 | 306 | | -| fun_g1 | false | 243 | 243 | fun_g1 | -| fun_g1 | false | 248 | 248 | declaration | -| fun_g1 | false | 250 | 250 | declaration | -| fun_g1 | false | 254 | 254 | 2 | -| fun_g1 | false | 255 | 255 | return ... | -| fun_g1 | false | 257 | 257 | { ... } | -| fun_g1 | false | 260 | 260 | call to Base | -| fun_g1 | false | 261 | 261 | new | -| fun_g1 | false | 263 | 263 | initializer for p1 | -| fun_g1 | false | 268 | 268 | call to g | -| fun_g1 | false | 270 | 270 | p1 | -| fun_g1 | false | 272 | 272 | initializer for i | -| fun_g1 | true | 248 | 263 | | -| fun_g1 | true | 250 | 272 | | -| fun_g1 | true | 254 | 243 | | -| fun_g1 | true | 255 | 254 | | -| fun_g1 | true | 257 | 248 | | -| fun_g1 | true | 260 | 261 | | -| fun_g1 | true | 261 | 250 | | -| fun_g1 | true | 263 | 260 | | -| fun_g1 | true | 268 | 255 | | -| fun_g1 | true | 270 | 268 | | -| fun_g1 | true | 272 | 270 | | -| fun_g2 | false | 192 | 192 | fun_g2 | -| fun_g2 | false | 197 | 197 | declaration | -| fun_g2 | false | 199 | 199 | declaration | -| fun_g2 | false | 203 | 203 | 2 | -| fun_g2 | false | 204 | 204 | return ... | -| fun_g2 | false | 206 | 206 | { ... } | -| fun_g2 | false | 214 | 214 | call to Base | -| fun_g2 | false | 223 | 223 | new | -| fun_g2 | false | 225 | 225 | initializer for p1 | -| fun_g2 | false | 235 | 235 | call to g | -| fun_g2 | false | 237 | 237 | p1 | -| fun_g2 | false | 239 | 239 | initializer for i | -| fun_g2 | true | 197 | 225 | | -| fun_g2 | true | 199 | 239 | | -| fun_g2 | true | 203 | 192 | | -| fun_g2 | true | 204 | 203 | | -| fun_g2 | true | 206 | 197 | | -| fun_g2 | true | 214 | 223 | | -| fun_g2 | true | 223 | 199 | | -| fun_g2 | true | 225 | 214 | | -| fun_g2 | true | 235 | 204 | | -| fun_g2 | true | 237 | 235 | | -| fun_g2 | true | 239 | 237 | | -| operator delete | false | 212 | 212 | operator delete | -| operator new | false | 210 | 210 | operator new | +| Base::Base | false | 166 | 166 | Base | +| Base::Base | false | 171 | 171 | return ... | +| Base::Base | false | 173 | 173 | { ... } | +| Base::Base | false | 322 | 322 | Base | +| Base::Base | false | 326 | 326 | Base | +| Base::Base | true | 171 | 166 | | +| Base::Base | true | 173 | 171 | | +| Base::Base_f | false | 365 | 365 | Base_f | +| Base::Base_f | false | 370 | 370 | declaration | +| Base::Base_f | false | 375 | 375 | call to f | +| Base::Base_f | false | 377 | 377 | this | +| Base::Base_f | false | 378 | 378 | initializer for i | +| Base::Base_f | false | 382 | 382 | return ... | +| Base::Base_f | false | 386 | 386 | 1 | +| Base::Base_f | false | 387 | 387 | { ... } | +| Base::Base_f | true | 370 | 378 | | +| Base::Base_f | true | 377 | 375 | | +| Base::Base_f | true | 378 | 377 | | +| Base::Base_f | true | 382 | 386 | | +| Base::Base_f | true | 386 | 365 | | +| Base::Base_f | true | 387 | 370 | | +| Base::Base_g | false | 330 | 330 | Base_g | +| Base::Base_g | false | 335 | 335 | declaration | +| Base::Base_g | false | 340 | 340 | call to g | +| Base::Base_g | false | 342 | 342 | this | +| Base::Base_g | false | 343 | 343 | initializer for i | +| Base::Base_g | false | 347 | 347 | return ... | +| Base::Base_g | false | 351 | 351 | 4 | +| Base::Base_g | false | 352 | 352 | { ... } | +| Base::Base_g | true | 335 | 343 | | +| Base::Base_g | true | 340 | 347 | | +| Base::Base_g | true | 342 | 340 | | +| Base::Base_g | true | 343 | 342 | | +| Base::Base_g | true | 347 | 351 | | +| Base::Base_g | true | 351 | 330 | | +| Base::Base_g | true | 352 | 335 | | +| Base::f | false | 253 | 253 | f | +| Base::f | false | 393 | 393 | ExprStmt | +| Base::f | false | 397 | 397 | call to abort | +| Base::f | false | 399 | 399 | return ... | +| Base::f | false | 401 | 401 | { ... } | +| Base::f | true | 393 | 397 | | +| Base::f | true | 399 | 253 | | +| Base::f | true | 401 | 393 | | +| Base::g | false | 182 | 182 | g | +| Base::g | false | 358 | 358 | return ... | +| Base::g | false | 362 | 362 | 3 | +| Base::g | false | 363 | 363 | { ... } | +| Base::g | true | 358 | 362 | | +| Base::g | true | 362 | 182 | | +| Base::g | true | 363 | 358 | | +| Base::operator= | false | 307 | 307 | operator= | +| Base::operator= | false | 316 | 316 | operator= | +| __va_list_tag::operator= | false | 57 | 57 | operator= | +| __va_list_tag::operator= | false | 63 | 63 | operator= | +| abort | false | 304 | 304 | abort | +| fun_f1 | false | 271 | 271 | fun_f1 | +| fun_f1 | false | 276 | 276 | declaration | +| fun_f1 | false | 279 | 279 | call to Base | +| fun_f1 | false | 281 | 281 | new | +| fun_f1 | false | 282 | 282 | initializer for p1 | +| fun_f1 | false | 286 | 286 | declaration | +| fun_f1 | false | 289 | 289 | call to f | +| fun_f1 | false | 291 | 291 | p1 | +| fun_f1 | false | 293 | 293 | initializer for i | +| fun_f1 | false | 297 | 297 | return ... | +| fun_f1 | false | 301 | 301 | 2 | +| fun_f1 | false | 302 | 302 | { ... } | +| fun_f1 | true | 276 | 282 | | +| fun_f1 | true | 279 | 281 | | +| fun_f1 | true | 281 | 286 | | +| fun_f1 | true | 282 | 279 | | +| fun_f1 | true | 286 | 293 | | +| fun_f1 | true | 289 | 297 | | +| fun_f1 | true | 291 | 289 | | +| fun_f1 | true | 293 | 291 | | +| fun_f1 | true | 297 | 301 | | +| fun_f1 | true | 301 | 271 | | +| fun_f1 | true | 302 | 276 | | +| fun_f2 | false | 235 | 235 | fun_f2 | +| fun_f2 | false | 240 | 240 | declaration | +| fun_f2 | false | 243 | 243 | call to Base | +| fun_f2 | false | 245 | 245 | new | +| fun_f2 | false | 246 | 246 | initializer for p1 | +| fun_f2 | false | 250 | 250 | declaration | +| fun_f2 | false | 256 | 256 | call to f | +| fun_f2 | false | 258 | 258 | p1 | +| fun_f2 | false | 260 | 260 | initializer for i | +| fun_f2 | false | 264 | 264 | return ... | +| fun_f2 | false | 268 | 268 | 2 | +| fun_f2 | false | 269 | 269 | { ... } | +| fun_f2 | true | 240 | 246 | | +| fun_f2 | true | 243 | 245 | | +| fun_f2 | true | 245 | 250 | | +| fun_f2 | true | 246 | 243 | | +| fun_f2 | true | 250 | 260 | | +| fun_f2 | true | 258 | 256 | | +| fun_f2 | true | 260 | 258 | | +| fun_f2 | true | 264 | 268 | | +| fun_f2 | true | 268 | 235 | | +| fun_f2 | true | 269 | 240 | | +| fun_g1 | false | 202 | 202 | fun_g1 | +| fun_g1 | false | 207 | 207 | declaration | +| fun_g1 | false | 210 | 210 | call to Base | +| fun_g1 | false | 212 | 212 | new | +| fun_g1 | false | 213 | 213 | initializer for p1 | +| fun_g1 | false | 217 | 217 | declaration | +| fun_g1 | false | 220 | 220 | call to g | +| fun_g1 | false | 222 | 222 | p1 | +| fun_g1 | false | 224 | 224 | initializer for i | +| fun_g1 | false | 228 | 228 | return ... | +| fun_g1 | false | 232 | 232 | 2 | +| fun_g1 | false | 233 | 233 | { ... } | +| fun_g1 | true | 207 | 213 | | +| fun_g1 | true | 210 | 212 | | +| fun_g1 | true | 212 | 217 | | +| fun_g1 | true | 213 | 210 | | +| fun_g1 | true | 217 | 224 | | +| fun_g1 | true | 220 | 228 | | +| fun_g1 | true | 222 | 220 | | +| fun_g1 | true | 224 | 222 | | +| fun_g1 | true | 228 | 232 | | +| fun_g1 | true | 232 | 202 | | +| fun_g1 | true | 233 | 207 | | +| fun_g2 | false | 151 | 151 | fun_g2 | +| fun_g2 | false | 156 | 156 | declaration | +| fun_g2 | false | 164 | 164 | call to Base | +| fun_g2 | false | 174 | 174 | new | +| fun_g2 | false | 175 | 175 | initializer for p1 | +| fun_g2 | false | 179 | 179 | declaration | +| fun_g2 | false | 187 | 187 | call to g | +| fun_g2 | false | 189 | 189 | p1 | +| fun_g2 | false | 191 | 191 | initializer for i | +| fun_g2 | false | 195 | 195 | return ... | +| fun_g2 | false | 199 | 199 | 2 | +| fun_g2 | false | 200 | 200 | { ... } | +| fun_g2 | true | 156 | 175 | | +| fun_g2 | true | 164 | 174 | | +| fun_g2 | true | 174 | 179 | | +| fun_g2 | true | 175 | 164 | | +| fun_g2 | true | 179 | 191 | | +| fun_g2 | true | 187 | 195 | | +| fun_g2 | true | 189 | 187 | | +| fun_g2 | true | 191 | 189 | | +| fun_g2 | true | 195 | 199 | | +| fun_g2 | true | 199 | 151 | | +| fun_g2 | true | 200 | 156 | | +| operator delete | false | 162 | 162 | operator delete | +| operator new | false | 160 | 160 | operator new | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-079/semmle/CgiXss/CgiXss.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-079/semmle/CgiXss/CgiXss.expected index 20bb97a9f663..6f08104489ec 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-079/semmle/CgiXss/CgiXss.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-079/semmle/CgiXss/CgiXss.expected @@ -1,20 +1,30 @@ edges +| search.c:14:24:14:28 | *query | search.c:17:8:17:12 | (const char *)... | +| search.c:14:24:14:28 | *query | search.c:17:8:17:12 | query | | search.c:14:24:14:28 | query | search.c:17:8:17:12 | (const char *)... | | search.c:14:24:14:28 | query | search.c:17:8:17:12 | query | | search.c:14:24:14:28 | query | search.c:17:8:17:12 | query | +| search.c:22:24:22:28 | *query | search.c:23:39:23:43 | query | +| search.c:22:24:22:28 | *query | search.c:23:39:23:43 | query | | search.c:22:24:22:28 | query | search.c:23:39:23:43 | query | | search.c:22:24:22:28 | query | search.c:23:39:23:43 | query | +| search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | *query | +| search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | *query | | search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | query | | search.c:41:21:41:26 | call to getenv | search.c:14:24:14:28 | query | +| search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | *query | +| search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | *query | | search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | query | | search.c:41:21:41:26 | call to getenv | search.c:22:24:22:28 | query | nodes +| search.c:14:24:14:28 | *query | semmle.label | *query | | search.c:14:24:14:28 | query | semmle.label | query | | search.c:17:8:17:12 | (const char *)... | semmle.label | (const char *)... | | search.c:17:8:17:12 | (const char *)... | semmle.label | (const char *)... | | search.c:17:8:17:12 | query | semmle.label | query | | search.c:17:8:17:12 | query | semmle.label | query | | search.c:17:8:17:12 | query | semmle.label | query | +| search.c:22:24:22:28 | *query | semmle.label | *query | | search.c:22:24:22:28 | query | semmle.label | query | | search.c:23:39:23:43 | query | semmle.label | query | | search.c:23:39:23:43 | query | semmle.label | query | @@ -22,7 +32,9 @@ nodes | search.c:41:21:41:26 | call to getenv | semmle.label | call to getenv | | search.c:41:21:41:26 | call to getenv | semmle.label | call to getenv | | search.c:45:5:45:15 | Argument 0 | semmle.label | Argument 0 | +| search.c:45:17:45:25 | Argument 0 indirection | semmle.label | Argument 0 indirection | | search.c:47:5:47:15 | Argument 0 | semmle.label | Argument 0 | +| search.c:47:17:47:25 | Argument 0 indirection | semmle.label | Argument 0 indirection | #select | search.c:17:8:17:12 | query | search.c:41:21:41:26 | call to getenv | search.c:17:8:17:12 | query | Cross-site scripting vulnerability due to $@. | search.c:41:21:41:26 | call to getenv | this query data | | search.c:23:39:23:43 | query | search.c:41:21:41:26 | call to getenv | search.c:23:39:23:43 | query | Cross-site scripting vulnerability due to $@. | search.c:41:21:41:26 | call to getenv | this query data | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected index 94c1e3383fee..0c2778abaf4f 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-114/semmle/UncontrolledProcessOperation/UncontrolledProcessOperation.expected @@ -1,11 +1,19 @@ edges +| test.cpp:24:30:24:36 | *command | test.cpp:26:10:26:16 | command | +| test.cpp:24:30:24:36 | *command | test.cpp:26:10:26:16 | command | | test.cpp:24:30:24:36 | command | test.cpp:26:10:26:16 | command | | test.cpp:24:30:24:36 | command | test.cpp:26:10:26:16 | command | +| test.cpp:29:30:29:36 | *command | test.cpp:31:10:31:16 | command | +| test.cpp:29:30:29:36 | *command | test.cpp:31:10:31:16 | command | | test.cpp:29:30:29:36 | command | test.cpp:31:10:31:16 | command | | test.cpp:29:30:29:36 | command | test.cpp:31:10:31:16 | command | +| test.cpp:42:18:42:23 | call to getenv | test.cpp:24:30:24:36 | *command | | test.cpp:42:18:42:23 | call to getenv | test.cpp:24:30:24:36 | command | +| test.cpp:42:18:42:34 | (const char *)... | test.cpp:24:30:24:36 | *command | | test.cpp:42:18:42:34 | (const char *)... | test.cpp:24:30:24:36 | command | +| test.cpp:43:18:43:23 | call to getenv | test.cpp:29:30:29:36 | *command | | test.cpp:43:18:43:23 | call to getenv | test.cpp:29:30:29:36 | command | +| test.cpp:43:18:43:34 | (const char *)... | test.cpp:29:30:29:36 | *command | | test.cpp:43:18:43:34 | (const char *)... | test.cpp:29:30:29:36 | command | | test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | (const char *)... | | test.cpp:56:12:56:17 | buffer | test.cpp:62:10:62:15 | buffer | @@ -24,10 +32,12 @@ edges | test.cpp:76:12:76:17 | fgets output argument | test.cpp:79:10:79:13 | (const char *)... | | test.cpp:76:12:76:17 | fgets output argument | test.cpp:79:10:79:13 | data | nodes +| test.cpp:24:30:24:36 | *command | semmle.label | *command | | test.cpp:24:30:24:36 | command | semmle.label | command | | test.cpp:26:10:26:16 | command | semmle.label | command | | test.cpp:26:10:26:16 | command | semmle.label | command | | test.cpp:26:10:26:16 | command | semmle.label | command | +| test.cpp:29:30:29:36 | *command | semmle.label | *command | | test.cpp:29:30:29:36 | command | semmle.label | command | | test.cpp:31:10:31:16 | command | semmle.label | command | | test.cpp:31:10:31:16 | command | semmle.label | command | @@ -35,9 +45,11 @@ nodes | test.cpp:42:7:42:16 | Argument 0 | semmle.label | Argument 0 | | test.cpp:42:18:42:23 | call to getenv | semmle.label | call to getenv | | test.cpp:42:18:42:34 | (const char *)... | semmle.label | (const char *)... | +| test.cpp:42:18:42:34 | Argument 0 indirection | semmle.label | Argument 0 indirection | | test.cpp:43:7:43:16 | Argument 0 | semmle.label | Argument 0 | | test.cpp:43:18:43:23 | call to getenv | semmle.label | call to getenv | | test.cpp:43:18:43:34 | (const char *)... | semmle.label | (const char *)... | +| test.cpp:43:18:43:34 | Argument 0 indirection | semmle.label | Argument 0 indirection | | test.cpp:56:12:56:17 | buffer | semmle.label | buffer | | test.cpp:56:12:56:17 | fgets output argument | semmle.label | fgets output argument | | test.cpp:62:10:62:15 | (const char *)... | semmle.label | (const char *)... | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected index 00f98ac48be7..826a659755d6 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-134/semmle/globalVars/UncontrolledFormatStringThroughGlobalVar.expected @@ -19,6 +19,8 @@ edges | globalVars.c:12:2:12:15 | Store | globalVars.c:8:7:8:10 | copy | | globalVars.c:15:21:15:23 | val | globalVars.c:16:2:16:12 | Store | | globalVars.c:16:2:16:12 | Store | globalVars.c:9:7:9:11 | copy2 | +| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | *argv | +| globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | *argv | | globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv | | globalVars.c:24:11:24:14 | argv | globalVars.c:11:22:11:25 | argv | | globalVars.c:27:9:27:12 | copy | globalVars.c:27:9:27:12 | (const char *)... | @@ -37,6 +39,7 @@ nodes | globalVars.c:15:21:15:23 | val | semmle.label | val | | globalVars.c:16:2:16:12 | Store | semmle.label | Store | | globalVars.c:24:2:24:9 | Argument 0 | semmle.label | Argument 0 | +| globalVars.c:24:11:24:14 | Argument 0 indirection | semmle.label | Argument 0 indirection | | globalVars.c:24:11:24:14 | argv | semmle.label | argv | | globalVars.c:24:11:24:14 | argv | semmle.label | argv | | globalVars.c:27:9:27:12 | (const char *)... | semmle.label | (const char *)... | diff --git a/cpp/ql/test/successor-tests/conditional_destructors/cfg.expected b/cpp/ql/test/successor-tests/conditional_destructors/cfg.expected index 2d94b3ca1e40..a47bcaf6fbf4 100644 --- a/cpp/ql/test/successor-tests/conditional_destructors/cfg.expected +++ b/cpp/ql/test/successor-tests/conditional_destructors/cfg.expected @@ -1,167 +1,175 @@ -| C1::C1 | false | 254 | 254 | C1 | -| C1::C1 | false | 420 | 420 | C1 | -| C1::C1 | false | 424 | 424 | C1 | -| C1::C1 | false | 470 | 470 | this | -| C1::C1 | false | 472 | 472 | val | -| C1::C1 | false | 475 | 475 | x | -| C1::C1 | false | 478 | 478 | ... = ... | -| C1::C1 | false | 481 | 481 | ExprStmt | -| C1::C1 | false | 484 | 484 | return ... | -| C1::C1 | false | 487 | 487 | { ... } | -| C1::C1 | true | 470 | 472 | | -| C1::C1 | true | 472 | 478 | | -| C1::C1 | true | 475 | 470 | | -| C1::C1 | true | 478 | 484 | | -| C1::C1 | true | 481 | 475 | | -| C1::C1 | true | 484 | 254 | | -| C1::C1 | true | 487 | 481 | | -| C1::operator= | false | 409 | 409 | operator= | -| C1::operator= | false | 416 | 416 | operator= | -| C1::operator== | false | 241 | 241 | operator== | -| C1::operator== | false | 439 | 439 | this | -| C1::operator== | false | 442 | 442 | val | -| C1::operator== | false | 445 | 445 | other | -| C1::operator== | false | 448 | 448 | (reference dereference) | -| C1::operator== | false | 450 | 450 | val | -| C1::operator== | false | 453 | 453 | ... == ... | -| C1::operator== | false | 456 | 456 | return ... | -| C1::operator== | false | 459 | 459 | { ... } | -| C1::operator== | true | 439 | 442 | | -| C1::operator== | true | 442 | 445 | | -| C1::operator== | true | 445 | 450 | | -| C1::operator== | true | 450 | 453 | | -| C1::operator== | true | 453 | 241 | | -| C1::operator== | true | 456 | 439 | | -| C1::operator== | true | 459 | 456 | | -| C2::C2 | false | 163 | 163 | C2 | -| C2::C2 | false | 329 | 329 | C2 | -| C2::C2 | false | 389 | 389 | this | -| C2::C2 | false | 391 | 391 | val | -| C2::C2 | false | 394 | 394 | x | -| C2::C2 | false | 397 | 397 | ... = ... | -| C2::C2 | false | 400 | 400 | ExprStmt | -| C2::C2 | false | 403 | 403 | return ... | -| C2::C2 | false | 406 | 406 | { ... } | -| C2::C2 | true | 389 | 391 | | -| C2::C2 | true | 391 | 397 | | -| C2::C2 | true | 394 | 389 | | -| C2::C2 | true | 397 | 403 | | -| C2::C2 | true | 400 | 394 | | -| C2::C2 | true | 403 | 163 | | -| C2::C2 | true | 406 | 400 | | -| C2::operator= | false | 323 | 323 | operator= | -| C2::operator== | false | 150 | 150 | operator== | -| C2::operator== | false | 344 | 344 | this | -| C2::operator== | false | 347 | 347 | val | -| C2::operator== | false | 350 | 350 | other | -| C2::operator== | false | 353 | 353 | (reference dereference) | -| C2::operator== | false | 355 | 355 | val | -| C2::operator== | false | 358 | 358 | ... == ... | -| C2::operator== | false | 361 | 361 | return ... | -| C2::operator== | false | 364 | 364 | { ... } | -| C2::operator== | true | 344 | 347 | | -| C2::operator== | true | 347 | 350 | | -| C2::operator== | true | 350 | 355 | | -| C2::operator== | true | 355 | 358 | | -| C2::operator== | true | 358 | 150 | | -| C2::operator== | true | 361 | 344 | | -| C2::operator== | true | 364 | 361 | | -| C2::~C2 | false | 366 | 366 | ~C2 | -| C2::~C2 | false | 372 | 372 | ; | -| C2::~C2 | false | 375 | 375 | return ... | -| C2::~C2 | false | 378 | 378 | { ... } | -| C2::~C2 | true | 372 | 375 | | -| C2::~C2 | true | 375 | 366 | | -| C2::~C2 | true | 378 | 372 | | -| __va_list_tag::operator= | false | 64 | 64 | operator= | -| __va_list_tag::operator= | false | 70 | 70 | operator= | -| f1 | false | 232 | 232 | f1 | -| f1 | false | 250 | 250 | call to operator== | -| f1 | false | 252 | 252 | call to C1 | -| f1 | false | 259 | 259 | 1 | -| f1 | false | 261 | 261 | (const C1)... | -| f1 | false | 263 | 263 | call to C1 | -| f1 | false | 269 | 269 | 2 | -| f1 | false | 271 | 271 | (const C1)... | +| C1::C1 | false | 237 | 237 | C1 | +| C1::C1 | false | 359 | 359 | C1 | +| C1::C1 | false | 363 | 363 | C1 | +| C1::C1 | false | 398 | 398 | ExprStmt | +| C1::C1 | false | 400 | 400 | this | +| C1::C1 | false | 401 | 401 | val | +| C1::C1 | false | 403 | 403 | x | +| C1::C1 | false | 405 | 405 | ... = ... | +| C1::C1 | false | 407 | 407 | return ... | +| C1::C1 | false | 409 | 409 | { ... } | +| C1::C1 | true | 398 | 403 | | +| C1::C1 | true | 400 | 401 | | +| C1::C1 | true | 401 | 405 | | +| C1::C1 | true | 403 | 400 | | +| C1::C1 | true | 405 | 407 | | +| C1::C1 | true | 407 | 237 | | +| C1::C1 | true | 409 | 398 | | +| C1::operator= | false | 348 | 348 | operator= | +| C1::operator= | false | 355 | 355 | operator= | +| C1::operator== | false | 226 | 226 | operator== | +| C1::operator== | false | 376 | 376 | return ... | +| C1::operator== | false | 378 | 378 | this | +| C1::operator== | false | 379 | 379 | val | +| C1::operator== | false | 382 | 382 | other | +| C1::operator== | false | 384 | 384 | (reference dereference) | +| C1::operator== | false | 385 | 385 | val | +| C1::operator== | false | 387 | 387 | ... == ... | +| C1::operator== | false | 389 | 389 | { ... } | +| C1::operator== | true | 376 | 378 | | +| C1::operator== | true | 378 | 379 | | +| C1::operator== | true | 379 | 382 | | +| C1::operator== | true | 382 | 385 | | +| C1::operator== | true | 385 | 387 | | +| C1::operator== | true | 387 | 226 | | +| C1::operator== | true | 389 | 376 | | +| C2::C2 | false | 170 | 170 | C2 | +| C2::C2 | false | 288 | 288 | C2 | +| C2::C2 | false | 334 | 334 | ExprStmt | +| C2::C2 | false | 336 | 336 | this | +| C2::C2 | false | 337 | 337 | val | +| C2::C2 | false | 339 | 339 | x | +| C2::C2 | false | 341 | 341 | ... = ... | +| C2::C2 | false | 343 | 343 | return ... | +| C2::C2 | false | 345 | 345 | { ... } | +| C2::C2 | true | 334 | 339 | | +| C2::C2 | true | 336 | 337 | | +| C2::C2 | true | 337 | 341 | | +| C2::C2 | true | 339 | 336 | | +| C2::C2 | true | 341 | 343 | | +| C2::C2 | true | 343 | 170 | | +| C2::C2 | true | 345 | 334 | | +| C2::operator= | false | 282 | 282 | operator= | +| C2::operator== | false | 159 | 159 | operator== | +| C2::operator== | false | 301 | 301 | return ... | +| C2::operator== | false | 303 | 303 | this | +| C2::operator== | false | 304 | 304 | val | +| C2::operator== | false | 307 | 307 | other | +| C2::operator== | false | 309 | 309 | (reference dereference) | +| C2::operator== | false | 310 | 310 | val | +| C2::operator== | false | 312 | 312 | ... == ... | +| C2::operator== | false | 314 | 314 | { ... } | +| C2::operator== | true | 301 | 303 | | +| C2::operator== | true | 303 | 304 | | +| C2::operator== | true | 304 | 307 | | +| C2::operator== | true | 307 | 310 | | +| C2::operator== | true | 310 | 312 | | +| C2::operator== | true | 312 | 159 | | +| C2::operator== | true | 314 | 301 | | +| C2::~C2 | false | 316 | 316 | ~C2 | +| C2::~C2 | false | 321 | 321 | ; | +| C2::~C2 | false | 323 | 323 | return ... | +| C2::~C2 | false | 325 | 325 | { ... } | +| C2::~C2 | true | 321 | 323 | | +| C2::~C2 | true | 323 | 316 | | +| C2::~C2 | true | 325 | 321 | | +| __va_list_tag::operator= | false | 57 | 57 | operator= | +| __va_list_tag::operator= | false | 63 | 63 | operator= | +| f1 | false | 215 | 215 | f1 | +| f1 | false | 220 | 220 | if (...) ... | +| f1 | false | 234 | 234 | call to operator== | +| f1 | false | 235 | 235 | call to C1 | +| f1 | false | 240 | 240 | 1 | +| f1 | false | 241 | 241 | temporary object | +| f1 | false | 242 | 242 | (const C1)... | +| f1 | false | 243 | 243 | call to C1 | +| f1 | false | 247 | 247 | 2 | +| f1 | false | 248 | 248 | temporary object | +| f1 | false | 249 | 249 | (const C1)... | +| f1 | false | 250 | 250 | (reference to) | +| f1 | false | 251 | 251 | ; | +| f1 | false | 253 | 253 | { ... } | +| f1 | false | 255 | 255 | if (...) ... | +| f1 | false | 258 | 258 | call to operator== | +| f1 | false | 259 | 259 | call to C1 | +| f1 | false | 263 | 263 | 3 | +| f1 | false | 264 | 264 | temporary object | +| f1 | false | 265 | 265 | (const C1)... | +| f1 | false | 266 | 266 | call to C1 | +| f1 | false | 270 | 270 | 3 | +| f1 | false | 271 | 271 | temporary object | +| f1 | false | 272 | 272 | (const C1)... | | f1 | false | 273 | 273 | (reference to) | -| f1 | false | 275 | 275 | ; | -| f1 | false | 278 | 278 | { ... } | -| f1 | false | 281 | 281 | if (...) ... | -| f1 | false | 285 | 285 | call to operator== | -| f1 | false | 287 | 287 | call to C1 | -| f1 | false | 293 | 293 | 3 | -| f1 | false | 295 | 295 | (const C1)... | -| f1 | false | 297 | 297 | call to C1 | -| f1 | false | 303 | 303 | 3 | -| f1 | false | 305 | 305 | (const C1)... | -| f1 | false | 307 | 307 | (reference to) | -| f1 | false | 309 | 309 | ; | -| f1 | false | 312 | 312 | { ... } | -| f1 | false | 315 | 315 | if (...) ... | -| f1 | false | 318 | 318 | return ... | -| f1 | false | 321 | 321 | { ... } | -| f1 | true | 250 | 278 | T | -| f1 | true | 250 | 315 | F | -| f1 | true | 252 | 250 | | -| f1 | true | 259 | 252 | | +| f1 | false | 274 | 274 | ; | +| f1 | false | 276 | 276 | { ... } | +| f1 | false | 278 | 278 | return ... | +| f1 | false | 280 | 280 | { ... } | +| f1 | true | 220 | 247 | | +| f1 | true | 234 | 253 | T | +| f1 | true | 234 | 255 | F | +| f1 | true | 235 | 234 | | +| f1 | true | 240 | 235 | | +| f1 | true | 243 | 240 | | +| f1 | true | 247 | 243 | | +| f1 | true | 251 | 255 | | +| f1 | true | 253 | 251 | | +| f1 | true | 255 | 270 | | +| f1 | true | 258 | 276 | T | +| f1 | true | 258 | 278 | F | +| f1 | true | 259 | 258 | | | f1 | true | 263 | 259 | | -| f1 | true | 269 | 263 | | -| f1 | true | 275 | 315 | | -| f1 | true | 278 | 275 | | -| f1 | true | 281 | 269 | | -| f1 | true | 285 | 312 | T | -| f1 | true | 285 | 318 | F | -| f1 | true | 287 | 285 | | -| f1 | true | 293 | 287 | | -| f1 | true | 297 | 293 | | -| f1 | true | 303 | 297 | | -| f1 | true | 309 | 318 | | -| f1 | true | 312 | 309 | | -| f1 | true | 315 | 303 | | -| f1 | true | 318 | 232 | | -| f1 | true | 321 | 281 | | -| f2 | false | 141 | 141 | f2 | -| f2 | false | 159 | 159 | call to operator== | -| f2 | false | 161 | 161 | call to C2 | -| f2 | false | 168 | 168 | 1 | -| f2 | false | 170 | 170 | (const C2)... | -| f2 | false | 172 | 172 | call to C2 | -| f2 | false | 178 | 178 | 2 | -| f2 | false | 180 | 180 | (const C2)... | -| f2 | false | 182 | 182 | (reference to) | +| f1 | true | 266 | 263 | | +| f1 | true | 270 | 266 | | +| f1 | true | 274 | 278 | | +| f1 | true | 276 | 274 | | +| f1 | true | 278 | 215 | | +| f1 | true | 280 | 220 | | +| f2 | false | 148 | 148 | f2 | +| f2 | false | 153 | 153 | if (...) ... | +| f2 | false | 167 | 167 | call to operator== | +| f2 | false | 168 | 168 | call to C2 | +| f2 | false | 173 | 173 | 1 | +| f2 | false | 174 | 174 | temporary object | +| f2 | false | 175 | 175 | (const C2)... | +| f2 | false | 176 | 176 | call to C2 | +| f2 | false | 180 | 180 | 2 | +| f2 | false | 181 | 181 | temporary object | +| f2 | false | 182 | 182 | (const C2)... | +| f2 | false | 183 | 183 | (reference to) | | f2 | false | 184 | 184 | ; | -| f2 | false | 187 | 187 | { ... } | -| f2 | false | 190 | 190 | if (...) ... | -| f2 | false | 194 | 194 | call to operator== | -| f2 | false | 196 | 196 | call to C2 | -| f2 | false | 202 | 202 | 3 | -| f2 | false | 204 | 204 | (const C2)... | -| f2 | false | 206 | 206 | call to C2 | -| f2 | false | 212 | 212 | 3 | -| f2 | false | 214 | 214 | (const C2)... | -| f2 | false | 216 | 216 | (reference to) | -| f2 | false | 218 | 218 | ; | -| f2 | false | 221 | 221 | { ... } | -| f2 | false | 224 | 224 | if (...) ... | -| f2 | false | 227 | 227 | return ... | -| f2 | false | 230 | 230 | { ... } | -| f2 | true | 159 | 187 | T | -| f2 | true | 159 | 224 | F | -| f2 | true | 161 | 159 | | -| f2 | true | 168 | 161 | | -| f2 | true | 172 | 168 | | -| f2 | true | 178 | 172 | | -| f2 | true | 184 | 224 | | -| f2 | true | 187 | 184 | | -| f2 | true | 190 | 178 | | -| f2 | true | 194 | 221 | T | -| f2 | true | 194 | 227 | F | -| f2 | true | 196 | 194 | | -| f2 | true | 202 | 196 | | -| f2 | true | 206 | 202 | | -| f2 | true | 212 | 206 | | -| f2 | true | 218 | 227 | | -| f2 | true | 221 | 218 | | -| f2 | true | 224 | 212 | | -| f2 | true | 227 | 141 | | -| f2 | true | 230 | 190 | | +| f2 | false | 186 | 186 | { ... } | +| f2 | false | 188 | 188 | if (...) ... | +| f2 | false | 191 | 191 | call to operator== | +| f2 | false | 192 | 192 | call to C2 | +| f2 | false | 196 | 196 | 3 | +| f2 | false | 197 | 197 | temporary object | +| f2 | false | 198 | 198 | (const C2)... | +| f2 | false | 199 | 199 | call to C2 | +| f2 | false | 203 | 203 | 3 | +| f2 | false | 204 | 204 | temporary object | +| f2 | false | 205 | 205 | (const C2)... | +| f2 | false | 206 | 206 | (reference to) | +| f2 | false | 207 | 207 | ; | +| f2 | false | 209 | 209 | { ... } | +| f2 | false | 211 | 211 | return ... | +| f2 | false | 213 | 213 | { ... } | +| f2 | true | 153 | 180 | | +| f2 | true | 167 | 186 | T | +| f2 | true | 167 | 188 | F | +| f2 | true | 168 | 167 | | +| f2 | true | 173 | 168 | | +| f2 | true | 176 | 173 | | +| f2 | true | 180 | 176 | | +| f2 | true | 184 | 188 | | +| f2 | true | 186 | 184 | | +| f2 | true | 188 | 203 | | +| f2 | true | 191 | 209 | T | +| f2 | true | 191 | 211 | F | +| f2 | true | 192 | 191 | | +| f2 | true | 196 | 192 | | +| f2 | true | 199 | 196 | | +| f2 | true | 203 | 199 | | +| f2 | true | 207 | 211 | | +| f2 | true | 209 | 207 | | +| f2 | true | 211 | 148 | | +| f2 | true | 213 | 153 | | diff --git a/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/old.dbscheme b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/old.dbscheme new file mode 100644 index 000000000000..ef73d8cf906d --- /dev/null +++ b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/old.dbscheme @@ -0,0 +1,2123 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The date of the snapshot. + */ +snapshotDate(unique date snapshotDate : date ref); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Data used by the 'duplicate code' detection. + */ +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'similar code' detection. + */ +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +@duplication_or_similarity = @duplication | @similarity + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +#keyset[id, offset] +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/* + fromSource(0) = unknown, + fromSource(1) = from source, + fromSource(2) = from library +*/ +files( + unique int id: @file, + string name: string ref, + string simple: string ref, + string ext: string ref, + int fromSource: int ref +); + +folders( + unique int id: @folder, + string name: string ref, + string simple: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +decltypes( + unique int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/semmlecode.cpp.dbscheme b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/semmlecode.cpp.dbscheme new file mode 100644 index 000000000000..c82db4c596b8 --- /dev/null +++ b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/semmlecode.cpp.dbscheme @@ -0,0 +1,2125 @@ + +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * gcc -c f1.c f2.c f3.c + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * gcc -c f1.c f2.c f3.c + */ + unique int id : @compilation, + string cwd : string ref +); + +/** + * The arguments that were passed to the extractor for a compiler + * invocation. If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--mimic` + * 2 | `/usr/bin/gcc` + * 3 | `-c` + * 4 | f1.c + * 5 | f2.c + * 6 | f3.c + */ +#keyset[id, num] +compilation_args( + int id : @compilation ref, + int num : int ref, + string arg : string ref +); + +/** + * The source files that are compiled by a compiler invocation. + * If `id` is for the compiler invocation + * + * gcc -c f1.c f2.c f3.c + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | f1.c + * 1 | f2.c + * 2 | f3.c + * + * Note that even if those files `#include` headers, those headers + * do not appear as rows. + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * The time taken by the extractor for a compiler invocation. + * + * For each file `num`, there will be rows for + * + * kind | seconds + * ---- | --- + * 1 | CPU seconds used by the extractor frontend + * 2 | Elapsed seconds during the extractor frontend + * 3 | CPU seconds used by the extractor backend + * 4 | Elapsed seconds during the extractor backend + */ +#keyset[id, num, kind] +compilation_time( + int id : @compilation ref, + int num : int ref, + /* kind: + 1 = frontend_cpu_seconds + 2 = frontend_elapsed_seconds + 3 = extractor_cpu_seconds + 4 = extractor_elapsed_seconds + */ + int kind : int ref, + float seconds : float ref +); + +/** + * An error or warning generated by the extractor. + * The diagnostic message `diagnostic` was generated during compiler + * invocation `compilation`, and is the `file_number_diagnostic_number`th + * message generated while extracting the `file_number`th file of that + * invocation. + */ +#keyset[compilation, file_number, file_number_diagnostic_number] +diagnostic_for( + int diagnostic : @diagnostic ref, + int compilation : @compilation ref, + int file_number : int ref, + int file_number_diagnostic_number : int ref +); + +/** + * If extraction was successful, then `cpu_seconds` and + * `elapsed_seconds` are the CPU time and elapsed time (respectively) + * that extraction took for compiler invocation `id`. + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref +); + + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/** + * The date of the snapshot. + */ +snapshotDate(unique date snapshotDate : date ref); + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/** + * Data used by the 'duplicate code' detection. + */ +duplicateCode( + unique int id : @duplication, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'similar code' detection. + */ +similarCode( + unique int id : @similarity, + string relativePath : string ref, + int equivClass : int ref +); + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +@duplication_or_similarity = @duplication | @similarity + +/** + * Data used by the 'duplicate code' and 'similar code' detection. + */ +#keyset[id, offset] +tokens( + int id : @duplication_or_similarity ref, + int offset : int ref, + int beginLine : int ref, + int beginColumn : int ref, + int endLine : int ref, + int endColumn : int ref +); + +/** + * Information about packages that provide code used during compilation. + * The `id` is just a unique identifier. + * The `namespace` is typically the name of the package manager that + * provided the package (e.g. "dpkg" or "yum"). + * The `package_name` is the name of the package, and `version` is its + * version (as a string). + */ +external_packages( + unique int id: @external_package, + string namespace : string ref, + string package_name : string ref, + string version : string ref +); + +/** + * Holds if File `fileid` was provided by package `package`. + */ +header_to_external_package( + int fileid : @file ref, + int package : @external_package ref +); + +/* + * Version history + */ + +svnentries( + unique int id : @svnentry, + string revision : string ref, + string author : string ref, + date revisionDate : date ref, + int changeSize : int ref +) + +svnaffectedfiles( + int id : @svnentry ref, + int file : @file ref, + string action : string ref +) + +svnentrymsg( + unique int id : @svnentry ref, + string message : string ref +) + +svnchurn( + int commit : @svnentry ref, + int file : @file ref, + int addedLines : int ref, + int deletedLines : int ref +) + +/* + * C++ dbscheme + */ + +@location = @location_stmt | @location_expr | @location_default ; + +/** + * The location of an element that is not an expression or a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_default( + /** The location of an element that is not an expression or a statement. */ + unique int id: @location_default, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of a statement. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_stmt( + /** The location of a statement. */ + unique int id: @location_stmt, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** + * The location of an expression. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://help.semmle.com/QL/learn-ql/ql/locations.html). + */ +locations_expr( + /** The location of an expression. */ + unique int id: @location_expr, + int container: @container ref, + int startLine: int ref, + int startColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +/** An element for which line-count information is available. */ +@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable; + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +diagnostics( + unique int id: @diagnostic, + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/* + fromSource(0) = unknown, + fromSource(1) = from source, + fromSource(2) = from library +*/ +files( + unique int id: @file, + string name: string ref, + string simple: string ref, + string ext: string ref, + int fromSource: int ref +); + +folders( + unique int id: @folder, + string name: string ref, + string simple: string ref +); + +@container = @folder | @file + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +fileannotations( + int id: @file ref, + int kind: int ref, + string name: string ref, + string value: string ref +); + +inmacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +affectedbymacroexpansion( + int id: @element ref, + int inv: @macroinvocation ref +); + +/* + case @macroinvocations.kind of + 1 = macro expansion + | 2 = other macro reference + ; +*/ +macroinvocations( + unique int id: @macroinvocation, + int macro_id: @ppd_define ref, + int location: @location_default ref, + int kind: int ref +); + +macroparent( + unique int id: @macroinvocation ref, + int parent_id: @macroinvocation ref +); + +// a macroinvocation may be part of another location +// the way to find a constant expression that uses a macro +// is thus to find a constant expression that has a location +// to which a macro invocation is bound +macrolocationbind( + int id: @macroinvocation ref, + int location: @location ref +); + +#keyset[invocation, argument_index] +macro_argument_unexpanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +#keyset[invocation, argument_index] +macro_argument_expanded( + int invocation: @macroinvocation ref, + int argument_index: int ref, + string text: string ref +); + +/* + case @function.kind of + 1 = normal + | 2 = constructor + | 3 = destructor + | 4 = conversion + | 5 = operator + | 6 = builtin // GCC built-in functions, e.g. __builtin___memcpy_chk + ; +*/ +functions( + unique int id: @function, + string name: string ref, + int kind: int ref +); + +function_entry_point(int id: @function ref, unique int entry_point: @stmt ref); + +function_return_type(int id: @function ref, int return_type: @type ref); + +/** If `function` is a coroutine, then this gives the + std::experimental::resumable_traits instance associated with it, + and the variables representing the `handle` and `promise` for it. */ +coroutine( + unique int function: @function ref, + int traits: @type ref, + int handle: @variable ref, + int promise: @variable ref +); + +/** The `new` function used for allocating the coroutine state, if any. */ +coroutine_new( + unique int function: @function ref, + int new: @function ref +); + +/** The `delete` function used for deallocating the coroutine state, if any. */ +coroutine_delete( + unique int function: @function ref, + int delete: @function ref +); + +purefunctions(unique int id: @function ref); + +function_deleted(unique int id: @function ref); + +function_defaulted(unique int id: @function ref); + +member_function_this_type(unique int id: @function ref, int this_type: @type ref); + +#keyset[id, type_id] +fun_decls( + int id: @fun_decl, + int function: @function ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +fun_def(unique int id: @fun_decl ref); +fun_specialized(unique int id: @fun_decl ref); +fun_implicit(unique int id: @fun_decl ref); +fun_decl_specifiers( + int id: @fun_decl ref, + string name: string ref +) +#keyset[fun_decl, index] +fun_decl_throws( + int fun_decl: @fun_decl ref, + int index: int ref, + int type_id: @type ref +); +/* an empty throw specification is different from none */ +fun_decl_empty_throws(unique int fun_decl: @fun_decl ref); +fun_decl_noexcept( + int fun_decl: @fun_decl ref, + int constant: @expr ref +); +fun_decl_empty_noexcept(int fun_decl: @fun_decl ref); +fun_decl_typedef_type( + unique int fun_decl: @fun_decl ref, + int typedeftype_id: @usertype ref +); + +param_decl_bind( + unique int id: @var_decl ref, + int index: int ref, + int fun_decl: @fun_decl ref +); + +#keyset[id, type_id] +var_decls( + int id: @var_decl, + int variable: @variable ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); +var_def(unique int id: @var_decl ref); +var_decl_specifiers( + int id: @var_decl ref, + string name: string ref +) + +type_decls( + unique int id: @type_decl, + int type_id: @type ref, + int location: @location_default ref +); +type_def(unique int id: @type_decl ref); +type_decl_top( + unique int type_decl: @type_decl ref +); + +namespace_decls( + unique int id: @namespace_decl, + int namespace_id: @namespace ref, + int location: @location_default ref, + int bodylocation: @location_default ref +); + +usings( + unique int id: @using, + int element_id: @element ref, + int location: @location_default ref +); + +/** The element which contains the `using` declaration. */ +using_container( + int parent: @element ref, + int child: @using ref +); + +static_asserts( + unique int id: @static_assert, + int condition : @expr ref, + string message : string ref, + int location: @location_default ref, + int enclosing : @element ref +); + +// each function has an ordered list of parameters +#keyset[id, type_id] +#keyset[function, index, type_id] +params( + int id: @parameter, + int function: @functionorblock ref, + int index: int ref, + int type_id: @type ref +); + +overrides(int new: @function ref, int old: @function ref); + +#keyset[id, type_id] +membervariables( + int id: @membervariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +globalvariables( + int id: @globalvariable, + int type_id: @type ref, + string name: string ref +); + +#keyset[id, type_id] +localvariables( + int id: @localvariable, + int type_id: @type ref, + string name: string ref +); + +autoderivation( + unique int var: @variable ref, + int derivation_type: @type ref +); + +enumconstants( + unique int id: @enumconstant, + int parent: @usertype ref, + int index: int ref, + int type_id: @type ref, + string name: string ref, + int location: @location_default ref +); + +@variable = @localscopevariable | @globalvariable | @membervariable; + +@localscopevariable = @localvariable | @parameter; + +/* + Built-in types are the fundamental types, e.g., integral, floating, and void. + + case @builtintype.kind of + 1 = error + | 2 = unknown + | 3 = void + | 4 = boolean + | 5 = char + | 6 = unsigned_char + | 7 = signed_char + | 8 = short + | 9 = unsigned_short + | 10 = signed_short + | 11 = int + | 12 = unsigned_int + | 13 = signed_int + | 14 = long + | 15 = unsigned_long + | 16 = signed_long + | 17 = long_long + | 18 = unsigned_long_long + | 19 = signed_long_long + | 20 = __int8 // Microsoft-specific + | 21 = __int16 // Microsoft-specific + | 22 = __int32 // Microsoft-specific + | 23 = __int64 // Microsoft-specific + | 24 = float + | 25 = double + | 26 = long_double + | 27 = _Complex_float // C99-specific + | 28 = _Complex_double // C99-specific + | 29 = _Complex_long double // C99-specific + | 30 = _Imaginary_float // C99-specific + | 31 = _Imaginary_double // C99-specific + | 32 = _Imaginary_long_double // C99-specific + | 33 = wchar_t // Microsoft-specific + | 34 = decltype_nullptr // C++11 + | 35 = __int128 + | 36 = unsigned___int128 + | 37 = signed___int128 + | 38 = __float128 + | 39 = _Complex___float128 + | 40 = _Decimal32 + | 41 = _Decimal64 + | 42 = _Decimal128 + | 43 = char16_t + | 44 = char32_t + | 45 = _Float32 + | 46 = _Float32x + | 47 = _Float64 + | 48 = _Float64x + | 49 = _Float128 + | 50 = _Float128x + | 51 = char8_t + ; +*/ +builtintypes( + unique int id: @builtintype, + string name: string ref, + int kind: int ref, + int size: int ref, + int sign: int ref, + int alignment: int ref +); + +/* + Derived types are types that are directly derived from existing types and + point to, refer to, transform type data to return a new type. + + case @derivedtype.kind of + 1 = pointer + | 2 = reference + | 3 = type_with_specifiers + | 4 = array + | 5 = gnu_vector + | 6 = routineptr + | 7 = routinereference + | 8 = rvalue_reference // C++11 +// ... 9 type_conforming_to_protocols deprecated + | 10 = block + ; +*/ +derivedtypes( + unique int id: @derivedtype, + string name: string ref, + int kind: int ref, + int type_id: @type ref +); + +pointerishsize(unique int id: @derivedtype ref, + int size: int ref, + int alignment: int ref); + +arraysizes( + unique int id: @derivedtype ref, + int num_elements: int ref, + int bytesize: int ref, + int alignment: int ref +); + +typedefbase( + unique int id: @usertype ref, + int type_id: @type ref +); + +decltypes( + unique int id: @decltype, + int expr: @expr ref, + int base_type: @type ref, + boolean parentheses_would_change_meaning: boolean ref +); + +/* + case @usertype.kind of + 1 = struct + | 2 = class + | 3 = union + | 4 = enum + | 5 = typedef // classic C: typedef typedef type name + | 6 = template + | 7 = template_parameter + | 8 = template_template_parameter + | 9 = proxy_class // a proxy class associated with a template parameter +// ... 10 objc_class deprecated +// ... 11 objc_protocol deprecated +// ... 12 objc_category deprecated + | 13 = scoped_enum + | 14 = using_alias // a using name = type style typedef + ; +*/ +usertypes( + unique int id: @usertype, + string name: string ref, + int kind: int ref +); + +usertypesize( + unique int id: @usertype ref, + int size: int ref, + int alignment: int ref +); + +usertype_final(unique int id: @usertype ref); + +usertype_uuid( + unique int id: @usertype ref, + unique string uuid: string ref +); + +mangled_name( + unique int id: @declaration ref, + int mangled_name : @mangledname +); + +is_pod_class(unique int id: @usertype ref); +is_standard_layout_class(unique int id: @usertype ref); + +is_complete(unique int id: @usertype ref); + +is_class_template(unique int id: @usertype ref); +class_instantiation( + int to: @usertype ref, + int from: @usertype ref +); +class_template_argument( + int type_id: @usertype ref, + int index: int ref, + int arg_type: @type ref +); +class_template_argument_value( + int type_id: @usertype ref, + int index: int ref, + int arg_value: @expr ref +); + +is_proxy_class_for( + unique int id: @usertype ref, + unique int templ_param_id: @usertype ref +); + +type_mentions( + unique int id: @type_mention, + int type_id: @type ref, + int location: @location ref, + // a_symbol_reference_kind from the EDG frontend. See symbol_ref.h there. + int kind: int ref +); + +is_function_template(unique int id: @function ref); +function_instantiation( + unique int to: @function ref, + int from: @function ref +); +function_template_argument( + int function_id: @function ref, + int index: int ref, + int arg_type: @type ref +); +function_template_argument_value( + int function_id: @function ref, + int index: int ref, + int arg_value: @expr ref +); + +is_variable_template(unique int id: @variable ref); +variable_instantiation( + unique int to: @variable ref, + int from: @variable ref +); +variable_template_argument( + int variable_id: @variable ref, + int index: int ref, + int arg_type: @type ref +); +variable_template_argument_value( + int variable_id: @variable ref, + int index: int ref, + int arg_value: @expr ref +); + +/* + Fixed point types + precision(1) = short, precision(2) = default, precision(3) = long + is_unsigned(1) = unsigned is_unsigned(2) = signed + is_fract_type(1) = declared with _Fract + saturating(1) = declared with _Sat +*/ +/* TODO +fixedpointtypes( + unique int id: @fixedpointtype, + int precision: int ref, + int is_unsigned: int ref, + int is_fract_type: int ref, + int saturating: int ref); +*/ + +routinetypes( + unique int id: @routinetype, + int return_type: @type ref +); + +routinetypeargs( + int routine: @routinetype ref, + int index: int ref, + int type_id: @type ref +); + +ptrtomembers( + unique int id: @ptrtomember, + int type_id: @type ref, + int class_id: @type ref +); + +/* + specifiers for types, functions, and variables + + "public", + "protected", + "private", + + "const", + "volatile", + "static", + + "pure", + "virtual", + "sealed", // Microsoft + "__interface", // Microsoft + "inline", + "explicit", + + "near", // near far extension + "far", // near far extension + "__ptr32", // Microsoft + "__ptr64", // Microsoft + "__sptr", // Microsoft + "__uptr", // Microsoft + "dllimport", // Microsoft + "dllexport", // Microsoft + "thread", // Microsoft + "naked", // Microsoft + "microsoft_inline", // Microsoft + "forceinline", // Microsoft + "selectany", // Microsoft + "nothrow", // Microsoft + "novtable", // Microsoft + "noreturn", // Microsoft + "noinline", // Microsoft + "noalias", // Microsoft + "restrict", // Microsoft +*/ + +specifiers( + unique int id: @specifier, + unique string str: string ref +); + +typespecifiers( + int type_id: @type ref, + int spec_id: @specifier ref +); + +funspecifiers( + int func_id: @function ref, + int spec_id: @specifier ref +); + +varspecifiers( + int var_id: @accessible ref, + int spec_id: @specifier ref +); + +attributes( + unique int id: @attribute, + int kind: int ref, + string name: string ref, + string name_space: string ref, + int location: @location_default ref +); + +case @attribute.kind of + 0 = @gnuattribute +| 1 = @stdattribute +| 2 = @declspec +| 3 = @msattribute +| 4 = @alignas +// ... 5 @objc_propertyattribute deprecated +; + +attribute_args( + unique int id: @attribute_arg, + int kind: int ref, + int attribute: @attribute ref, + int index: int ref, + int location: @location_default ref +); + +case @attribute_arg.kind of + 0 = @attribute_arg_empty +| 1 = @attribute_arg_token +| 2 = @attribute_arg_constant +| 3 = @attribute_arg_type +; + +attribute_arg_value( + unique int arg: @attribute_arg ref, + string value: string ref +); +attribute_arg_type( + unique int arg: @attribute_arg ref, + int type_id: @type ref +); +attribute_arg_name( + unique int arg: @attribute_arg ref, + string name: string ref +); + +typeattributes( + int type_id: @type ref, + int spec_id: @attribute ref +); + +funcattributes( + int func_id: @function ref, + int spec_id: @attribute ref +); + +varattributes( + int var_id: @accessible ref, + int spec_id: @attribute ref +); + +stmtattributes( + int stmt_id: @stmt ref, + int spec_id: @attribute ref +); + +@type = @builtintype + | @derivedtype + | @usertype + /* TODO | @fixedpointtype */ + | @routinetype + | @ptrtomember + | @decltype; + +unspecifiedtype( + unique int type_id: @type ref, + int unspecified_type_id: @type ref +); + +member( + int parent: @type ref, + int index: int ref, + int child: @member ref +); + +@enclosingfunction_child = @usertype | @variable | @namespace + +enclosingfunction( + unique int child: @enclosingfunction_child ref, + int parent: @function ref +); + +derivations( + unique int derivation: @derivation, + int sub: @type ref, + int index: int ref, + int super: @type ref, + int location: @location_default ref +); + +derspecifiers( + int der_id: @derivation ref, + int spec_id: @specifier ref +); + +/** + * Contains the byte offset of the base class subobject within the derived + * class. Only holds for non-virtual base classes, but see table + * `virtual_base_offsets` for offsets of virtual base class subobjects. + */ +direct_base_offsets( + unique int der_id: @derivation ref, + int offset: int ref +); + +/** + * Contains the byte offset of the virtual base class subobject for class + * `super` within a most-derived object of class `sub`. `super` can be either a + * direct or indirect base class. + */ +#keyset[sub, super] +virtual_base_offsets( + int sub: @usertype ref, + int super: @usertype ref, + int offset: int ref +); + +frienddecls( + unique int id: @frienddecl, + int type_id: @type ref, + int decl_id: @declaration ref, + int location: @location_default ref +); + +@declaredtype = @usertype ; + +@declaration = @function + | @declaredtype + | @variable + | @enumconstant + | @frienddecl; + +@member = @membervariable + | @function + | @declaredtype + | @enumconstant; + +@locatable = @diagnostic + | @declaration + | @ppd_include + | @ppd_define + | @macroinvocation + /*| @funcall*/ + | @xmllocatable + | @attribute + | @attribute_arg; + +@namedscope = @namespace | @usertype; + +@element = @locatable + | @file + | @folder + | @specifier + | @type + | @expr + | @namespace + | @initialiser + | @stmt + | @derivation + | @comment + | @preprocdirect + | @fun_decl + | @var_decl + | @type_decl + | @namespace_decl + | @using + | @namequalifier + | @specialnamequalifyingelement + | @static_assert + | @type_mention + | @lambdacapture; + +@exprparent = @element; + +comments( + unique int id: @comment, + string contents: string ref, + int location: @location_default ref +); + +commentbinding( + int id: @comment ref, + int element: @element ref +); + +exprconv( + int converted: @expr ref, + unique int conversion: @expr ref +); + +compgenerated(unique int id: @element ref); + +/** + * `destructor_call` destructs the `i`'th entity that should be + * destructed following `element`. Note that entities should be + * destructed in reverse construction order, so for a given `element` + * these should be called from highest to lowest `i`. + */ +#keyset[element, destructor_call] +#keyset[element, i] +synthetic_destructor_call( + int element: @element ref, + int i: int ref, + int destructor_call: @routineexpr ref +); + +namespaces( + unique int id: @namespace, + string name: string ref +); + +namespace_inline( + unique int id: @namespace ref +); + +namespacembrs( + int parentid: @namespace ref, + unique int memberid: @namespacembr ref +); + +@namespacembr = @declaration | @namespace; + +exprparents( + int expr_id: @expr ref, + int child_index: int ref, + int parent_id: @exprparent ref +); + +expr_isload(unique int expr_id: @expr ref); + +@cast = @c_style_cast + | @const_cast + | @dynamic_cast + | @reinterpret_cast + | @static_cast + ; + +/* +case @conversion.kind of + 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast +| 1 = @bool_conversion // conversion to 'bool' +| 2 = @base_class_conversion // a derived-to-base conversion +| 3 = @derived_class_conversion // a base-to-derived conversion +| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member +| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member +| 6 = @glvalue_adjust // an adjustment of the type of a glvalue +| 7 = @prvalue_adjust // an adjustment of the type of a prvalue +; +*/ +/** + * Describes the semantics represented by a cast expression. This is largely + * independent of the source syntax of the cast, so it is separate from the + * regular expression kind. + */ +conversionkinds( + unique int expr_id: @cast ref, + int kind: int ref +); + +@conversion = @cast + | @array_to_pointer + | @parexpr + | @reference_to + | @ref_indirect + | @temp_init + ; + +/* +case @funbindexpr.kind of + 0 = @normal_call // a normal call +| 1 = @virtual_call // a virtual call +| 2 = @adl_call // a call whose target is only found by ADL +; +*/ +iscall(unique int caller: @funbindexpr ref, int kind: int ref); + +numtemplatearguments( + unique int expr_id: @expr ref, + int num: int ref +); + +specialnamequalifyingelements( + unique int id: @specialnamequalifyingelement, + unique string name: string ref +); + +@namequalifiableelement = @expr | @namequalifier; +@namequalifyingelement = @namespace + | @specialnamequalifyingelement + | @usertype; + +namequalifiers( + unique int id: @namequalifier, + unique int qualifiableelement: @namequalifiableelement ref, + int qualifyingelement: @namequalifyingelement ref, + int location: @location_default ref +); + +varbind( + int expr: @varbindexpr ref, + int var: @accessible ref +); + +funbind( + int expr: @funbindexpr ref, + int fun: @function ref +); + +@any_new_expr = @new_expr + | @new_array_expr; + +@new_or_delete_expr = @any_new_expr + | @delete_expr + | @delete_array_expr; + +@prefix_crement_expr = @preincrexpr | @predecrexpr; + +@postfix_crement_expr = @postincrexpr | @postdecrexpr; + +@increment_expr = @preincrexpr | @postincrexpr; + +@decrement_expr = @predecrexpr | @postdecrexpr; + +@crement_expr = @increment_expr | @decrement_expr; + +@un_arith_op_expr = @arithnegexpr + | @unaryplusexpr + | @conjugation + | @realpartexpr + | @imagpartexpr + | @crement_expr + ; + +@un_bitwise_op_expr = @complementexpr; + +@un_log_op_expr = @notexpr; + +@un_op_expr = @address_of + | @indirect + | @un_arith_op_expr + | @un_bitwise_op_expr + | @builtinaddressof + | @vec_fill + | @un_log_op_expr + | @co_await + | @co_yield + ; + +@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr; + +@cmp_op_expr = @eq_op_expr | @rel_op_expr; + +@eq_op_expr = @eqexpr | @neexpr; + +@rel_op_expr = @gtexpr + | @ltexpr + | @geexpr + | @leexpr + | @spaceshipexpr + ; + +@bin_bitwise_op_expr = @lshiftexpr + | @rshiftexpr + | @andexpr + | @orexpr + | @xorexpr + ; + +@p_arith_op_expr = @paddexpr + | @psubexpr + | @pdiffexpr + ; + +@bin_arith_op_expr = @addexpr + | @subexpr + | @mulexpr + | @divexpr + | @remexpr + | @jmulexpr + | @jdivexpr + | @fjaddexpr + | @jfaddexpr + | @fjsubexpr + | @jfsubexpr + | @minexpr + | @maxexpr + | @p_arith_op_expr + ; + +@bin_op_expr = @bin_arith_op_expr + | @bin_bitwise_op_expr + | @cmp_op_expr + | @bin_log_op_expr + ; + +@op_expr = @un_op_expr + | @bin_op_expr + | @assign_expr + | @conditionalexpr + ; + +@assign_arith_expr = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + ; + +@assign_bitwise_expr = @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignpaddexpr + | @assignpsubexpr + ; + +@assign_op_expr = @assign_arith_expr | @assign_bitwise_expr + +@assign_expr = @assignexpr | @assign_op_expr + +/* + case @allocator.form of + 0 = plain + | 1 = alignment + ; +*/ + +/** + * The allocator function associated with a `new` or `new[]` expression. + * The `form` column specified whether the allocation call contains an alignment + * argument. + */ +expr_allocator( + unique int expr: @any_new_expr ref, + int func: @function ref, + int form: int ref +); + +/* + case @deallocator.form of + 0 = plain + | 1 = size + | 2 = alignment + | 3 = size_and_alignment + ; +*/ + +/** + * The deallocator function associated with a `delete`, `delete[]`, `new`, or + * `new[]` expression. For a `new` or `new[]` expression, the deallocator is the + * one used to free memory if the initialization throws an exception. + * The `form` column specifies whether the deallocation call contains a size + * argument, and alignment argument, or both. + */ +expr_deallocator( + unique int expr: @new_or_delete_expr ref, + int func: @function ref, + int form: int ref +); + +/** + * Holds if the `@conditionalexpr` is of the two operand form + * `guard ? : false`. + */ +expr_cond_two_operand( + unique int cond: @conditionalexpr ref +); + +/** + * The guard of `@conditionalexpr` `guard ? true : false` + */ +expr_cond_guard( + unique int cond: @conditionalexpr ref, + int guard: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` holds. For the two operand form + * `guard ?: false` consider using `expr_cond_guard` instead. + */ +expr_cond_true( + unique int cond: @conditionalexpr ref, + int true: @expr ref +); + +/** + * The expression used when the guard of `@conditionalexpr` + * `guard ? true : false` does not hold. + */ +expr_cond_false( + unique int cond: @conditionalexpr ref, + int false: @expr ref +); + +/** A string representation of the value. */ +values( + unique int id: @value, + string str: string ref +); + +/** The actual text in the source code for the value, if any. */ +valuetext( + unique int id: @value ref, + string text: string ref +); + +valuebind( + int val: @value ref, + unique int expr: @expr ref +); + +fieldoffsets( + unique int id: @variable ref, + int byteoffset: int ref, + int bitoffset: int ref +); + +bitfield( + unique int id: @variable ref, + int bits: int ref, + int declared_bits: int ref +); + +/* TODO +memberprefix( + int member: @expr ref, + int prefix: @expr ref +); +*/ + +/* + kind(1) = mbrcallexpr + kind(2) = mbrptrcallexpr + kind(3) = mbrptrmbrcallexpr + kind(4) = ptrmbrptrmbrcallexpr + kind(5) = mbrreadexpr // x.y + kind(6) = mbrptrreadexpr // p->y + kind(7) = mbrptrmbrreadexpr // x.*pm + kind(8) = mbrptrmbrptrreadexpr // x->*pm + kind(9) = staticmbrreadexpr // static x.y + kind(10) = staticmbrptrreadexpr // static p->y +*/ +/* TODO +memberaccess( + int member: @expr ref, + int kind: int ref +); +*/ + +initialisers( + unique int init: @initialiser, + int var: @accessible ref, + unique int expr: @expr ref, + int location: @location_expr ref +); + +/** + * An ancestor for the expression, for cases in which we cannot + * otherwise find the expression's parent. + */ +expr_ancestor( + int exp: @expr ref, + int ancestor: @element ref +); + +exprs( + unique int id: @expr, + int kind: int ref, + int location: @location_expr ref +); + +/* + case @value.category of + 1 = prval + | 2 = xval + | 3 = lval + ; +*/ +expr_types( + int id: @expr ref, + int typeid: @type ref, + int value_category: int ref +); + +case @expr.kind of + 1 = @errorexpr +| 2 = @address_of // & AddressOfExpr +| 3 = @reference_to // ReferenceToExpr (implicit?) +| 4 = @indirect // * PointerDereferenceExpr +| 5 = @ref_indirect // ReferenceDereferenceExpr (implicit?) +// ... +| 8 = @array_to_pointer // (???) +| 9 = @vacuous_destructor_call // VacuousDestructorCall +// ... +| 11 = @assume // Microsoft +| 12 = @parexpr +| 13 = @arithnegexpr +| 14 = @unaryplusexpr +| 15 = @complementexpr +| 16 = @notexpr +| 17 = @conjugation // GNU ~ operator +| 18 = @realpartexpr // GNU __real +| 19 = @imagpartexpr // GNU __imag +| 20 = @postincrexpr +| 21 = @postdecrexpr +| 22 = @preincrexpr +| 23 = @predecrexpr +| 24 = @conditionalexpr +| 25 = @addexpr +| 26 = @subexpr +| 27 = @mulexpr +| 28 = @divexpr +| 29 = @remexpr +| 30 = @jmulexpr // C99 mul imaginary +| 31 = @jdivexpr // C99 div imaginary +| 32 = @fjaddexpr // C99 add real + imaginary +| 33 = @jfaddexpr // C99 add imaginary + real +| 34 = @fjsubexpr // C99 sub real - imaginary +| 35 = @jfsubexpr // C99 sub imaginary - real +| 36 = @paddexpr // pointer add (pointer + int or int + pointer) +| 37 = @psubexpr // pointer sub (pointer - integer) +| 38 = @pdiffexpr // difference between two pointers +| 39 = @lshiftexpr +| 40 = @rshiftexpr +| 41 = @andexpr +| 42 = @orexpr +| 43 = @xorexpr +| 44 = @eqexpr +| 45 = @neexpr +| 46 = @gtexpr +| 47 = @ltexpr +| 48 = @geexpr +| 49 = @leexpr +| 50 = @minexpr // GNU minimum +| 51 = @maxexpr // GNU maximum +| 52 = @assignexpr +| 53 = @assignaddexpr +| 54 = @assignsubexpr +| 55 = @assignmulexpr +| 56 = @assigndivexpr +| 57 = @assignremexpr +| 58 = @assignlshiftexpr +| 59 = @assignrshiftexpr +| 60 = @assignandexpr +| 61 = @assignorexpr +| 62 = @assignxorexpr +| 63 = @assignpaddexpr // assign pointer add +| 64 = @assignpsubexpr // assign pointer sub +| 65 = @andlogicalexpr +| 66 = @orlogicalexpr +| 67 = @commaexpr +| 68 = @subscriptexpr // access to member of an array, e.g., a[5] +// ... 69 @objc_subscriptexpr deprecated +// ... 70 @cmdaccess deprecated +// ... +| 73 = @virtfunptrexpr +| 74 = @callexpr +// ... 75 @msgexpr_normal deprecated +// ... 76 @msgexpr_super deprecated +// ... 77 @atselectorexpr deprecated +// ... 78 @atprotocolexpr deprecated +| 79 = @vastartexpr +| 80 = @vaargexpr +| 81 = @vaendexpr +| 82 = @vacopyexpr +// ... 83 @atencodeexpr deprecated +| 84 = @varaccess +| 85 = @thisaccess +// ... 86 @objc_box_expr deprecated +| 87 = @new_expr +| 88 = @delete_expr +| 89 = @throw_expr +| 90 = @condition_decl // a variable declared in a condition, e.g., if(int x = y > 2) +| 91 = @braced_init_list +| 92 = @type_id +| 93 = @runtime_sizeof +| 94 = @runtime_alignof +| 95 = @sizeof_pack +| 96 = @expr_stmt // GNU extension +| 97 = @routineexpr +| 98 = @type_operand // used to access a type in certain contexts (haven't found any examples yet....) +| 99 = @offsetofexpr // offsetof ::= type and field +| 100 = @hasassignexpr // __has_assign ::= type +| 101 = @hascopyexpr // __has_copy ::= type +| 102 = @hasnothrowassign // __has_nothrow_assign ::= type +| 103 = @hasnothrowconstr // __has_nothrow_constructor ::= type +| 104 = @hasnothrowcopy // __has_nothrow_copy ::= type +| 105 = @hastrivialassign // __has_trivial_assign ::= type +| 106 = @hastrivialconstr // __has_trivial_constructor ::= type +| 107 = @hastrivialcopy // __has_trivial_copy ::= type +| 108 = @hasuserdestr // __has_user_destructor ::= type +| 109 = @hasvirtualdestr // __has_virtual_destructor ::= type +| 110 = @isabstractexpr // __is_abstract ::= type +| 111 = @isbaseofexpr // __is_base_of ::= type type +| 112 = @isclassexpr // __is_class ::= type +| 113 = @isconvtoexpr // __is_convertible_to ::= type type +| 114 = @isemptyexpr // __is_empty ::= type +| 115 = @isenumexpr // __is_enum ::= type +| 116 = @ispodexpr // __is_pod ::= type +| 117 = @ispolyexpr // __is_polymorphic ::= type +| 118 = @isunionexpr // __is_union ::= type +| 119 = @typescompexpr // GNU __builtin_types_compatible ::= type type +| 120 = @intaddrexpr // EDG internal builtin, used to implement offsetof +// ... +| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type +| 123 = @literal +| 124 = @uuidof +| 127 = @aggregateliteral +| 128 = @delete_array_expr +| 129 = @new_array_expr +// ... 130 @objc_array_literal deprecated +// ... 131 @objc_dictionary_literal deprecated +| 132 = @foldexpr +// ... +| 200 = @ctordirectinit +| 201 = @ctorvirtualinit +| 202 = @ctorfieldinit +| 203 = @ctordelegatinginit +| 204 = @dtordirectdestruct +| 205 = @dtorvirtualdestruct +| 206 = @dtorfielddestruct +// ... +| 210 = @static_cast +| 211 = @reinterpret_cast +| 212 = @const_cast +| 213 = @dynamic_cast +| 214 = @c_style_cast +| 215 = @lambdaexpr +| 216 = @param_ref +| 217 = @noopexpr +// ... +| 294 = @istriviallyconstructibleexpr +| 295 = @isdestructibleexpr +| 296 = @isnothrowdestructibleexpr +| 297 = @istriviallydestructibleexpr +| 298 = @istriviallyassignableexpr +| 299 = @isnothrowassignableexpr +| 300 = @istrivialexpr +| 301 = @isstandardlayoutexpr +| 302 = @istriviallycopyableexpr +| 303 = @isliteraltypeexpr +| 304 = @hastrivialmoveconstructorexpr +| 305 = @hastrivialmoveassignexpr +| 306 = @hasnothrowmoveassignexpr +| 307 = @isconstructibleexpr +| 308 = @isnothrowconstructibleexpr +| 309 = @hasfinalizerexpr +| 310 = @isdelegateexpr +| 311 = @isinterfaceclassexpr +| 312 = @isrefarrayexpr +| 313 = @isrefclassexpr +| 314 = @issealedexpr +| 315 = @issimplevalueclassexpr +| 316 = @isvalueclassexpr +| 317 = @isfinalexpr +| 319 = @noexceptexpr +| 320 = @builtinshufflevector +| 321 = @builtinchooseexpr +| 322 = @builtinaddressof +| 323 = @vec_fill +| 324 = @builtinconvertvector +| 325 = @builtincomplex +| 326 = @spaceshipexpr +| 327 = @co_await +| 328 = @co_yield +| 329 = @temp_init +; + +@var_args_expr = @vastartexpr + | @vaendexpr + | @vaargexpr + | @vacopyexpr + ; + +@builtin_op = @var_args_expr + | @noopexpr + | @offsetofexpr + | @intaddrexpr + | @hasassignexpr + | @hascopyexpr + | @hasnothrowassign + | @hasnothrowconstr + | @hasnothrowcopy + | @hastrivialassign + | @hastrivialconstr + | @hastrivialcopy + | @hastrivialdestructor + | @hasuserdestr + | @hasvirtualdestr + | @isabstractexpr + | @isbaseofexpr + | @isclassexpr + | @isconvtoexpr + | @isemptyexpr + | @isenumexpr + | @ispodexpr + | @ispolyexpr + | @isunionexpr + | @typescompexpr + | @builtinshufflevector + | @builtinconvertvector + | @builtinaddressof + | @istriviallyconstructibleexpr + | @isdestructibleexpr + | @isnothrowdestructibleexpr + | @istriviallydestructibleexpr + | @istriviallyassignableexpr + | @isnothrowassignableexpr + | @isstandardlayoutexpr + | @istriviallycopyableexpr + | @isliteraltypeexpr + | @hastrivialmoveconstructorexpr + | @hastrivialmoveassignexpr + | @hasnothrowmoveassignexpr + | @isconstructibleexpr + | @isnothrowconstructibleexpr + | @hasfinalizerexpr + | @isdelegateexpr + | @isinterfaceclassexpr + | @isrefarrayexpr + | @isrefclassexpr + | @issealedexpr + | @issimplevalueclassexpr + | @isvalueclassexpr + | @isfinalexpr + | @builtinchooseexpr + | @builtincomplex + ; + +new_allocated_type( + unique int expr: @new_expr ref, + int type_id: @type ref +); + +new_array_allocated_type( + unique int expr: @new_array_expr ref, + int type_id: @type ref +); + +/** + * The field being initialized by an initializer expression within an aggregate + * initializer for a class/struct/union. + */ +#keyset[aggregate, field] +aggregate_field_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int field: @membervariable ref +); + +/** + * The index of the element being initialized by an initializer expression + * within an aggregate initializer for an array. + */ +#keyset[aggregate, element_index] +aggregate_array_init( + int aggregate: @aggregateliteral ref, + int initializer: @expr ref, + int element_index: int ref +); + +@ctorinit = @ctordirectinit + | @ctorvirtualinit + | @ctorfieldinit + | @ctordelegatinginit; +@dtordestruct = @dtordirectdestruct + | @dtorvirtualdestruct + | @dtorfielddestruct; + + +condition_decl_bind( + unique int expr: @condition_decl ref, + unique int decl: @declaration ref +); + +typeid_bind( + unique int expr: @type_id ref, + int type_id: @type ref +); + +uuidof_bind( + unique int expr: @uuidof ref, + int type_id: @type ref +); + +@runtime_sizeof_or_alignof = @runtime_sizeof | @runtime_alignof; + +sizeof_bind( + unique int expr: @runtime_sizeof_or_alignof ref, + int type_id: @type ref +); + +code_block( + unique int block: @literal ref, + unique int routine: @function ref +); + +lambdas( + unique int expr: @lambdaexpr ref, + string default_capture: string ref, + boolean has_explicit_return_type: boolean ref +); + +lambda_capture( + unique int id: @lambdacapture, + int lambda: @lambdaexpr ref, + int index: int ref, + int field: @membervariable ref, + boolean captured_by_reference: boolean ref, + boolean is_implicit: boolean ref, + int location: @location_default ref +); + +@funbindexpr = @routineexpr + | @new_expr + | @delete_expr + | @delete_array_expr + | @ctordirectinit + | @ctorvirtualinit + | @ctordelegatinginit + | @dtordirectdestruct + | @dtorvirtualdestruct; + +@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct; +@addressable = @function | @variable ; +@accessible = @addressable | @enumconstant ; + +@access = @varaccess | @routineexpr ; + +fold( + int expr: @foldexpr ref, + string operator: string ref, + boolean is_left_fold: boolean ref +); + +stmts( + unique int id: @stmt, + int kind: int ref, + int location: @location_stmt ref +); + +case @stmt.kind of + 1 = @stmt_expr +| 2 = @stmt_if +| 3 = @stmt_while +| 4 = @stmt_goto +| 5 = @stmt_label +| 6 = @stmt_return +| 7 = @stmt_block +| 8 = @stmt_end_test_while // do { ... } while ( ... ) +| 9 = @stmt_for +| 10 = @stmt_switch_case +| 11 = @stmt_switch +| 13 = @stmt_asm // "asm" statement or the body of an asm function +| 15 = @stmt_try_block +| 16 = @stmt_microsoft_try // Microsoft +| 17 = @stmt_decl +| 18 = @stmt_set_vla_size // C99 +| 19 = @stmt_vla_decl // C99 +| 25 = @stmt_assigned_goto // GNU +| 26 = @stmt_empty +| 27 = @stmt_continue +| 28 = @stmt_break +| 29 = @stmt_range_based_for // C++11 +// ... 30 @stmt_at_autoreleasepool_block deprecated +// ... 31 @stmt_objc_for_in deprecated +// ... 32 @stmt_at_synchronized deprecated +| 33 = @stmt_handler +// ... 34 @stmt_finally_end deprecated +| 35 = @stmt_constexpr_if +| 37 = @stmt_co_return +; + +type_vla( + int type_id: @type ref, + int decl: @stmt_vla_decl ref +); + +variable_vla( + int var: @variable ref, + int decl: @stmt_vla_decl ref +); + +if_then( + unique int if_stmt: @stmt_if ref, + int then_id: @stmt ref +); + +if_else( + unique int if_stmt: @stmt_if ref, + int else_id: @stmt ref +); + +constexpr_if_then( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int then_id: @stmt ref +); + +constexpr_if_else( + unique int constexpr_if_stmt: @stmt_constexpr_if ref, + int else_id: @stmt ref +); + +while_body( + unique int while_stmt: @stmt_while ref, + int body_id: @stmt ref +); + +do_body( + unique int do_stmt: @stmt_end_test_while ref, + int body_id: @stmt ref +); + +#keyset[switch_stmt, index] +switch_case( + int switch_stmt: @stmt_switch ref, + int index: int ref, + int case_id: @stmt_switch_case ref +); + +switch_body( + unique int switch_stmt: @stmt_switch ref, + int body_id: @stmt ref +); + +for_initialization( + unique int for_stmt: @stmt_for ref, + int init_id: @stmt ref +); + +for_condition( + unique int for_stmt: @stmt_for ref, + int condition_id: @expr ref +); + +for_update( + unique int for_stmt: @stmt_for ref, + int update_id: @expr ref +); + +for_body( + unique int for_stmt: @stmt_for ref, + int body_id: @stmt ref +); + +@stmtparent = @stmt | @expr_stmt ; +stmtparents( + unique int id: @stmt ref, + int index: int ref, + int parent: @stmtparent ref +); + +ishandler(unique int block: @stmt_block ref); + +@cfgnode = @stmt | @expr | @function | @initialiser ; + +stmt_decl_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl: @declaration ref +); + +stmt_decl_entry_bind( + int stmt: @stmt_decl ref, + int num: int ref, + int decl_entry: @element ref +); + +@functionorblock = @function | @stmt_block; + +blockscope( + unique int block: @stmt_block ref, + int enclosing: @functionorblock ref +); + +@jump = @stmt_goto | @stmt_break | @stmt_continue; + +@jumporlabel = @jump | @stmt_label | @literal; + +jumpinfo( + unique int id: @jumporlabel ref, + string str: string ref, + int target: @stmt ref +); + +preprocdirects( + unique int id: @preprocdirect, + int kind: int ref, + int location: @location_default ref +); +case @preprocdirect.kind of + 0 = @ppd_if +| 1 = @ppd_ifdef +| 2 = @ppd_ifndef +| 3 = @ppd_elif +| 4 = @ppd_else +| 5 = @ppd_endif +| 6 = @ppd_plain_include +| 7 = @ppd_define +| 8 = @ppd_undef +| 9 = @ppd_line +| 10 = @ppd_error +| 11 = @ppd_pragma +| 12 = @ppd_objc_import +| 13 = @ppd_include_next +| 18 = @ppd_warning +; + +@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next; + +@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif; + +preprocpair( + int begin : @ppd_branch ref, + int elseelifend : @preprocdirect ref +); + +preproctrue(int branch : @ppd_branch ref); +preprocfalse(int branch : @ppd_branch ref); + +preproctext( + unique int id: @preprocdirect ref, + string head: string ref, + string body: string ref +); + +includes( + unique int id: @ppd_include ref, + int included: @file ref +); + +link_targets( + unique int id: @link_target, + int binary: @file ref +); + +link_parent( + int element : @element ref, + int link_target : @link_target ref +); + +/* XML Files */ + +xmlEncoding(unique int id: @file ref, string encoding: string ref); + +xmlDTDs( + unique int id: @xmldtd, + string root: string ref, + string publicId: string ref, + string systemId: string ref, + int fileid: @file ref +); + +xmlElements( + unique int id: @xmlelement, + string name: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int fileid: @file ref +); + +xmlAttrs( + unique int id: @xmlattribute, + int elementid: @xmlelement ref, + string name: string ref, + string value: string ref, + int idx: int ref, + int fileid: @file ref +); + +xmlNs( + int id: @xmlnamespace, + string prefixName: string ref, + string URI: string ref, + int fileid: @file ref +); + +xmlHasNs( + int elementId: @xmlnamespaceable ref, + int nsId: @xmlnamespace ref, + int fileid: @file ref +); + +xmlComments( + unique int id: @xmlcomment, + string text: string ref, + int parentid: @xmlparent ref, + int fileid: @file ref +); + +xmlChars( + unique int id: @xmlcharacters, + string text: string ref, + int parentid: @xmlparent ref, + int idx: int ref, + int isCDATA: int ref, + int fileid: @file ref +); + +@xmlparent = @file | @xmlelement; +@xmlnamespaceable = @xmlelement | @xmlattribute; + +xmllocations( + int xmlElement: @xmllocatable ref, + int location: @location_default ref +); + +@xmllocatable = @xmlcharacters + | @xmlelement + | @xmlcomment + | @xmlattribute + | @xmldtd + | @file + | @xmlnamespace; diff --git a/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/upgrade.properties b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/upgrade.properties new file mode 100644 index 000000000000..c9856bdaad2b --- /dev/null +++ b/cpp/upgrades/ef73d8cf906d356a00a10d0e8dc0e1c1e66d210c/upgrade.properties @@ -0,0 +1,2 @@ +description: Add temporary object initializations +compatibility: partial diff --git a/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll b/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll +++ b/csharp/ql/src/experimental/ir/implementation/raw/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll index 6a87b9b4b5fd..f331f4c87bf3 100644 --- a/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll +++ b/csharp/ql/src/experimental/ir/implementation/unaliased_ssa/IRConsistency.qll @@ -494,4 +494,34 @@ module InstructionConsistency { irFunc = getInstructionIRFunction(instr, irFuncText) ) } + + /** + * Holds if the object address operand for the given `FieldAddress` instruction does not have an + * address type. + */ + query predicate fieldAddressOnNonPointer( + FieldAddressInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + not instr.getObjectAddressOperand().getIRType() instanceof IRAddressType and + message = + "FieldAddress instruction '" + instr.toString() + + "' has an object address operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } + + /** + * Holds if the `this` argument operand for the given `Call` instruction does not have an address + * type. + */ + query predicate thisArgumentIsNonPointer( + CallInstruction instr, string message, OptionalIRFunction irFunc, string irFuncText + ) { + exists(ThisArgumentOperand thisOperand | thisOperand = instr.getThisArgumentOperand() | + not thisOperand.getIRType() instanceof IRAddressType + ) and + message = + "Call instruction '" + instr.toString() + + "' has a `this` argument operand that is not an address, in function '$@'." and + irFunc = getInstructionIRFunction(instr, irFuncText) + } } diff --git a/csharp/ql/test/experimental/ir/ir/raw_ir_consistency.expected b/csharp/ql/test/experimental/ir/ir/raw_ir_consistency.expected index 5d16b01eaca5..b2f9c0da1607 100644 --- a/csharp/ql/test/experimental/ir/ir/raw_ir_consistency.expected +++ b/csharp/ql/test/experimental/ir/ir/raw_ir_consistency.expected @@ -21,6 +21,16 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| inoutref.cs:18:9:18:13 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | +| inoutref.cs:19:13:19:17 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | +| pointers.cs:35:17:35:24 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() | +thisArgumentIsNonPointer +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| inoutref.cs:32:22:32:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | inoutref.cs:29:17:29:20 | System.Void InOutRef.Main() | System.Void InOutRef.Main() | +| pointers.cs:27:22:27:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/csharp/ql/test/experimental/ir/ir/unaliased_ssa_consistency.expected b/csharp/ql/test/experimental/ir/ir/unaliased_ssa_consistency.expected index 5d16b01eaca5..b2f9c0da1607 100644 --- a/csharp/ql/test/experimental/ir/ir/unaliased_ssa_consistency.expected +++ b/csharp/ql/test/experimental/ir/ir/unaliased_ssa_consistency.expected @@ -21,6 +21,16 @@ notMarkedAsConflated wronglyMarkedAsConflated invalidOverlap nonUniqueEnclosingIRFunction +fieldAddressOnNonPointer +| inoutref.cs:18:9:18:13 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | +| inoutref.cs:19:13:19:17 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | inoutref.cs:16:17:16:17 | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) | +| pointers.cs:35:17:35:24 | FieldAddress: access to field fld | FieldAddress instruction 'FieldAddress: access to field fld' has an object address operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() | +thisArgumentIsNonPointer +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| foreach.cs:7:9:10:9 | Call: foreach (... ... in ...) ... | Call instruction 'Call: foreach (... ... in ...) ...' has a `this` argument operand that is not an address, in function '$@'. | foreach.cs:4:24:4:27 | System.Void ForEach.Main() | System.Void ForEach.Main() | +| inoutref.cs:32:22:32:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | inoutref.cs:29:17:29:20 | System.Void InOutRef.Main() | System.Void InOutRef.Main() | +| pointers.cs:27:22:27:35 | Call: object creation of type MyStruct | Call instruction 'Call: object creation of type MyStruct' has a `this` argument operand that is not an address, in function '$@'. | pointers.cs:25:17:25:20 | System.Void Pointers.Main() | System.Void Pointers.Main() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType