diff --git a/change-notes/1.23/analysis-cpp.md b/change-notes/1.23/analysis-cpp.md
index 64e9b98fcfb..a92f78ca2f7 100644
--- a/change-notes/1.23/analysis-cpp.md
+++ b/change-notes/1.23/analysis-cpp.md
@@ -39,6 +39,10 @@ The following changes in version 1.23 affect C/C++ analysis in all applications.
definition of `x` when `x` is a variable of pointer type. It no longer
considers deep paths such as `f(&x.myField)` to be definitions of `x`. These
changes are in line with the user expectations we've observed.
+* The data-flow library now makes it easier to specify barriers/sanitizers
+ arising from guards by overriding the predicate
+ `isBarrierGuard`/`isSanitizerGuard` on data-flow and taint-tracking
+ configurations respectively.
* There is now a `DataFlow::localExprFlow` predicate and a
`TaintTracking::localExprTaint` predicate to make it easy to use the most
common case of local data flow and taint: from one `Expr` to another.
@@ -50,3 +54,8 @@ The following changes in version 1.23 affect C/C++ analysis in all applications.
lead to regressions (or improvements) in how queries are optimized because
optimization in QL relies on static size estimates, and the control-flow edge
relations will now have different size estimates than before.
+* Support has been added for non-type template arguments. This means that the
+ return type of `Declaration::getTemplateArgument()` and
+ `Declaration::getATemplateArgument` have changed to `Locatable`. See the
+ documentation for `Declaration::getTemplateArgument()` and
+ `Declaration::getTemplateArgumentKind()` for details.
diff --git a/change-notes/1.23/analysis-csharp.md b/change-notes/1.23/analysis-csharp.md
index 7ec412a0eb2..df11c0c4abc 100644
--- a/change-notes/1.23/analysis-csharp.md
+++ b/change-notes/1.23/analysis-csharp.md
@@ -8,6 +8,7 @@ The following changes in version 1.23 affect C# analysis in all applications.
| **Query** | **Tags** | **Purpose** |
|-----------------------------|-----------|--------------------------------------------------------------------|
+| Deserialized delegate (`cs/deserialized-delegate`) | security, external/cwe/cwe-502 | Finds unsafe deserialization of delegate types. |
| Unsafe year argument for 'DateTime' constructor (`cs/unsafe-year-construction`) | reliability, date-time | Finds incorrect manipulation of `DateTime` values, which could lead to invalid dates. |
| Mishandling the Japanese era start date (`cs/mishandling-japanese-era`) | reliability, date-time | Finds hard-coded Japanese era start dates that could be invalid. |
@@ -43,5 +44,6 @@ The following changes in version 1.23 affect C# analysis in all applications.
* There is now a `DataFlow::localExprFlow` predicate and a
`TaintTracking::localExprTaint` predicate to make it easy to use the most
common case of local data flow and taint: from one `Expr` to another.
+* Data is now tracked through null-coalescing expressions (`??`).
## Changes to autobuilder
diff --git a/change-notes/1.23/analysis-javascript.md b/change-notes/1.23/analysis-javascript.md
index 20f9ad1df87..49f527af424 100644
--- a/change-notes/1.23/analysis-javascript.md
+++ b/change-notes/1.23/analysis-javascript.md
@@ -2,7 +2,7 @@
## General improvements
-* Suppor for `globalThis` has been added.
+* Support for `globalThis` has been added.
* Support for the following frameworks and libraries has been improved:
- [firebase](https://www.npmjs.com/package/firebase)
@@ -12,8 +12,9 @@
* The call graph has been improved to resolve method calls in more cases. This may produce more security alerts.
-* TypeScript 3.6 features are supported.
+* TypeScript 3.6 and 3.7 features are now supported.
+* Automatic classification of generated files has been improved, in particular files generated by Doxygen are now recognized.
## New queries
@@ -26,11 +27,13 @@
| Use of returnless function (`js/use-of-returnless-function`) | maintainability, correctness | Highlights calls where the return value is used, but the callee never returns a value. Results are shown on LGTM by default. |
| Useless regular expression character escape (`js/useless-regexp-character-escape`) | correctness, security, external/cwe/cwe-20 | Highlights regular expression strings with useless character escapes, indicating a possible violation of [CWE-20](https://cwe.mitre.org/data/definitions/20.html). Results are shown on LGTM by default. |
| Unreachable method overloads (`js/unreachable-method-overloads`) | correctness, typescript | Highlights method overloads that are impossible to use from client code. Results are shown on LGTM by default. |
+| Ignoring result from pure array method (`js/ignore-array-result`) | maintainability, correctness | Highlights calls to array methods without side effects where the return value is ignored. Results are shown on LGTM by default. |
## Changes to existing queries
| **Query** | **Expected impact** | **Change** |
|--------------------------------|------------------------------|---------------------------------------------------------------------------|
+| Double escaping or unescaping (`js/double-escaping`) | More results | This rule now detects additional escaping and unescaping functions. |
| Incomplete string escaping or encoding (`js/incomplete-sanitization`) | Fewer false-positive results | This rule now recognizes additional ways delimiters can be stripped away. |
| Client-side cross-site scripting (`js/xss`) | More results, fewer false-positive results | More potential vulnerabilities involving functions that manipulate DOM attributes are now recognized, and more sanitizers are detected. |
| Code injection (`js/code-injection`) | More results | More potential vulnerabilities involving functions that manipulate DOM event handler attributes are now recognized. |
diff --git a/change-notes/1.23/analysis-python.md b/change-notes/1.23/analysis-python.md
index 00fab13e098..6cea1745284 100644
--- a/change-notes/1.23/analysis-python.md
+++ b/change-notes/1.23/analysis-python.md
@@ -20,3 +20,8 @@
|----------------------------|------------------------|------------|
| Unreachable code | Fewer false positives | Analysis now accounts for uses of `contextlib.suppress` to suppress exceptions. |
| `__iter__` method returns a non-iterator | Better alert message | Alert now highlights which class is expected to be an iterator. |
+
+
+## Changes to QL libraries
+
+* Django library now recognizes positional arguments from a `django.conf.urls.url` regex (Django version 1.x)
diff --git a/cpp/ql/src/Best Practices/Unused Entities/UnusedStaticVariables.ql b/cpp/ql/src/Best Practices/Unused Entities/UnusedStaticVariables.ql
index 26cf42521e5..3ad43998d18 100644
--- a/cpp/ql/src/Best Practices/Unused Entities/UnusedStaticVariables.ql
+++ b/cpp/ql/src/Best Practices/Unused Entities/UnusedStaticVariables.ql
@@ -21,6 +21,7 @@ from Variable v
where
v.isStatic() and
v.hasDefinition() and
+ not v.isConstexpr() and
not exists(VariableAccess a | a.getTarget() = v) and
not v instanceof MemberVariable and
not declarationHasSideEffects(v) and
diff --git a/cpp/ql/src/Likely Bugs/Memory Management/Buffer Overflow/NtohlArrayNoBoundOpenSource.qhelp b/cpp/ql/src/Likely Bugs/Memory Management/Buffer Overflow/NtohlArrayNoBoundOpenSource.qhelp
index 522d6cde74c..fc8f309f73a 100644
--- a/cpp/ql/src/Likely Bugs/Memory Management/Buffer Overflow/NtohlArrayNoBoundOpenSource.qhelp
+++ b/cpp/ql/src/Likely Bugs/Memory Management/Buffer Overflow/NtohlArrayNoBoundOpenSource.qhelp
@@ -14,7 +14,7 @@ byte order function, such as ntohl.
The use of a network-to-host byte order function is therefore a good indicator that the returned
value is unvalidated data retrieved from the network, and should not be used without further
validation. In particular, the returned value should not be used as an array index or array length
-value without validation, which may result in a buffer overflow vulnerability.
+value without validation, as this could result in a buffer overflow vulnerability.
diff --git a/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariable.qhelp b/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariable.qhelp
index b9118edc736..8e6a8903483 100644
--- a/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariable.qhelp
+++ b/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariable.qhelp
@@ -37,7 +37,7 @@ which is then subsequently accessed to fetch properties of the device. However,
check the return value from the function call to initDeviceConfig. If the
device number passed to the notify function was invalid, the
initDeviceConfig function will leave the config variable uninitialized,
-which would result in the notify function accessing uninitialized memory.
+which will result in the notify function accessing uninitialized memory.
diff --git a/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariable.ql b/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariable.ql
index eb00fb9ea10..f9eb2fe5400 100644
--- a/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariable.ql
+++ b/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariable.ql
@@ -2,7 +2,7 @@
* @name Conditionally uninitialized variable
* @description When an initialization function is used to initialize a local variable, but the
* returned status code is not checked, the variable may be left in an uninitialized
- * state, and reading the variable may result in undefined behaviour.
+ * state, and reading the variable may result in undefined behavior.
* @kind problem
* @problem.severity warning
* @opaque-id SM02313
diff --git a/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariableBad.c b/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariableBad.c
index 1f281f3cfd9..73a01c2d900 100644
--- a/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariableBad.c
+++ b/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariableBad.c
@@ -19,7 +19,7 @@ int notify(int deviceNumber) {
DeviceConfig config;
initDeviceConfig(&config, deviceNumber);
// BAD: Using config without checking the status code that is returned
- if (config->isEnabled) {
- notifyChannel(config->channel);
+ if (config.isEnabled) {
+ notifyChannel(config.channel);
}
-}
\ No newline at end of file
+}
diff --git a/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariableGood.c b/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariableGood.c
index a9dcc06c9a5..ced43a66cfc 100644
--- a/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariableGood.c
+++ b/cpp/ql/src/Security/CWE/CWE-457/ConditionallyUninitializedVariableGood.c
@@ -20,8 +20,8 @@ void notify(int deviceNumber) {
int statusCode = initDeviceConfig(&config, deviceNumber);
if (statusCode == 0) {
// GOOD: Status code returned by initialization function is checked, so this is safe
- if (config->isEnabled) {
- notifyChannel(config->channel);
+ if (config.isEnabled) {
+ notifyChannel(config.channel);
}
}
-}
\ No newline at end of file
+}
diff --git a/cpp/ql/src/Security/CWE/CWE-457/InitializationFunctions.qll b/cpp/ql/src/Security/CWE/CWE-457/InitializationFunctions.qll
index 240bd7aa25e..86102008e2b 100644
--- a/cpp/ql/src/Security/CWE/CWE-457/InitializationFunctions.qll
+++ b/cpp/ql/src/Security/CWE/CWE-457/InitializationFunctions.qll
@@ -620,32 +620,47 @@ Function getAPossibleDefinition(Function undefinedFunction) {
}
/**
- * Gets a possible target for the Call, using the name and parameter matching if we did not associate
+ * Helper predicate for `getTarget`, that computes possible targets of a `Call`.
+ *
+ * If there is at least one defined target after performing some simple virtual dispatch
+ * resolution, then the result is all the defined targets.
+ */
+private Function getTarget1(Call c) {
+ result = VirtualDispatch::getAViableTarget(c) and
+ result.isDefined()
+}
+
+/**
+ * Helper predicate for `getTarget`, that computes possible targets of a `Call`.
+ *
+ * If we can use the heuristic matching of functions to find definitions for some of the viable
+ * targets, return those.
+ */
+private Function getTarget2(Call c) {
+ not exists(getTarget1(c)) and
+ result = getAPossibleDefinition(VirtualDispatch::getAViableTarget(c))
+}
+
+/**
+ * Helper predicate for `getTarget`, that computes possible targets of a `Call`.
+ *
+ * Otherwise, the result is the undefined `Function` instances.
+ */
+private Function getTarget3(Call c) {
+ not exists(getTarget1(c)) and
+ not exists(getTarget2(c)) and
+ result = VirtualDispatch::getAViableTarget(c)
+}
+
+/**
+ * Gets a possible target for the `Call`, using the name and parameter matching if we did not associate
* this call with a specific definition at link or compile time, and performing simple virtual
* dispatch resolution.
*/
Function getTarget(Call c) {
- if VirtualDispatch::getAViableTarget(c).isDefined()
- then
- /*
- * If there is at least one defined target after performing some simple virtual dispatch
- * resolution, then the result is all the defined targets.
- */
-
- result = VirtualDispatch::getAViableTarget(c) and
- result.isDefined()
- else
- if exists(getAPossibleDefinition(VirtualDispatch::getAViableTarget(c)))
- then
- /*
- * If we can use the heuristic matching of functions to find definitions for some of the viable
- * targets, return those.
- */
-
- result = getAPossibleDefinition(VirtualDispatch::getAViableTarget(c))
- else
- // Otherwise, the result is the undefined `Function` instances
- result = VirtualDispatch::getAViableTarget(c)
+ result = getTarget1(c) or
+ result = getTarget2(c) or
+ result = getTarget3(c)
}
/**
diff --git a/cpp/ql/src/semmle/code/cpp/Class.qll b/cpp/ql/src/semmle/code/cpp/Class.qll
index 5ac4f52392e..297654a1afa 100644
--- a/cpp/ql/src/semmle/code/cpp/Class.qll
+++ b/cpp/ql/src/semmle/code/cpp/Class.qll
@@ -605,15 +605,6 @@ class Class extends UserType {
class_instantiation(underlyingElement(this), unresolveElement(c))
}
- /**
- * Gets the `i`th template argument used to instantiate this class from a
- * class template. When called on a class template, this will return the
- * `i`th template parameter.
- */
- override Type getTemplateArgument(int i) {
- class_template_argument(underlyingElement(this), i, unresolveElement(result))
- }
-
/**
* Holds if this class/struct is polymorphic (has a virtual function, or
* inherits one).
@@ -623,7 +614,7 @@ class Class extends UserType {
}
override predicate involvesTemplateParameter() {
- getATemplateArgument().involvesTemplateParameter()
+ getATemplateArgument().(Type).involvesTemplateParameter()
}
/** Holds if this class, struct or union was declared 'final'. */
diff --git a/cpp/ql/src/semmle/code/cpp/Declaration.qll b/cpp/ql/src/semmle/code/cpp/Declaration.qll
index 5d13bf4883a..04135880129 100644
--- a/cpp/ql/src/semmle/code/cpp/Declaration.qll
+++ b/cpp/ql/src/semmle/code/cpp/Declaration.qll
@@ -193,20 +193,83 @@ abstract class Declaration extends Locatable, @declaration {
/**
* Gets a template argument used to instantiate this declaration from a template.
- * When called on a template, this will return a template parameter.
+ * When called on a template, this will return a template parameter type for
+ * both typed and non-typed parameters.
*/
- final Type getATemplateArgument() { result = getTemplateArgument(_) }
+ final Locatable getATemplateArgument() { result = getTemplateArgument(_) }
+
+ /**
+ * Gets a template argument used to instantiate this declaration from a template.
+ * When called on a template, this will return a non-typed template
+ * parameter value.
+ */
+ final Locatable getATemplateArgumentKind() { result = getTemplateArgumentKind(_) }
/**
* Gets the `i`th template argument used to instantiate this declaration from a
- * template. When called on a template, this will return the `i`th template parameter.
+ * template.
+ *
+ * For example:
+ *
+ * `template class Foo;`
+ *
+ * Will have `getTemplateArgument(0)` return `T`, and
+ * `getTemplateArgument(1)` return `X`.
+ *
+ * `Foo bar;
+ *
+ * Will have `getTemplateArgument())` return `int`, and
+ * `getTemplateArgument(1)` return `1`.
*/
- Type getTemplateArgument(int index) { none() }
+ final Locatable getTemplateArgument(int index) {
+ if exists(getTemplateArgumentValue(index))
+ then result = getTemplateArgumentValue(index)
+ else result = getTemplateArgumentType(index)
+ }
+
+ /**
+ * Gets the `i`th template argument value used to instantiate this declaration
+ * from a template. When called on a template, this will return the `i`th template
+ * parameter value if it exists.
+ *
+ * For example:
+ *
+ * `template class Foo;`
+ *
+ * Will have `getTemplateArgumentKind(1)` return `T`, and no result for
+ * `getTemplateArgumentKind(0)`.
+ *
+ * `Foo bar;
+ *
+ * Will have `getTemplateArgumentKind(1)` return `int`, and no result for
+ * `getTemplateArgumentKind(0)`.
+ */
+ final Locatable getTemplateArgumentKind(int index) {
+ if exists(getTemplateArgumentValue(index))
+ then result = getTemplateArgumentType(index)
+ else none()
+ }
/** Gets the number of template arguments for this declaration. */
final int getNumberOfTemplateArguments() {
result = count(int i | exists(getTemplateArgument(i)))
}
+
+ private Type getTemplateArgumentType(int index) {
+ class_template_argument(underlyingElement(this), index, unresolveElement(result))
+ or
+ function_template_argument(underlyingElement(this), index, unresolveElement(result))
+ or
+ variable_template_argument(underlyingElement(this), index, unresolveElement(result))
+ }
+
+ private Expr getTemplateArgumentValue(int index) {
+ class_template_argument_value(underlyingElement(this), index, unresolveElement(result))
+ or
+ function_template_argument_value(underlyingElement(this), index, unresolveElement(result))
+ or
+ variable_template_argument_value(underlyingElement(this), index, unresolveElement(result))
+ }
}
/**
diff --git a/cpp/ql/src/semmle/code/cpp/Function.qll b/cpp/ql/src/semmle/code/cpp/Function.qll
index 94d11d63575..14edf014b21 100644
--- a/cpp/ql/src/semmle/code/cpp/Function.qll
+++ b/cpp/ql/src/semmle/code/cpp/Function.qll
@@ -343,15 +343,6 @@ class Function extends Declaration, ControlFlowNode, AccessHolder, @function {
function_instantiation(underlyingElement(this), unresolveElement(f))
}
- /**
- * Gets the `i`th template argument used to instantiate this function from a
- * function template. When called on a function template, this will return the
- * `i`th template parameter.
- */
- override Type getTemplateArgument(int index) {
- function_template_argument(underlyingElement(this), index, unresolveElement(result))
- }
-
/**
* Holds if this function is defined in several files. This is illegal in
* C (though possible in some C++ compilers), and likely indicates that
diff --git a/cpp/ql/src/semmle/code/cpp/Print.qll b/cpp/ql/src/semmle/code/cpp/Print.qll
index ab979d89b03..e3ad19f6028 100644
--- a/cpp/ql/src/semmle/code/cpp/Print.qll
+++ b/cpp/ql/src/semmle/code/cpp/Print.qll
@@ -35,6 +35,14 @@ private string getParameterTypeString(Type parameterType) {
else result = parameterType.(DumpType).getTypeIdentityString()
}
+private string getTemplateArgumentString(Declaration d, int i) {
+ if exists(d.getTemplateArgumentKind(i))
+ then
+ result = d.getTemplateArgumentKind(i).(DumpType).getTypeIdentityString() + " " +
+ d.getTemplateArgument(i)
+ else result = d.getTemplateArgument(i).(DumpType).getTypeIdentityString()
+}
+
/**
* A `Declaration` extended to add methods for generating strings useful only for dumps and debugging.
*/
@@ -56,7 +64,7 @@ abstract private class DumpDeclaration extends Declaration {
strictconcat(int i |
exists(this.getTemplateArgument(i))
|
- this.getTemplateArgument(i).(DumpType).getTypeIdentityString(), ", " order by i
+ getTemplateArgumentString(this, i), ", " order by i
) + ">"
else result = ""
}
diff --git a/cpp/ql/src/semmle/code/cpp/PrintAST.ql b/cpp/ql/src/semmle/code/cpp/PrintAST.ql
index 6fc40dd0525..e4c53030da5 100644
--- a/cpp/ql/src/semmle/code/cpp/PrintAST.ql
+++ b/cpp/ql/src/semmle/code/cpp/PrintAST.ql
@@ -7,3 +7,15 @@
import cpp
import PrintAST
+
+/**
+ * Temporarily tweak this class or make a copy to control which functions are
+ * printed.
+ */
+class Cfg extends PrintASTConfiguration {
+ /**
+ * TWEAK THIS PREDICATE AS NEEDED.
+ * Holds if the AST for `func` should be printed.
+ */
+ override predicate shouldPrintFunction(Function func) { any() }
+}
diff --git a/cpp/ql/src/semmle/code/cpp/Type.qll b/cpp/ql/src/semmle/code/cpp/Type.qll
index 10a1b6b1724..ea1e7fd5026 100644
--- a/cpp/ql/src/semmle/code/cpp/Type.qll
+++ b/cpp/ql/src/semmle/code/cpp/Type.qll
@@ -210,7 +210,7 @@ class Type extends Locatable, @type {
// A function call that provides an explicit template argument that refers to T uses T.
// We exclude calls within instantiations, since they do not appear directly in the source.
exists(FunctionCall c |
- c.getAnExplicitTemplateArgument().refersTo(this) and
+ c.getAnExplicitTemplateArgument().(Type).refersTo(this) and
result = c and
not c.getEnclosingFunction().isConstructedFrom(_)
)
diff --git a/cpp/ql/src/semmle/code/cpp/Variable.qll b/cpp/ql/src/semmle/code/cpp/Variable.qll
index 6fd33d9a037..194cc5333c7 100644
--- a/cpp/ql/src/semmle/code/cpp/Variable.qll
+++ b/cpp/ql/src/semmle/code/cpp/Variable.qll
@@ -155,15 +155,6 @@ class Variable extends Declaration, @variable {
variable_instantiation(underlyingElement(this), unresolveElement(v))
}
- /**
- * Gets the `i`th template argument used to instantiate this variable from a
- * variable template. When called on a variable template, this will return the
- * `i`th template parameter.
- */
- override Type getTemplateArgument(int index) {
- variable_template_argument(underlyingElement(this), index, unresolveElement(result))
- }
-
/**
* Holds if this is a compiler-generated variable. For example, a
* [range-based for loop](http://en.cppreference.com/w/cpp/language/range-for)
diff --git a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll
index 0caa2ab05df..fc0b5a90882 100644
--- a/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll
+++ b/cpp/ql/src/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll
@@ -5,6 +5,8 @@
private import cpp
private import semmle.code.cpp.dataflow.internal.FlowVar
private import semmle.code.cpp.models.interfaces.DataFlow
+private import semmle.code.cpp.controlflow.Guards
+private import semmle.code.cpp.valuenumbering.GlobalValueNumbering
cached
private newtype TNode =
@@ -680,12 +682,16 @@ VariableAccess getAnAccessToAssignedVariable(Expr assign) {
*
* It is important that all extending classes in scope are disjoint.
*/
-class BarrierGuard extends Expr {
- /** NOT YET SUPPORTED. Holds if this guard validates `e` upon evaluating to `branch`. */
- abstract deprecated predicate checks(Expr e, boolean branch);
+class BarrierGuard extends GuardCondition {
+ /** Override this predicate to hold if this guard validates `e` upon evaluating to `b`. */
+ abstract predicate checks(Expr e, boolean b);
/** Gets a node guarded by this guard. */
- final Node getAGuardedNode() {
- none() // stub
+ final ExprNode getAGuardedNode() {
+ exists(GVN value, boolean branch |
+ result.getExpr() = value.getAnExpr() and
+ this.checks(value.getAnExpr(), branch) and
+ this.controls(result.getExpr().getBasicBlock(), branch)
+ )
}
}
diff --git a/cpp/ql/src/semmle/code/cpp/dispatch/VirtualDispatch.qll b/cpp/ql/src/semmle/code/cpp/dispatch/VirtualDispatch.qll
index 2fa9322843e..1113fc430e7 100644
--- a/cpp/ql/src/semmle/code/cpp/dispatch/VirtualDispatch.qll
+++ b/cpp/ql/src/semmle/code/cpp/dispatch/VirtualDispatch.qll
@@ -28,6 +28,19 @@ module VirtualDispatch {
not result.hasName("IUnknown")
}
+ /**
+ * Helper predicate for `getAViableTarget`, which computes the viable targets for
+ * virtual calls based on the qualifier type.
+ */
+ private Function getAViableVirtualCallTarget(Class qualifierType, MemberFunction staticTarget) {
+ exists(Class qualifierSubType |
+ result = getAPossibleImplementation(staticTarget) and
+ qualifierType = qualifierSubType.getABaseClass*() and
+ mayInherit(qualifierSubType, result) and
+ not cannotInherit(qualifierSubType, result)
+ )
+ }
+
/**
* Gets a viable target for the given function call.
*
@@ -42,18 +55,9 @@ module VirtualDispatch {
* If `c` is not a virtual call, the result will be `c.getTarget()`.
*/
Function getAViableTarget(Call c) {
- exists(Function staticTarget | staticTarget = c.getTarget() |
- if c.(FunctionCall).isVirtual() and staticTarget instanceof MemberFunction
- then
- exists(Class qualifierType, Class qualifierSubType |
- result = getAPossibleImplementation(staticTarget) and
- qualifierType = getCallQualifierType(c) and
- qualifierType = qualifierSubType.getABaseClass*() and
- mayInherit(qualifierSubType, result) and
- not cannotInherit(qualifierSubType, result)
- )
- else result = staticTarget
- )
+ if c.(FunctionCall).isVirtual() and c.getTarget() instanceof MemberFunction
+ then result = getAViableVirtualCallTarget(getCallQualifierType(c), c.getTarget())
+ else result = c.getTarget()
}
/** Holds if `f` is declared in `c` or a transitive base class of `c`. */
diff --git a/cpp/ql/src/semmle/code/cpp/exprs/Call.qll b/cpp/ql/src/semmle/code/cpp/exprs/Call.qll
index 882918316f6..22a25969a8f 100644
--- a/cpp/ql/src/semmle/code/cpp/exprs/Call.qll
+++ b/cpp/ql/src/semmle/code/cpp/exprs/Call.qll
@@ -139,17 +139,29 @@ class FunctionCall extends Call, @funbindexpr {
override string getCanonicalQLClass() { result = "FunctionCall" }
/** Gets an explicit template argument for this call. */
- Type getAnExplicitTemplateArgument() { result = getExplicitTemplateArgument(_) }
+ Locatable getAnExplicitTemplateArgument() { result = getExplicitTemplateArgument(_) }
+
+ /** Gets an explicit template argument value for this call. */
+ Locatable getAnExplicitTemplateArgumentKind() { result = getExplicitTemplateArgumentKind(_) }
/** Gets a template argument for this call. */
- Type getATemplateArgument() { result = getTarget().getATemplateArgument() }
+ Locatable getATemplateArgument() { result = getTarget().getATemplateArgument() }
+
+ /** Gets a template argument value for this call. */
+ Locatable getATemplateArgumentKind() { result = getTarget().getATemplateArgumentKind() }
/** Gets the nth explicit template argument for this call. */
- Type getExplicitTemplateArgument(int n) {
+ Locatable getExplicitTemplateArgument(int n) {
n < getNumberOfExplicitTemplateArguments() and
result = getTemplateArgument(n)
}
+ /** Gets the nth explicit template argument value for this call. */
+ Locatable getExplicitTemplateArgumentKind(int n) {
+ n < getNumberOfExplicitTemplateArguments() and
+ result = getTemplateArgumentKind(n)
+ }
+
/** Gets the number of explicit template arguments for this call. */
int getNumberOfExplicitTemplateArguments() {
if numtemplatearguments(underlyingElement(this), _)
@@ -161,7 +173,10 @@ class FunctionCall extends Call, @funbindexpr {
int getNumberOfTemplateArguments() { result = count(int i | exists(getTemplateArgument(i))) }
/** Gets the nth template argument for this call (indexed from 0). */
- Type getTemplateArgument(int n) { result = getTarget().getTemplateArgument(n) }
+ Locatable getTemplateArgument(int n) { result = getTarget().getTemplateArgument(n) }
+
+ /** Gets the nth template argument value for this call (indexed from 0). */
+ Locatable getTemplateArgumentKind(int n) { result = getTarget().getTemplateArgumentKind(n) }
/** Holds if any template arguments for this call are implicit / deduced. */
predicate hasImplicitTemplateArguments() {
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 08556a4af39..0753dfd266e 100644
--- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll
+++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/DefaultTaintTracking.qll
@@ -37,7 +37,7 @@ private class DefaultTaintTrackingCfg extends DataFlow::Configuration {
}
private predicate accessesVariable(CopyInstruction copy, Variable var) {
- exists(VariableAddressInstruction va | va.getVariable().getAST() = var |
+ exists(VariableAddressInstruction va | va.getASTVariable() = var |
copy.(StoreInstruction).getDestinationAddress() = va
or
copy.(LoadInstruction).getSourceAddress() = va
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
index 0476ea3c30a..cd989c94710 100644
--- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
+++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
@@ -5,6 +5,7 @@
private import cpp
private import semmle.code.cpp.ir.IR
private import semmle.code.cpp.controlflow.IRGuards
+private import semmle.code.cpp.ir.ValueNumbering
/**
* A newtype wrapper to prevent accidental casts between `Node` and
@@ -213,6 +214,14 @@ private predicate simpleInstructionLocalFlowStep(Instruction iFrom, Instruction
*/
predicate localFlow(Node source, Node sink) { localFlowStep*(source, sink) }
+/**
+ * Holds if data can flow from `i1` to `i2` in zero or more
+ * local (intra-procedural) steps.
+ */
+predicate localInstructionFlow(Instruction e1, Instruction e2) {
+ localFlow(instructionNode(e1), instructionNode(e2))
+}
+
/**
* Holds if data can flow from `e1` to `e2` in zero or more
* local (intra-procedural) steps.
@@ -220,7 +229,7 @@ predicate localFlow(Node source, Node sink) { localFlowStep*(source, sink) }
predicate localExprFlow(Expr e1, Expr e2) { localFlow(exprNode(e1), exprNode(e2)) }
/**
- * A guard that validates some expression.
+ * A guard that validates some instruction.
*
* To use this in a configuration, extend the class and provide a
* characteristic predicate precisely specifying the guard, and override
@@ -229,11 +238,15 @@ predicate localExprFlow(Expr e1, Expr e2) { localFlow(exprNode(e1), exprNode(e2)
* It is important that all extending classes in scope are disjoint.
*/
class BarrierGuard extends IRGuardCondition {
- /** NOT YET SUPPORTED. Holds if this guard validates `e` upon evaluating to `b`. */
- abstract deprecated predicate checks(Instruction e, boolean b);
+ /** Override this predicate to hold if this guard validates `instr` upon evaluating to `b`. */
+ abstract predicate checks(Instruction instr, boolean b);
/** Gets a node guarded by this guard. */
final Node getAGuardedNode() {
- none() // stub
+ exists(ValueNumber value, boolean edge |
+ result.asInstruction() = value.getAnInstruction() and
+ this.checks(value.getAnInstruction(), edge) and
+ this.controls(result.asInstruction().getBlock(), edge)
+ )
}
}
diff --git a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll
index e34709e94ec..8d7c9194f4f 100644
--- a/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll
+++ b/cpp/ql/src/semmle/code/cpp/ir/dataflow/internal/TaintTrackingUtil.qll
@@ -53,6 +53,14 @@ private predicate localInstructionTaintStep(Instruction nodeFrom, Instruction no
*/
predicate localTaint(DataFlow::Node source, DataFlow::Node sink) { localTaintStep*(source, sink) }
+/**
+ * Holds if taint can flow from `i1` to `i2` in zero or more
+ * local (intra-procedural) steps.
+ */
+predicate localInstructionTaint(Instruction i1, Instruction i2) {
+ localTaint(DataFlow::instructionNode(i1), DataFlow::instructionNode(i2))
+}
+
/**
* Holds if taint can flow from `e1` to `e2` in zero or more
* local (intra-procedural) steps.
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 4dab4ca3354..37df7c7becf 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
@@ -486,20 +486,26 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
}
override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
- exists(Type operandType |
+ if hasSpecificReadSideEffect(any(Opcode::BufferReadSideEffect op))
+ then
+ result = getUnknownType() and
tag instanceof OnlyInstructionTag and
- operandType = arg.getType().getUnspecifiedType().(DerivedType).getBaseType() and
operandTag instanceof SideEffectOperandTag
- or
- tag instanceof OnlyInstructionTag and
- operandType = arg.getType().getUnspecifiedType() and
- not operandType instanceof DerivedType and
- operandTag instanceof SideEffectOperandTag
- |
- // If the type we select is an incomplete type (e.g. a forward-declared `struct`), there will
- // not be a `CppType` that represents that type. In that case, fall back to `UnknownCppType`.
- result = getTypeForPRValueOrUnknown(operandType)
- )
+ else
+ exists(Type operandType |
+ tag instanceof OnlyInstructionTag and
+ operandType = arg.getType().getUnspecifiedType().(DerivedType).getBaseType() and
+ operandTag instanceof SideEffectOperandTag
+ or
+ tag instanceof OnlyInstructionTag and
+ operandType = arg.getType().getUnspecifiedType() and
+ not operandType instanceof DerivedType and
+ operandTag instanceof SideEffectOperandTag
+ |
+ // If the type we select is an incomplete type (e.g. a forward-declared `struct`), there will
+ // not be a `CppType` that represents that type. In that case, fall back to `UnknownCppType`.
+ result = getTypeForPRValueOrUnknown(operandType)
+ )
}
predicate hasSpecificWriteSideEffect(Opcode op) {
@@ -549,7 +555,7 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
)
or
not call.getTarget() instanceof SideEffectFunction and
- op instanceof Opcode::IndirectReadSideEffect
+ op instanceof Opcode::BufferReadSideEffect
}
override Instruction getPrimaryInstructionForSideEffect(InstructionTag tag) {
diff --git a/cpp/ql/src/semmlecode.cpp.dbscheme b/cpp/ql/src/semmlecode.cpp.dbscheme
index 98a075d5495..bd182f697bf 100644
--- a/cpp/ql/src/semmlecode.cpp.dbscheme
+++ b/cpp/ql/src/semmlecode.cpp.dbscheme
@@ -731,6 +731,11 @@ class_template_argument(
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,
@@ -755,6 +760,11 @@ function_template_argument(
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(
@@ -766,6 +776,11 @@ variable_template_argument(
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
diff --git a/cpp/ql/src/semmlecode.cpp.dbscheme.stats b/cpp/ql/src/semmlecode.cpp.dbscheme.stats
index bd1964b0d4f..3a73724456a 100644
--- a/cpp/ql/src/semmlecode.cpp.dbscheme.stats
+++ b/cpp/ql/src/semmlecode.cpp.dbscheme.stats
@@ -1,15 +1,15 @@
@compilation
-10588
+10177
@externalDataElement
-72
+70
@duplication
-185332
+185440
@similarity
@@ -17,7 +17,7 @@
@external_package
-133
+128
@svnentry
@@ -25,67 +25,67 @@
@location_default
-9664446
+9335283
@location_stmt
-2176932
+2178211
@location_expr
-9745314
+9746017
@diagnostic
-76160
+73204
@file
-66167
+63599
@folder
-12107
+11637
@macroinvocation
-40814994
+39320374
@function
-3565918
+3552236
@fun_decl
-3657006
+3635139
@var_decl
-5579181
+5495954
@type_decl
-1469165
+1413769
@namespace_decl
-151627
+145743
@using
-320601
+308161
@static_assert
-132358
+131017
@parameter
-4779409
+4724692
@membervariable
-325099
+321201
@globalvariable
@@ -93,47 +93,47 @@
@localvariable
-527101
+521758
@enumconstant
-94487
+94097
@builtintype
-559
+537
@derivedtype
-4572495
+4651908
@decltype
-45841
+44063
@usertype
-4363319
+4337028
@mangledname
-532986
+514256
@type_mention
-1699359
+1682135
@routinetype
-444572
+436132
@ptrtomember
-12180
+13227
@specifier
-547
+525
@gnuattribute
@@ -141,11 +141,11 @@
@stdattribute
-369
+365
@declspec
-58441
+57849
@msattribute
@@ -153,7 +153,7 @@
@alignas
-267
+257
@attribute_arg_empty
@@ -161,55 +161,55 @@
@attribute_arg_token
-15930
+15768
@attribute_arg_constant
-111500
+111565
@attribute_arg_type
-60
+58
@derivation
-370309
+392220
@frienddecl
-231178
+222208
@comment
-1743633
+1675974
@namespace
-8497
+8167
@specialnamequalifyingelement
-12
+11
@namequalifier
-1125621
+1116919
@value
-8776796
+8788031
@initialiser
-1685017
+1668506
@literal
-4374193
+4381545
@errorexpr
-48066
+46201
@address_of
@@ -217,15 +217,15 @@
@reference_to
-1077837
+1039133
@indirect
-294638
+294811
@ref_indirect
-1267903
+1225212
@array_to_pointer
@@ -233,31 +233,31 @@
@vacuous_destructor_call
-4449
+4288
@assume
-3328
+3294
@parexpr
-3001187
+3002950
@arithnegexpr
-654789
+654792
@unaryplusexpr
-206
+198
@complementexpr
-28027
+28043
@notexpr
-357915
+358125
@conjugation
@@ -265,51 +265,51 @@
@realpartexpr
-72
+70
@imagpartexpr
-72
+70
@postincrexpr
-43039
+43064
@postdecrexpr
-5401
+5404
@preincrexpr
-63954
+61508
@predecrexpr
-26586
+25554
@conditionalexpr
-154429
+154519
@addexpr
-209503
+209626
@subexpr
-134974
+135053
@mulexpr
-91616
+91670
@divexpr
-63973
+64010
@remexpr
-4657
+4660
@jmulexpr
@@ -337,59 +337,59 @@
@paddexpr
-87252
+87303
@psubexpr
-23151
+23165
@pdiffexpr
-25868
+24865
@lshiftexpr
-347564
+347768
@rshiftexpr
-59286
+59321
@andexpr
-236938
+237077
@orexpr
-145217
+143745
@xorexpr
-37281
+37303
@eqexpr
-212621
+212746
@neexpr
-88456
+88508
@gtexpr
-43936
+43962
@ltexpr
-54831
+54863
@geexpr
-22361
+22374
@leexpr
-213875
+214001
@minexpr
@@ -401,7 +401,7 @@
@assignexpr
-551713
+552037
@assignaddexpr
@@ -413,15 +413,15 @@
@assignmulexpr
-7597
+7302
@assigndivexpr
-2297
+2208
@assignremexpr
-303
+292
@assignlshiftexpr
@@ -433,39 +433,39 @@
@assignandexpr
-7740
+7744
@assignorexpr
-18663
+18674
@assignxorexpr
-21992
+22005
@assignpaddexpr
-13214
+13080
@assignpsubexpr
-583
+577
@andlogicalexpr
-116840
+116908
@orlogicalexpr
-57827
+57861
@commaexpr
-10721
+10329
@subscriptexpr
-165754
+165851
@virtfunptrexpr
@@ -473,15 +473,15 @@
@callexpr
-248513
+239197
@vastartexpr
-3710
+3673
@vaargexpr
-1094
+1051
@vaendexpr
@@ -493,63 +493,63 @@
@varaccess
-5376400
+5325591
@thisaccess
-1181340
+1169367
@new_expr
-29515
+28370
@delete_expr
-6564
+6309
@throw_expr
-23777
+22855
@condition_decl
-7646
+7349
@braced_init_list
-133
+128
@type_id
-4899
+4708
@runtime_sizeof
-281622
+281787
@runtime_alignof
-1560
+1561
@sizeof_pack
-267
+502
@expr_stmt
-160546
+160640
@routineexpr
-2309113
+2232038
@type_operand
-127928
+128003
@offsetofexpr
-35356
+35377
@hasassignexpr
@@ -597,11 +597,11 @@
@isbaseofexpr
-19
+39
@isclassexpr
-6
+215
@isconvtoexpr
@@ -609,15 +609,15 @@
@isemptyexpr
-5
+175
@isenumexpr
-3
+23
@ispodexpr
-3
+11
@ispolyexpr
@@ -629,7 +629,7 @@
@typescompexpr
-46285
+46312
@intaddrexpr
@@ -637,11 +637,11 @@
@hastrivialdestructor
-97
+105
@uuidof
-856
+848
@aggregateliteral
@@ -649,11 +649,11 @@
@delete_array_expr
-1495
+1437
@new_array_expr
-5364
+5310
@foldexpr
@@ -661,59 +661,59 @@
@ctordirectinit
-93264
+89645
@ctorvirtualinit
-6904
+6636
@ctorfieldinit
-209661
+201538
@ctordelegatinginit
-741
+712
@dtordirectdestruct
-30828
+30111
@dtorvirtualdestruct
-2698
+2594
@dtorfielddestruct
-32542
+31279
@static_cast
-224735
+226064
@reinterpret_cast
-31207
+30891
@const_cast
-5847
+5643
@dynamic_cast
-1094
+1051
@c_style_cast
-4242732
+4244118
@lambdaexpr
-12641
+12513
@param_ref
-53208
+51144
@noopexpr
@@ -745,7 +745,7 @@
@istrivialexpr
-2565
+2512
@isstandardlayoutexpr
@@ -753,7 +753,7 @@
@istriviallycopyableexpr
-48
+46
@isliteraltypeexpr
@@ -813,11 +813,11 @@
@isfinalexpr
-2
+175
@noexceptexpr
-449
+432
@builtinshufflevector
@@ -825,11 +825,11 @@
@builtinchooseexpr
-7028
+7032
@builtinaddressof
-4388
+4218
@vec_fill
@@ -845,67 +845,67 @@
@lambdacapture
-21730
+21509
@stmt_expr
-1284462
+1271443
@stmt_if
-524558
+524866
@stmt_while
-32907
+31630
@stmt_goto
-111432
+111498
@stmt_label
-85508
+85558
@stmt_return
-1197201
+1154730
@stmt_block
-1398281
+1348007
@stmt_end_test_while
-149900
+149988
@stmt_for
-32387
+32059
@stmt_switch_case
-281530
+281695
@stmt_switch
-55225
+55258
@stmt_asm
-251715
+251863
@stmt_try_block
-18964
+18228
@stmt_microsoft_try
-171
+169
@stmt_decl
-647378
+623601
@stmt_set_vla_size
@@ -917,27 +917,27 @@
@stmt_assigned_goto
-9137
+9142
@stmt_empty
-103681
+102630
@stmt_continue
-8603
+8608
@stmt_break
-232406
+232543
@stmt_range_based_for
-24
+23
@stmt_handler
-21888
+21666
@stmt_constexpr_if
@@ -945,51 +945,51 @@
@ppd_plain_include
-321707
+309224
@ppd_define
-349947
+336367
@ppd_if
-171077
+164439
@ppd_ifdef
-66823
+64230
@ppd_ifndef
-91793
+88231
@ppd_elif
-22768
+21885
@ppd_else
-63638
+61169
@ppd_endif
-329694
+316901
@ppd_undef
-21152
+20331
@ppd_line
-12523
+12530
@ppd_error
-48
+46
@ppd_pragma
-37040
+36665
@ppd_objc_import
@@ -997,7 +997,7 @@
@ppd_include_next
-97
+93
@ppd_warning
@@ -1005,7 +1005,7 @@
@link_target
-644
+619
@xmldtd
@@ -1034,15 +1034,15 @@
compilations
-10588
+10177
id
-10588
+10177
cwd
-12
+11
@@ -1056,7 +1056,7 @@
1
2
-10588
+10177
@@ -1072,7 +1072,7 @@
871
872
-12
+11
@@ -1082,11 +1082,11 @@
compilation_args
-394124
+394355
id
-4637
+4640
num
@@ -1094,7 +1094,7 @@
arg
-20097
+20109
@@ -1113,7 +1113,7 @@
87
88
-3527
+3529
88
@@ -1149,7 +1149,7 @@
86
87
-3529
+3531
87
@@ -1322,12 +1322,12 @@
1
2
-19123
+19134
2
2575
-974
+975
@@ -1343,7 +1343,7 @@
1
2
-19748
+19760
2
@@ -1358,19 +1358,19 @@
compilation_compiling_files
-10588
+10177
id
-10588
+10177
num
-12
+11
file
-5373
+5164
@@ -1384,7 +1384,7 @@
1
2
-10588
+10177
@@ -1400,7 +1400,7 @@
1
2
-10588
+10177
@@ -1416,7 +1416,7 @@
871
872
-12
+11
@@ -1432,7 +1432,7 @@
442
443
-12
+11
@@ -1448,17 +1448,17 @@
1
2
-303
+292
2
3
-5044
+4849
3
14
-24
+23
@@ -1474,7 +1474,7 @@
1
2
-5373
+5164
@@ -1484,23 +1484,23 @@
compilation_time
-42255
+40616
id
-10563
+10154
num
-12
+11
kind
-48
+46
seconds
-12375
+11965
@@ -1514,7 +1514,7 @@
1
2
-10563
+10154
@@ -1530,7 +1530,7 @@
4
5
-10563
+10154
@@ -1544,14 +1544,19 @@
12
+2
+3
+58
+
+
3
4
-3160
+2792
4
5
-7403
+7302
@@ -1567,7 +1572,7 @@
869
870
-12
+11
@@ -1583,7 +1588,7 @@
4
5
-12
+11
@@ -1597,9 +1602,9 @@
12
-1018
-1019
-12
+1024
+1025
+11
@@ -1615,7 +1620,7 @@
869
870
-48
+46
@@ -1631,7 +1636,7 @@
1
2
-48
+46
@@ -1645,24 +1650,24 @@
12
-6
-7
-12
+7
+8
+11
-9
-10
-12
+10
+11
+11
-561
-562
-12
+560
+561
+11
-597
-598
-12
+591
+592
+11
@@ -1678,27 +1683,27 @@
1
2
-7755
+7501
2
3
-2613
+2617
3
4
-1045
+759
4
-324
-936
+8
+899
-417
-614
-24
+8
+632
+186
@@ -1714,7 +1719,7 @@
1
2
-12375
+11965
@@ -1730,12 +1735,17 @@
1
2
-10490
+10305
2
3
-1884
+1635
+
+
+3
+4
+23
@@ -1745,23 +1755,23 @@
diagnostic_for
-940397
+903906
diagnostic
-940397
+73204
compilation
-10223
+9826
file_number
-12
+11
file_number_diagnostic_number
-7208
+6929
@@ -1775,7 +1785,17 @@
1
2
-940397
+9861
+
+
+2
+3
+60456
+
+
+118
+840
+2886
@@ -1791,7 +1811,7 @@
1
2
-940397
+73204
@@ -1807,7 +1827,12 @@
1
2
-940397
+73181
+
+
+2
+3
+23
@@ -1823,37 +1848,37 @@
2
3
-24
+23
7
8
-5227
+5024
8
9
-1665
+1600
9
10
-218
+210
247
248
-2066
+1986
263
444
-802
+771
446
594
-218
+210
@@ -1869,7 +1894,7 @@
1
2
-10223
+9826
@@ -1885,37 +1910,37 @@
2
3
-24
+23
7
8
-5227
+5024
8
9
-1665
+1600
9
10
-218
+210
247
248
-2066
+1986
263
444
-802
+771
446
594
-218
+210
@@ -1931,7 +1956,7 @@
6265
6266
-12
+11
@@ -1947,7 +1972,7 @@
841
842
-12
+11
@@ -1963,7 +1988,7 @@
593
594
-12
+11
@@ -1979,47 +2004,47 @@
1
2
-2954
+2839
2
5
-656
+630
5
6
-1057
+1016
7
14
-571
+549
15
16
-60
+58
17
18
-632
+607
18
23
-486
+467
26
40
-583
+560
42
842
-206
+198
@@ -2035,52 +2060,52 @@
4
9
-619
+595
10
11
-1057
+1016
14
27
-571
+549
30
31
-60
+58
34
35
-632
+607
36
45
-486
+467
52
79
-583
+560
84
85
-194
+186
254
255
-2893
+2780
272
842
-109
+105
@@ -2096,7 +2121,7 @@
1
2
-7208
+6929
@@ -2106,19 +2131,19 @@
compilation_finished
-10588
+10177
id
-10588
+10177
cpu_seconds
-8436
+7957
elapsed_seconds
-182
+186
@@ -2132,7 +2157,7 @@
1
2
-10588
+10177
@@ -2148,7 +2173,7 @@
1
2
-10588
+10177
@@ -2164,17 +2189,17 @@
1
2
-7184
+6730
2
3
-850
+712
3
-12
-401
+9
+514
@@ -2190,12 +2215,12 @@
1
2
-8023
+7560
2
3
-413
+397
@@ -2211,67 +2236,62 @@
1
2
-36
+35
2
3
-12
+35
3
4
-12
+11
-4
-5
-12
-
-
-8
-9
-12
+7
+8
+11
10
11
-12
+11
-20
-21
-12
+21
+22
+11
-22
-23
-12
+27
+28
+11
53
54
-12
+11
-124
-125
-12
+120
+121
+11
-134
-135
-12
+125
+126
+11
-230
-231
-12
+233
+234
+11
-258
-259
-12
+263
+264
+11
@@ -2287,67 +2307,62 @@
1
2
-36
+35
2
3
-12
+35
3
4
-12
+11
-4
-5
-12
-
-
-8
-9
-12
+7
+8
+11
10
11
-12
+11
-20
-21
-12
+21
+22
+11
-22
-23
-12
+26
+27
+11
-49
-50
-12
+51
+52
+11
-100
-101
-12
+92
+93
+11
118
119
-12
+11
-172
-173
-12
+163
+164
+11
-217
-218
-12
+215
+216
+11
@@ -2357,23 +2372,23 @@
externalData
-145
+140
id
-72
+70
path
-12
+11
column
-24
+23
value
-145
+140
@@ -2387,7 +2402,7 @@
1
2
-72
+70
@@ -2403,7 +2418,7 @@
2
3
-72
+70
@@ -2419,7 +2434,7 @@
2
3
-72
+70
@@ -2435,7 +2450,7 @@
6
7
-12
+11
@@ -2451,7 +2466,7 @@
2
3
-12
+11
@@ -2467,7 +2482,7 @@
12
13
-12
+11
@@ -2483,7 +2498,7 @@
6
7
-24
+23
@@ -2499,7 +2514,7 @@
1
2
-24
+23
@@ -2515,7 +2530,7 @@
6
7
-24
+23
@@ -2531,7 +2546,7 @@
1
2
-145
+140
@@ -2547,7 +2562,7 @@
1
2
-145
+140
@@ -2563,7 +2578,7 @@
1
2
-145
+140
@@ -2573,41 +2588,41 @@
snapshotDate
-12
+11
snapshotDate
-12
+11
sourceLocationPrefix
-12
+11
prefix
-12
+11
duplicateCode
-185332
+185440
id
-185332
+185440
relativePath
-761
+762
equivClass
-76596
+76641
@@ -2621,7 +2636,7 @@
1
2
-185332
+185440
@@ -2637,7 +2652,7 @@
1
2
-185332
+185440
@@ -2765,27 +2780,27 @@
1
2
-20462
+20474
2
3
-32635
+32655
3
4
-10716
+10723
4
5
-6015
+6019
5
9
-5954
+5957
9
@@ -2806,7 +2821,7 @@
1
2
-75730
+75775
2
@@ -3122,27 +3137,27 @@
tokens
-39620249
+39643528
id
-279171
+279335
offset
-21169
+21181
beginLine
-785436
+785898
beginColumn
-1302
+1303
endLine
-785436
+785898
endColumn
@@ -3160,72 +3175,72 @@
100
101
-8596
+8601
101
102
-27640
+27656
102
105
-22613
+22626
105
108
-24506
+24520
108
111
-13844
+13852
111
114
-23787
+23801
114
116
-22681
+22694
116
124
-23658
+23672
124
132
-21660
+21673
132
154
-21347
+21360
154
186
-21323
+21335
186
202
-23418
+23432
202
416
-20978
+20991
416
3446
-3115
+3117
@@ -3246,47 +3261,47 @@
5
6
-109755
+109819
6
7
-15399
+15408
7
8
-28395
+28412
8
12
-23645
+23659
12
17
-22797
+22811
17
19
-18969
+18980
19
22
-22791
+22805
22
28
-21470
+21483
28
151
-14545
+14553
@@ -3302,42 +3317,42 @@
2
26
-22933
+22946
26
31
-22318
+22331
31
32
-2642
+2643
32
33
-163572
+163668
33
51
-21310
+21323
51
61
-22472
+22485
61
80
-21058
+21071
80
132
-2863
+2865
@@ -3358,47 +3373,47 @@
5
6
-109755
+109819
6
7
-15399
+15408
7
8
-28395
+28412
8
12
-23645
+23659
12
17
-22797
+22811
17
19
-18969
+18980
19
22
-22791
+22805
22
28
-21470
+21483
28
151
-14545
+14553
@@ -3414,42 +3429,42 @@
2
26
-21667
+21679
26
31
-24352
+24366
31
32
-1622
+1623
32
33
-163861
+163957
33
54
-22103
+22116
54
63
-20942
+20954
63
82
-21488
+21501
82
133
-3133
+3135
@@ -3465,17 +3480,17 @@
2
3
-4559
+4562
4
5
-1339
+1340
6
7
-2593
+2594
8
@@ -3485,37 +3500,37 @@
11
12
-1609
+1610
13
23
-1855
+1856
24
62
-1622
+1623
64
130
-1646
+1647
141
250
-1597
+1598
251
982
-1591
+1592
986
45432
-1929
+1930
@@ -3531,17 +3546,17 @@
2
3
-4559
+4562
4
5
-1339
+1340
6
7
-2593
+2594
8
@@ -3551,42 +3566,42 @@
11
12
-1609
+1610
13
23
-1855
+1856
24
62
-1622
+1623
64
130
-1646
+1647
141
246
-1597
+1598
247
964
-1591
+1592
969
32541
-1591
+1592
32546
33841
-337
+338
@@ -3602,47 +3617,47 @@
1
2
-5899
+5902
2
3
-3416
+3418
3
4
-1609
+1610
4
7
-1886
+1887
7
12
-1837
+1838
12
15
-1640
+1641
15
23
-1591
+1592
23
68
-1609
+1610
68
161
-1591
+1592
161
@@ -3663,17 +3678,17 @@
2
3
-4559
+4562
4
5
-1339
+1340
6
7
-2593
+2594
8
@@ -3683,42 +3698,42 @@
11
12
-1609
+1610
13
23
-1855
+1856
24
62
-1622
+1623
64
130
-1646
+1647
141
246
-1597
+1598
247
964
-1591
+1592
969
32541
-1591
+1592
32546
33841
-337
+338
@@ -3734,47 +3749,47 @@
1
2
-5899
+5902
2
3
-3416
+3418
3
4
-1609
+1610
4
7
-1911
+1912
7
12
-1825
+1826
12
15
-1609
+1610
15
24
-1677
+1678
24
74
-1616
+1617
74
169
-1591
+1592
170
@@ -3795,37 +3810,37 @@
1
2
-403939
+404176
2
3
-103118
+103179
3
4
-44274
+44300
4
6
-70568
+70610
6
8
-58457
+58491
8
13
-65861
+65900
13
138
-39217
+39240
@@ -3841,52 +3856,52 @@
1
7
-64810
+64849
7
12
-64350
+64387
12
23
-60079
+60114
23
32
-36740
+36762
32
33
-267244
+267401
33
41
-62672
+62709
41
55
-61271
+61307
55
69
-61541
+61577
69
94
-59243
+59278
94
248
-47482
+47510
@@ -3902,47 +3917,47 @@
1
5
-64429
+64467
5
9
-62611
+62647
9
15
-63016
+63053
15
29
-59870
+59905
29
32
-9205
+9210
32
33
-349310
+349515
33
37
-61959
+61996
37
42
-61400
+61436
42
122
-53633
+53664
@@ -3958,7 +3973,7 @@
1
2
-785436
+785898
@@ -3974,47 +3989,47 @@
1
5
-64294
+64332
5
9
-62611
+62647
9
15
-63133
+63170
15
29
-59735
+59770
29
32
-9254
+9259
32
33
-350355
+350560
33
37
-63588
+63625
37
43
-65241
+65279
43
123
-47224
+47251
@@ -4430,37 +4445,37 @@
1
2
-403939
+404176
2
3
-103118
+103179
3
4
-44274
+44300
4
6
-70568
+70610
6
8
-58457
+58491
8
13
-65861
+65900
13
138
-39217
+39240
@@ -4476,52 +4491,52 @@
1
7
-64810
+64849
7
12
-64350
+64387
12
23
-60079
+60114
23
32
-36740
+36762
32
33
-267244
+267401
33
41
-62672
+62709
41
55
-61271
+61307
55
69
-61541
+61577
69
94
-59243
+59278
94
248
-47482
+47510
@@ -4537,7 +4552,7 @@
1
2
-785436
+785898
@@ -4553,47 +4568,47 @@
1
5
-64429
+64467
5
9
-62611
+62647
9
15
-63016
+63053
15
29
-59870
+59905
29
32
-9205
+9210
32
33
-349310
+349515
33
37
-61959
+61996
37
42
-61400
+61436
42
122
-53633
+53664
@@ -4609,47 +4624,47 @@
1
5
-64294
+64332
5
9
-62611
+62647
9
15
-63133
+63170
15
29
-59735
+59770
29
32
-9254
+9259
32
33
-350355
+350560
33
37
-63588
+63625
37
43
-65241
+65279
43
123
-47224
+47251
@@ -5039,23 +5054,23 @@
external_packages
-133
+128
id
-133
+128
namespace
-12
+11
package_name
-133
+128
version
-133
+128
@@ -5069,7 +5084,7 @@
1
2
-133
+128
@@ -5085,7 +5100,7 @@
1
2
-133
+128
@@ -5101,7 +5116,7 @@
1
2
-133
+128
@@ -5117,7 +5132,7 @@
11
12
-12
+11
@@ -5133,7 +5148,7 @@
11
12
-12
+11
@@ -5149,7 +5164,7 @@
11
12
-12
+11
@@ -5165,7 +5180,7 @@
1
2
-133
+128
@@ -5181,7 +5196,7 @@
1
2
-133
+128
@@ -5197,7 +5212,7 @@
1
2
-133
+128
@@ -5213,7 +5228,7 @@
1
2
-133
+128
@@ -5229,7 +5244,7 @@
1
2
-133
+128
@@ -5245,7 +5260,7 @@
1
2
-133
+128
@@ -5255,15 +5270,15 @@
header_to_external_package
-9093
+8740
fileid
-9093
+8740
package
-133
+128
@@ -5277,7 +5292,7 @@
1
2
-9093
+8740
@@ -5293,42 +5308,42 @@
1
2
-36
+35
2
3
-12
+11
15
16
-24
+23
63
64
-12
+11
71
72
-12
+11
85
86
-12
+11
243
244
-12
+11
251
252
-12
+11
@@ -6546,31 +6561,31 @@
locations_default
-9664446
+9335283
id
-9664446
+9335283
container
-78275
+75237
startLine
-161084
+154834
startColumn
-6017
+5818
endLine
-160902
+154658
endColumn
-8169
+11182
@@ -6584,7 +6599,7 @@
1
2
-9664446
+9335283
@@ -6600,7 +6615,7 @@
1
2
-9664446
+9335283
@@ -6616,7 +6631,7 @@
1
2
-9664446
+9335283
@@ -6632,7 +6647,7 @@
1
2
-9664446
+9335283
@@ -6648,7 +6663,7 @@
1
2
-9664446
+9335283
@@ -6664,62 +6679,62 @@
1
2
-12752
+12257
2
19
-6625
+6368
19
25
-6090
+5818
25
31
-6066
+5830
31
41
-6491
+6204
41
54
-6138
+5854
54
72
-6175
+5877
72
-99
-5968
+98
+5690
-99
-137
-5944
+98
+136
+5702
-137
-221
-5895
+136
+216
+5690
-221
-431
-5871
+216
+417
+5655
-431
+417
19703
-4254
+4288
@@ -6735,62 +6750,62 @@
1
2
-12752
+12257
2
15
-6503
+6251
15
20
-6758
+6496
20
25
-6102
+5842
25
32
-6710
+6461
32
41
-6284
+6052
41
53
-6321
+6064
53
70
-5932
+5690
70
96
-5908
+5678
96
152
-5883
+5667
152
-325
-5871
+322
+5643
-325
+324
8863
-3245
+3131
@@ -6806,62 +6821,62 @@
1
2
-12752
+12257
2
4
-6722
+6461
4
8
-7087
+6812
8
11
-5895
+5632
11
14
-6418
+6099
14
18
-6880
+6601
18
23
-6394
+6134
23
29
-6455
+6227
29
37
-6260
+6029
37
50
-6224
+6052
50
78
-5944
+5737
78
-167
-1239
+168
+1191
@@ -6877,62 +6892,62 @@
1
2
-12752
+12257
2
15
-6479
+6227
15
20
-6795
+6531
20
25
-6029
+5772
25
32
-6710
+6473
32
41
-6297
+6052
41
53
-6309
+6052
53
70
-6017
+5772
70
96
-5920
+5690
96
153
-5932
+5725
153
332
-5883
+5643
332
8863
-3148
+3038
@@ -6948,62 +6963,62 @@
1
2
-12752
+12257
2
14
-6236
+5994
14
19
-6710
+6414
19
23
-6224
+5994
23
27
-6005
+5690
27
32
-6187
+5994
32
38
-6005
+5690
38
45
-6138
+5830
45
54
-5920
+5713
54
65
-5993
+5807
65
-79
-5883
+80
+5842
-79
-184
-4218
+80
+336
+4007
@@ -7019,62 +7034,62 @@
1
2
-31193
+29982
2
3
-19802
+19034
3
4
-18234
+17527
4
5
-10260
+9861
5
6
-9129
+8775
6
7
-6734
+6473
7
9
-14344
+13787
9
13
-13943
+13390
13
30
-12350
+11871
30
112
-12119
+11637
112
-2168
-12083
+2116
+11614
-2193
+2135
6440
-887
+876
@@ -7090,42 +7105,42 @@
1
2
-57268
+55046
2
3
-35496
+34119
3
4
-11341
+10901
4
5
-8983
+8635
5
8
-14794
+14220
8
26
-12363
+11871
26
115
-12095
+11637
115
6440
-8740
+8401
@@ -7141,57 +7156,57 @@
1
2
-32287
+31034
2
3
-19693
+18929
3
4
-20544
+19747
4
5
-9737
+9359
5
6
-9384
+9020
6
7
-6856
+6590
7
9
-14612
+14033
9
13
-14028
+13495
13
27
-12436
+11953
27
60
-12132
+11637
60
153
-9372
+9032
@@ -7207,22 +7222,22 @@
1
2
-119911
+115246
2
3
-18976
+18239
3
7
-13530
+13016
7
184
-8667
+8331
@@ -7238,57 +7253,57 @@
1
2
-32311
+31057
2
3
-19584
+18824
3
4
-19024
+18286
4
5
-10247
+9850
5
6
-9409
+9043
6
7
-6637
+6379
7
9
-14636
+14068
9
13
-13700
+13168
13
28
-12144
+11673
28
-68
-12119
+69
+11813
-68
-190
-11269
+69
+258
+10668
@@ -7304,57 +7319,57 @@
1
2
-948
+934
2
3
-1142
+1074
3
5
-534
+537
5
8
-547
+514
8
16
-474
+467
16
-38
-461
+37
+444
-39
-126
-461
+37
+119
+444
-135
-517
-461
+125
+511
+444
-553
-5009
-461
+518
+4987
+444
-5423
-19562
-461
+5021
+19113
+444
-23702
-199709
-60
+19590
+199744
+70
@@ -7370,47 +7385,47 @@
1
2
-2589
+2500
2
3
-522
+525
3
6
-474
+455
6
15
-486
+467
15
55
-461
+444
59
-223
-461
+226
+444
229
-1196
-461
+1198
+444
-1266
+1275
2344
-461
+444
-2536
+2542
6440
-97
+93
@@ -7426,57 +7441,57 @@
1
2
-984
+969
2
3
-1130
+1063
3
4
-291
+280
4
6
-498
+502
6
10
-486
+455
10
-21
-474
+20
+444
-21
-60
-461
+20
+55
+444
-60
-208
-461
+56
+195
+444
-209
-929
-461
+196
+829
+444
-957
-1965
-461
+851
+1958
+444
-1969
+1958
6490
-303
+327
@@ -7492,55 +7507,55 @@
1
2
-984
+969
2
3
-1130
+1063
3
4
-291
+280
4
6
-498
+502
6
10
-486
+455
10
-21
-474
+20
+444
-21
-60
-461
+20
+55
+444
-60
-208
-461
+56
+195
+444
-209
-931
-461
+205
+828
+444
-958
-1966
-461
+851
+1962
+467
-1969
+1965
6462
303
@@ -7558,42 +7573,42 @@
1
2
-2735
+2640
2
3
-522
+525
3
7
-547
+525
7
13
-474
+455
13
29
-498
+479
29
-51
-474
+54
+455
-51
-90
-461
+54
+109
+444
-91
+110
428
-303
+292
@@ -7609,62 +7624,62 @@
1
2
-30670
+29480
2
3
-20240
+19455
3
4
-17979
+17281
4
5
-10430
+10025
5
6
-8898
+8553
6
7
-6868
+6601
7
9
-14368
+13811
9
13
-13992
+13437
13
30
-12302
+11824
30
111
-12144
+11649
111
-2100
-12071
+2058
+11602
-2100
+2083
6440
-936
+934
@@ -7680,42 +7695,42 @@
1
2
-56758
+54555
2
3
-35654
+34271
3
4
-11341
+10901
4
5
-9105
+8751
5
7
-11949
+11474
7
19
-12338
+11859
19
76
-12083
+11614
76
6440
-11670
+11229
@@ -7731,22 +7746,22 @@
1
2
-118792
+114171
2
3
-19267
+18508
3
7
-12983
+12502
7
46
-9858
+9476
@@ -7762,57 +7777,57 @@
1
2
-31752
+30520
2
3
-20082
+19303
3
4
-20252
+19466
4
5
-9992
+9604
5
6
-9263
+8903
6
7
-6977
+6707
7
9
-14599
+14021
9
13
-14101
+13565
13
27
-12350
+11871
27
60
-12107
+11626
60
153
-9421
+9067
@@ -7828,57 +7843,57 @@
1
2
-31801
+30567
2
3
-19973
+19197
3
4
-18745
+18017
4
5
-10490
+10083
5
6
-9263
+8903
6
7
-6710
+6449
7
9
-14526
+13963
9
13
-14174
+13612
13
29
-12350
+11871
29
71
-12132
+11602
71
-190
-10734
+258
+10387
@@ -7894,52 +7909,47 @@
1
2
-2309
+4428
2
3
-1094
+1180
3
4
-607
+888
4
-7
-753
+6
+1004
-7
-17
-656
+6
+13
+841
-17
-49
-619
+13
+61
+841
-55
-236
-619
+61
+698
+841
-241
-4440
-619
+705
+10765
+841
-4617
-11969
-619
-
-
-12066
-25444
-267
+11014
+25447
+315
@@ -7955,47 +7965,42 @@
1
2
-3257
+5106
2
3
-1033
+1285
3
4
-583
+1028
4
-9
-644
+7
+969
-9
-29
-619
+7
+33
+841
-29
-166
-619
+33
+376
+841
-172
-1667
-619
+387
+2684
+841
-1667
-2846
-619
-
-
-2870
+2688
6440
-170
+268
@@ -8011,52 +8016,47 @@
1
2
-2334
+4463
2
3
-1106
+1180
3
4
-632
+899
4
-7
-741
+6
+1004
-7
-17
-632
+6
+14
+852
-17
-45
-619
+14
+57
+852
-45
-189
-619
+58
+510
+841
-192
-1191
-619
+518
+2401
+841
-1218
-2414
-619
-
-
-2469
+2415
4808
-243
+245
@@ -8072,42 +8072,42 @@
1
2
-3367
+5141
2
3
-1130
+1343
3
4
-595
+1028
4
-11
-668
+7
+969
-11
+7
23
-632
+852
23
-40
-632
+47
+864
-40
-68
-632
+47
+81
+864
-68
-82
-510
+81
+83
+116
@@ -8123,52 +8123,47 @@
1
2
-2334
+4463
2
3
-1106
+1180
3
4
-632
+911
4
-7
-741
+6
+993
-7
-17
-644
+6
+13
+841
-17
-46
-619
+13
+56
+841
-46
-194
-619
+56
+501
+841
-202
-1220
-619
+505
+2374
+841
-1252
-2470
-619
-
-
-2481
+2398
4808
-230
+268
@@ -8178,31 +8173,31 @@
locations_stmt
-2176932
+2178211
id
-2176932
+2178211
container
-3078
+3080
startLine
-296727
+296902
startColumn
-1228
+1229
endLine
-294872
+295045
endColumn
-1493
+1494
@@ -8216,7 +8211,7 @@
1
2
-2176932
+2178211
@@ -8232,7 +8227,7 @@
1
2
-2176932
+2178211
@@ -8248,7 +8243,7 @@
1
2
-2176932
+2178211
@@ -8264,7 +8259,7 @@
1
2
-2176932
+2178211
@@ -8280,7 +8275,7 @@
1
2
-2176932
+2178211
@@ -8493,7 +8488,7 @@
38
48
-251
+252
48
@@ -8534,7 +8529,7 @@
6
15
-251
+252
15
@@ -8681,37 +8676,37 @@
1
2
-113847
+113914
2
3
-78993
+79039
3
4
-31327
+31345
4
6
-24942
+24957
6
16
-22619
+22632
16
129
-22275
+22288
129
222
-2722
+2723
@@ -8727,32 +8722,32 @@
1
2
-175967
+176070
2
3
-51906
+51936
3
5
-22552
+22565
5
13
-22373
+22386
13
125
-22257
+22270
125
176
-1671
+1672
@@ -8768,32 +8763,32 @@
1
2
-130943
+131019
2
3
-73506
+73549
3
4
-30767
+30785
4
7
-26583
+26598
7
16
-22312
+22325
16
45
-12615
+12623
@@ -8809,27 +8804,27 @@
1
2
-192251
+192364
2
3
-47310
+47337
3
4
-21765
+21778
4
9
-23264
+23278
9
30
-12136
+12143
@@ -8845,32 +8840,32 @@
1
2
-156444
+156536
2
3
-62371
+62408
3
4
-20782
+20794
4
9
-24659
+24674
9
30
-22398
+22411
30
73
-10071
+10077
@@ -9266,37 +9261,37 @@
1
2
-116305
+116374
2
3
-72848
+72891
3
4
-31996
+32015
4
6
-25618
+25633
6
16
-23031
+23044
16
126
-22121
+22134
126
228
-2949
+2951
@@ -9312,27 +9307,27 @@
1
2
-175604
+175707
2
3
-52066
+52096
3
5
-22207
+22220
5
14
-23375
+23389
14
173
-21617
+21630
@@ -9348,27 +9343,27 @@
1
2
-194592
+194706
2
3
-42314
+42339
3
4
-20677
+20689
4
8
-22760
+22774
8
32
-14526
+14535
@@ -9384,32 +9379,32 @@
1
2
-133173
+133251
2
3
-67871
+67910
3
4
-32611
+32630
4
7
-26503
+26518
7
16
-22183
+22196
16
46
-12529
+12536
@@ -9425,32 +9420,32 @@
1
2
-156272
+156364
2
3
-62230
+62266
3
4
-21132
+21144
4
9
-23756
+23770
9
33
-22318
+22331
33
73
-9162
+9167
@@ -9830,15 +9825,15 @@
locations_expr
-9745314
+9746017
id
-9745314
+9746017
container
-3559
+3563
startLine
@@ -9868,7 +9863,7 @@
1
2
-9745314
+9746017
@@ -9884,7 +9879,7 @@
1
2
-9745314
+9746017
@@ -9900,7 +9895,7 @@
1
2
-9745314
+9746017
@@ -9916,7 +9911,7 @@
1
2
-9745314
+9746017
@@ -9932,7 +9927,7 @@
1
2
-9745314
+9746017
@@ -9953,67 +9948,67 @@
4
11
-280
+284
11
-36
-267
+37
+272
-36
-112
-270
+37
+114
+269
-112
-207
+114
+210
+269
+
+
+210
+328
268
-207
-326
+328
+498
268
-326
-493
-267
+499
+771
+269
-493
-760
-267
+772
+1223
+268
-760
-1208
-267
+1223
+1918
+268
-1210
-1899
-267
+1918
+3307
+268
-1900
-3251
-267
+3322
+7569
+268
-3258
-7330
-267
+7607
+160039
+268
-7359
-51115
-267
-
-
-51126
+170837
491727
-16
+3
@@ -10029,17 +10024,17 @@
1
3
-300
+296
3
7
-315
+319
7
17
-271
+272
17
@@ -10049,47 +10044,47 @@
35
59
-279
+278
59
88
-270
+271
88
138
-268
+271
138
-206
-267
+207
+271
-206
-336
+207
+339
268
-336
-525
+339
+532
268
-525
-946
-267
+532
+949
+268
-947
-2013
-267
+951
+2069
+268
-2019
+2076
142752
-248
+242
@@ -10105,67 +10100,67 @@
1
3
-308
+307
3
7
-293
+296
7
17
-273
+274
17
-35
-267
+36
+283
-35
-51
-278
+36
+52
+287
-51
-63
-289
+52
+64
+297
-63
-73
-290
+64
+74
+279
-73
-83
+74
+84
+296
+
+
+84
+93
+270
+
+
+93
+106
282
-83
-92
-276
+106
+122
+271
-92
-104
-270
+122
+150
+268
-104
-120
-276
-
-
-120
-145
-270
-
-
-145
+150
330
-187
+153
@@ -10181,17 +10176,17 @@
1
3
-300
+296
3
7
-312
+316
7
17
-274
+275
17
@@ -10201,17 +10196,17 @@
35
59
-278
+277
59
89
-275
+277
89
139
-271
+273
139
@@ -10230,18 +10225,18 @@
547
-971
-267
+973
+269
-972
-2152
-267
+975
+2167
+268
-2152
+2170
143560
-242
+239
@@ -10257,7 +10252,7 @@
1
3
-278
+279
3
@@ -10267,57 +10262,57 @@
7
19
-278
+281
19
-41
-268
+42
+275
-41
+42
60
-279
+272
60
-72
-267
+73
+294
-72
-83
-280
+73
+84
+277
-83
-94
-283
+84
+95
+291
-94
-105
-292
-
-
-105
-119
-278
-
-
-119
-136
+95
+106
279
-136
-162
-269
+106
+120
+282
-162
+120
+138
+275
+
+
+138
+166
+270
+
+
+166
416
-210
+190
@@ -10667,22 +10662,22 @@
16130
-46279
+46280
29
-48722
-86671
+48729
+86681
29
-87010
-224371
+87033
+224378
29
-237409
-710014
+237411
+710028
6
@@ -10743,17 +10738,17 @@
1424
-2061
+2063
29
-2064
-2425
+2066
+2429
29
-2427
-2796
+2429
+2797
22
@@ -11336,18 +11331,18 @@
35
-20304
-51564
+20305
+51570
35
-54934
+54937
117747
35
-117846
-185890
+117863
+185908
35
@@ -11408,12 +11403,12 @@
1983
-2458
+2459
35
-2468
-2637
+2470
+2640
32
@@ -11469,7 +11464,7 @@
2070
-5989
+5990
35
@@ -11616,7 +11611,7 @@
2067
-5989
+5990
35
@@ -11647,23 +11642,23 @@
numlines
-544741
+523603
element_id
-537168
+516324
num_lines
-10272
+9873
num_code
-7938
+7630
num_comment
-4364
+4194
@@ -11677,12 +11672,12 @@
1
2
-529679
+509126
2
7
-7488
+7197
@@ -11698,12 +11693,12 @@
1
2
-529740
+509184
2
7
-7427
+7139
@@ -11719,12 +11714,12 @@
1
2
-537083
+516242
2
3
-85
+81
@@ -11740,393 +11735,41 @@
1
2
-4655
+4475
2
3
-1325
+1273
3
4
-765
+736
4
6
-838
+806
6
12
-814
+782
12
24
-778
+747
24
118
-778
+747
118
7658
-316
-
-
-
-
-
-
-num_lines
-num_code
-
-
-12
-
-
-1
-2
-4728
-
-
-2
-3
-1337
-
-
-3
-4
-802
-
-
-4
-6
-850
-
-
-6
-11
-923
-
-
-11
-18
-790
-
-
-18
-29
-790
-
-
-29
-32
-48
-
-
-
-
-
-
-num_lines
-num_comment
-
-
-12
-
-
-1
-2
-4716
-
-
-2
-3
-1337
-
-
-3
-4
-826
-
-
-4
-6
-838
-
-
-6
-10
-802
-
-
-10
-16
-899
-
-
-16
-26
-814
-
-
-26
-27
-36
-
-
-
-
-
-
-num_code
-element_id
-
-
-12
-
-
-1
-2
-3184
-
-
-2
-3
-1239
-
-
-3
-4
-632
-
-
-4
-6
-607
-
-
-6
-10
-619
-
-
-10
-21
-619
-
-
-21
-67
-595
-
-
-68
-7861
-437
-
-
-
-
-
-
-num_code
-num_lines
-
-
-12
-
-
-1
-2
-3209
-
-
-2
-3
-1264
-
-
-3
-4
-644
-
-
-4
-6
-607
-
-
-6
-10
-692
-
-
-10
-21
-644
-
-
-21
-34
-607
-
-
-34
-42
-267
-
-
-
-
-
-
-num_code
-num_comment
-
-
-12
-
-
-1
-2
-3233
-
-
-2
-3
-1227
-
-
-3
-4
-680
-
-
-4
-6
-619
-
-
-6
-10
-680
-
-
-10
-19
-668
-
-
-19
-28
-595
-
-
-28
-33
-230
-
-
-
-
-
-
-num_comment
-element_id
-
-
-12
-
-
-1
-2
-2030
-
-
-2
-3
-559
-
-
-3
-4
-328
-
-
-4
-7
-340
-
-
-7
-14
-340
-
-
-14
-38
-328
-
-
-39
-280
-328
-
-
-283
-35679
-109
-
-
-
-
-
-
-num_comment
-num_lines
-
-
-12
-
-
-1
-2
-2042
-
-
-2
-3
-571
-
-
-3
-5
-389
-
-
-5
-8
-364
-
-
-8
-18
-364
-
-
-18
-58
-328
-
-
-61
-118
303
@@ -12134,6 +11777,358 @@
+num_lines
+num_code
+
+
+12
+
+
+1
+2
+4545
+
+
+2
+3
+1285
+
+
+3
+4
+771
+
+
+4
+6
+817
+
+
+6
+11
+888
+
+
+11
+18
+759
+
+
+18
+29
+759
+
+
+29
+32
+46
+
+
+
+
+
+
+num_lines
+num_comment
+
+
+12
+
+
+1
+2
+4533
+
+
+2
+3
+1285
+
+
+3
+4
+794
+
+
+4
+6
+806
+
+
+6
+10
+771
+
+
+10
+16
+864
+
+
+16
+26
+782
+
+
+26
+27
+35
+
+
+
+
+
+
+num_code
+element_id
+
+
+12
+
+
+1
+2
+3061
+
+
+2
+3
+1191
+
+
+3
+4
+607
+
+
+4
+6
+584
+
+
+6
+10
+595
+
+
+10
+21
+595
+
+
+21
+67
+572
+
+
+68
+7861
+420
+
+
+
+
+
+
+num_code
+num_lines
+
+
+12
+
+
+1
+2
+3084
+
+
+2
+3
+1215
+
+
+3
+4
+619
+
+
+4
+6
+584
+
+
+6
+10
+666
+
+
+10
+21
+619
+
+
+21
+34
+584
+
+
+34
+42
+257
+
+
+
+
+
+
+num_code
+num_comment
+
+
+12
+
+
+1
+2
+3108
+
+
+2
+3
+1180
+
+
+3
+4
+654
+
+
+4
+6
+595
+
+
+6
+10
+654
+
+
+10
+19
+642
+
+
+19
+28
+572
+
+
+28
+33
+222
+
+
+
+
+
+
+num_comment
+element_id
+
+
+12
+
+
+1
+2
+1951
+
+
+2
+3
+537
+
+
+3
+4
+315
+
+
+4
+7
+327
+
+
+7
+14
+327
+
+
+14
+38
+315
+
+
+39
+280
+315
+
+
+283
+35679
+105
+
+
+
+
+
+
+num_comment
+num_lines
+
+
+12
+
+
+1
+2
+1963
+
+
+2
+3
+549
+
+
+3
+5
+373
+
+
+5
+8
+350
+
+
+8
+18
+350
+
+
+18
+58
+315
+
+
+61
+118
+292
+
+
+
+
+
+
num_comment
num_code
@@ -12143,37 +12138,37 @@
1
2
-2042
+1963
2
3
-571
+549
3
5
-389
+373
5
8
-364
+350
8
17
-340
+327
17
52
-328
+315
56
108
-328
+315
@@ -12183,31 +12178,31 @@
diagnostics
-76160
+73204
id
-76160
+73204
severity
-36
+35
error_tag
-97
+93
error_message
-121
+116
full_error_message
-65948
+63389
location
-145
+140
@@ -12221,7 +12216,7 @@
1
2
-76160
+73204
@@ -12237,7 +12232,7 @@
1
2
-76160
+73204
@@ -12253,7 +12248,7 @@
1
2
-76160
+73204
@@ -12269,7 +12264,7 @@
1
2
-76160
+73204
@@ -12285,7 +12280,7 @@
1
2
-76160
+73204
@@ -12301,17 +12296,17 @@
1
2
-12
+11
2
3
-12
+11
6262
6263
-12
+11
@@ -12327,12 +12322,12 @@
1
2
-24
+23
6
7
-12
+11
@@ -12348,12 +12343,12 @@
1
2
-24
+23
8
9
-12
+11
@@ -12369,17 +12364,17 @@
1
2
-12
+11
2
3
-12
+11
5422
5423
-12
+11
@@ -12395,17 +12390,17 @@
1
2
-12
+11
2
3
-12
+11
9
10
-12
+11
@@ -12421,32 +12416,32 @@
1
2
-24
+23
2
3
-24
+23
5
6
-12
+11
417
418
-12
+11
841
842
-12
+11
4996
4997
-12
+11
@@ -12462,7 +12457,7 @@
1
2
-97
+93
@@ -12478,12 +12473,12 @@
1
2
-85
+81
3
4
-12
+11
@@ -12499,27 +12494,27 @@
1
2
-36
+35
2
3
-24
+23
5
6
-12
+11
417
418
-12
+11
4996
4997
-12
+11
@@ -12535,17 +12530,17 @@
1
2
-60
+58
2
3
-24
+23
5
6
-12
+11
@@ -12561,42 +12556,42 @@
1
2
-24
+23
2
3
-24
+23
5
6
-12
+11
10
11
-12
+11
75
76
-12
+11
332
333
-12
+11
841
842
-12
+11
4996
4997
-12
+11
@@ -12612,7 +12607,7 @@
1
2
-121
+116
@@ -12628,7 +12623,7 @@
1
2
-121
+116
@@ -12644,37 +12639,37 @@
1
2
-36
+35
2
3
-24
+23
5
6
-12
+11
10
11
-12
+11
75
76
-12
+11
332
333
-12
+11
4996
4997
-12
+11
@@ -12690,17 +12685,17 @@
1
2
-85
+81
2
3
-24
+23
5
6
-12
+11
@@ -12716,12 +12711,12 @@
1
2
-65936
+63377
841
842
-12
+11
@@ -12737,7 +12732,7 @@
1
2
-65948
+63389
@@ -12753,7 +12748,7 @@
1
2
-65948
+63389
@@ -12769,7 +12764,7 @@
1
2
-65948
+63389
@@ -12785,7 +12780,7 @@
1
2
-65948
+63389
@@ -12801,12 +12796,12 @@
1
2
-133
+128
6254
6255
-12
+11
@@ -12822,7 +12817,7 @@
1
2
-145
+140
@@ -12838,12 +12833,12 @@
1
2
-133
+128
3
4
-12
+11
@@ -12859,12 +12854,12 @@
1
2
-133
+128
5
6
-12
+11
@@ -12880,12 +12875,12 @@
1
2
-133
+128
5414
5415
-12
+11
@@ -12895,27 +12890,27 @@
files
-66167
+63599
id
-66167
+63599
name
-66167
+63599
simple
-45148
+43397
ext
-109
+105
fromSource
-12
+11
@@ -12929,7 +12924,7 @@
1
2
-66167
+63599
@@ -12945,7 +12940,7 @@
1
2
-66167
+63599
@@ -12961,7 +12956,7 @@
1
2
-66167
+63599
@@ -12977,7 +12972,7 @@
1
2
-66167
+63599
@@ -12993,7 +12988,7 @@
1
2
-66167
+63599
@@ -13009,7 +13004,7 @@
1
2
-66167
+63599
@@ -13025,7 +13020,7 @@
1
2
-66167
+63599
@@ -13041,7 +13036,7 @@
1
2
-66167
+63599
@@ -13057,22 +13052,22 @@
1
2
-34196
+32869
2
3
-6868
+6601
3
7
-3586
+3446
7
42
-498
+479
@@ -13088,22 +13083,22 @@
1
2
-34196
+32869
2
3
-6868
+6601
3
7
-3586
+3446
7
42
-498
+479
@@ -13119,17 +13114,17 @@
1
2
-40322
+38758
2
3
-4193
+4031
3
6
-632
+607
@@ -13145,7 +13140,7 @@
1
2
-45148
+43397
@@ -13161,47 +13156,47 @@
1
2
-12
+11
3
4
-12
+11
15
16
-12
+11
38
39
-12
+11
80
81
-12
+11
114
115
-12
+11
441
442
-12
+11
738
739
-12
+11
4013
4014
-12
+11
@@ -13217,47 +13212,47 @@
1
2
-12
+11
3
4
-12
+11
15
16
-12
+11
38
39
-12
+11
80
81
-12
+11
114
115
-12
+11
441
442
-12
+11
738
739
-12
+11
4013
4014
-12
+11
@@ -13273,47 +13268,47 @@
1
2
-12
+11
3
4
-12
+11
15
16
-12
+11
38
39
-12
+11
75
76
-12
+11
112
113
-12
+11
428
429
-12
+11
658
659
-12
+11
2838
2839
-12
+11
@@ -13329,7 +13324,7 @@
1
2
-109
+105
@@ -13345,7 +13340,7 @@
5443
5444
-12
+11
@@ -13361,7 +13356,7 @@
5443
5444
-12
+11
@@ -13377,7 +13372,7 @@
3714
3715
-12
+11
@@ -13393,7 +13388,7 @@
9
10
-12
+11
@@ -13403,19 +13398,19 @@
folders
-12107
+11637
id
-12107
+11637
name
-12107
+11637
simple
-3476
+3341
@@ -13429,7 +13424,7 @@
1
2
-12107
+11637
@@ -13445,7 +13440,7 @@
1
2
-12107
+11637
@@ -13461,7 +13456,7 @@
1
2
-12107
+11637
@@ -13477,7 +13472,7 @@
1
2
-12107
+11637
@@ -13493,27 +13488,27 @@
1
2
-1872
+1799
2
3
-741
+712
3
4
-498
+479
4
28
-279
+268
28
121
-85
+81
@@ -13529,27 +13524,27 @@
1
2
-1872
+1799
2
3
-741
+712
3
4
-498
+479
4
28
-279
+268
28
121
-85
+81
@@ -13559,15 +13554,15 @@
containerparent
-78250
+75214
parent
-12107
+11637
child
-78250
+75214
@@ -13581,42 +13576,42 @@
1
2
-5506
+5293
2
3
-1568
+1507
3
4
-668
+642
4
6
-1118
+1074
6
10
-899
+864
10
14
-960
+923
14
30
-923
+888
30
153
-461
+444
@@ -13632,7 +13627,7 @@
1
2
-78250
+75214
@@ -13642,23 +13637,23 @@
fileannotations
-5688625
+5467887
id
-5348
+5141
kind
-24
+23
name
-60186
+57851
value
-49318
+47404
@@ -13672,12 +13667,12 @@
1
2
-145
+140
2
3
-5202
+5001
@@ -13693,62 +13688,62 @@
1
96
-401
+385
96
219
-401
+385
221
285
-401
+385
285
444
-401
+385
445
521
-401
+385
526
619
-425
+408
619
708
-401
+385
708
895
-401
+385
896
928
-97
+93
930
931
-1531
+1472
1076
1667
-401
+385
1689
2272
-85
+81
@@ -13764,57 +13759,57 @@
1
108
-401
+385
108
269
-401
+385
269
356
-401
+385
371
630
-401
+385
630
729
-401
+385
733
948
-401
+385
948
1062
-401
+385
1079
1494
-279
+268
1495
1496
-1531
+1472
1496
1865
-401
+385
1963
4058
-328
+315
@@ -13830,12 +13825,12 @@
428
429
-12
+11
440
441
-12
+11
@@ -13851,12 +13846,12 @@
2
3
-12
+11
4949
4950
-12
+11
@@ -13872,12 +13867,12 @@
1
2
-12
+11
4057
4058
-12
+11
@@ -13893,62 +13888,62 @@
1
2
-9871
+9487
2
3
-6491
+6239
3
6
-4996
+4802
6
8
-4935
+4743
8
14
-4850
+4662
14
18
-4424
+4253
18
21
-4619
+4440
21
34
-4862
+4673
34
128
-4813
+4627
129
236
-4595
+4416
236
395
-4558
+4381
395
440
-1167
+1121
@@ -13964,7 +13959,7 @@
1
2
-60186
+57851
@@ -13980,62 +13975,62 @@
1
2
-11038
+10609
2
3
-8728
+8389
3
4
-2808
+2699
4
6
-4352
+4183
6
10
-5470
+5258
10
14
-3586
+3446
14
17
-4643
+4463
17
22
-4643
+4463
22
40
-4558
+4381
40
83
-4582
+4405
83
163
-4534
+4358
164
1933
-1239
+1191
@@ -14051,67 +14046,67 @@
1
2
-7524
+7232
2
5
-2419
+2325
5
8
-3573
+3435
8
21
-3804
+3657
21
23
-2735
+2629
23
25
-4461
+4288
25
40
-3586
+3446
40
195
-3890
+3739
195
207
-3902
+3750
207
273
-4048
+3891
273
327
-3744
+3598
328
407
-4315
+4148
407
441
-1312
+1261
@@ -14127,12 +14122,12 @@
1
2
-49306
+47393
2
3
-12
+11
@@ -14148,67 +14143,67 @@
1
2
-7549
+7256
2
5
-2795
+2687
5
8
-3610
+3470
8
16
-4060
+3902
16
18
-3343
+3213
18
21
-4072
+3914
21
31
-4461
+4288
31
42
-4023
+3867
42
54
-3768
+3622
54
81
-3780
+3633
81
109
-3829
+3680
109
133
-3756
+3610
133
149
-267
+257
@@ -14218,15 +14213,15 @@
inmacroexpansion
-57126596
+57160160
id
-15544516
+15553649
inv
-2493763
+2495229
@@ -14240,42 +14235,42 @@
1
2
-3895411
+3897700
2
3
-2466113
+2467562
3
4
-2018102
+2019287
4
5
-1769908
+1770948
5
6
-1845270
+1846354
6
7
-884925
+885445
7
8
-1535759
+1536661
8
6265
-1129025
+1129688
@@ -14291,52 +14286,52 @@
1
2
-651228
+651611
2
3
-350884
+351091
3
4
-145822
+145908
4
5
-276335
+276498
5
8
-230677
+230812
8
11
-202111
+202230
11
19
-210471
+210594
19
34
-192538
+192651
34
167
-188020
+188130
167
153127
-45673
+45699
@@ -14346,15 +14341,15 @@
affectedbymacroexpansion
-35527526
+35548400
id
-4083475
+4085874
inv
-3282712
+3284641
@@ -14368,42 +14363,42 @@
1
2
-1341531
+1342319
2
3
-719304
+719727
3
4
-682963
+683364
4
6
-320945
+321133
6
10
-313534
+313718
10
24
-308059
+308240
24
64
-309945
+310127
64
9803
-87190
+87242
@@ -14419,72 +14414,72 @@
1
2
-253184
+253333
2
3
-209979
+210102
3
4
-202347
+202466
4
5
-258125
+258276
5
6
-301422
+301599
6
7
-247881
+248027
7
8
-231148
+231284
8
9
-228002
+228136
9
10
-182499
+182606
10
12
-285679
+285847
12
16
-297410
+297584
16
23
-275398
+275560
23
60
-248963
+249109
60
526
-60669
+60704
@@ -14494,23 +14489,23 @@
macroinvocations
-40814994
+39320374
id
-40814994
+39320374
macro_id
-89374
+85906
location
-836970
+804492
kind
-24
+23
@@ -14524,7 +14519,7 @@
1
2
-40814994
+39320374
@@ -14540,7 +14535,7 @@
1
2
-40814994
+39320374
@@ -14556,7 +14551,7 @@
1
2
-40814994
+39320374
@@ -14572,52 +14567,52 @@
1
2
-19267
+18286
2
3
-16946
+16475
3
4
-3744
+3598
4
6
-7925
+7630
6
11
-7658
+7326
11
21
-7160
+6823
21
41
-6758
+6555
41
-104
-6710
+107
+6485
-104
-454
-6710
+107
+450
+6449
-454
-201153
-6491
+453
+201240
+6274
@@ -14633,37 +14628,37 @@
1
2
-47483
+45640
2
3
-11803
+11345
3
4
-5895
+5667
4
6
-7682
+7384
6
13
-7403
+7115
13
65
-6734
+6473
65
3614
-2370
+2278
@@ -14679,12 +14674,12 @@
1
2
-82566
+79362
2
3
-6807
+6543
@@ -14700,42 +14695,42 @@
1
2
-314219
+299713
2
3
-186394
+180341
3
4
-44431
+42999
4
5
-58533
+56378
5
8
-67687
+65247
8
16
-64113
+61777
16
46
-64830
+62536
46
-262302
-36761
+262546
+35498
@@ -14751,12 +14746,12 @@
1
2
-783044
+752659
2
353
-53925
+51833
@@ -14772,7 +14767,7 @@
1
2
-836970
+804492
@@ -14788,12 +14783,12 @@
37566
37567
-12
+11
-3319916
-3319917
-12
+3327545
+3327546
+11
@@ -14809,12 +14804,12 @@
2199
2200
-12
+11
5713
5714
-12
+11
@@ -14830,12 +14825,12 @@
6537
6538
-12
+11
62313
62314
-12
+11
@@ -14845,15 +14840,15 @@
macroparent
-35822215
+34476404
id
-35822215
+34476404
parent_id
-27895299
+26856682
@@ -14867,7 +14862,7 @@
1
2
-35822215
+34476404
@@ -14883,17 +14878,17 @@
1
2
-21477676
+20687700
2
3
-5474478
+5262423
3
88
-943144
+906558
@@ -14903,15 +14898,15 @@
macrolocationbind
-4016679
+4019039
id
-2801506
+2803152
location
-2004363
+2005541
@@ -14925,22 +14920,22 @@
1
2
-2200726
+2202019
2
3
-339324
+339524
3
7
-231800
+231936
7
57
-29655
+29673
@@ -14956,22 +14951,22 @@
1
2
-1602305
+1603246
2
3
-171008
+171108
3
8
-155504
+155595
8
723
-75546
+75590
@@ -14981,19 +14976,19 @@
macro_argument_unexpanded
-104803767
+100941827
invocation
-31131960
+30008413
argument_index
-802
+771
text
-345935
+332512
@@ -15007,22 +15002,22 @@
1
2
-8804221
+8477672
2
3
-12965574
+12498009
3
4
-7092535
+6840222
4
67
-2269629
+2192508
@@ -15038,22 +15033,22 @@
1
2
-8880284
+8550795
2
3
-13152746
+12678071
3
4
-6885304
+6640869
4
67
-2213625
+2138677
@@ -15069,17 +15064,17 @@
51815
51816
-705
+677
52017
-186703
-60
+187640
+58
-770141
-2560947
-36
+773038
+2568177
+35
@@ -15095,17 +15090,17 @@
2
3
-705
+677
13
1002
-60
+58
6617
19688
-36
+35
@@ -15121,62 +15116,62 @@
1
2
-42535
+39868
2
3
-69291
+64826
3
4
-15621
+15435
4
5
-46376
+44296
5
8
-26513
+26980
8
12
-15560
+15447
12
16
-24531
+23275
16
22
-26403
+25414
22
-42
-26257
+41
+25075
-42
-113
-25978
+41
+101
+24970
-113
-51881
-25953
+101
+4363
+24958
-51881
-580841
-911
+4608
+581891
+1963
@@ -15192,17 +15187,17 @@
1
2
-250082
+240378
2
3
-84450
+81173
3
9
-11402
+10960
@@ -15212,19 +15207,19 @@
macro_argument_expanded
-104803767
+100941827
invocation
-31131960
+30008413
argument_index
-802
+771
text
-209491
+201362
@@ -15238,22 +15233,22 @@
1
2
-8804221
+8477672
2
3
-12965574
+12498009
3
4
-7092535
+6840222
4
67
-2269629
+2192508
@@ -15269,22 +15264,22 @@
1
2
-12795323
+12315365
2
3
-11169279
+10770085
3
4
-5961987
+5753415
4
9
-1205370
+1169546
@@ -15300,17 +15295,17 @@
51815
51816
-705
+677
52017
-186703
-60
+187640
+58
-770141
-2560947
-36
+773038
+2568177
+35
@@ -15326,17 +15321,17 @@
1
2
-692
+666
2
75
-60
+58
867
13964
-48
+46
@@ -15352,62 +15347,57 @@
1
2
-25820
+23871
2
3
-42583
+40791
3
4
-6758
+6636
4
-5
-15791
-
-
-5
6
-3367
+18450
6
7
-24555
+23743
7
9
-16702
+16475
9
15
-19146
+17597
15
31
-15851
+15984
31
-87
-15912
+86
+15108
-87
-393
-15742
+86
+365
+15225
-396
-1164221
-7257
+365
+1165688
+7478
@@ -15423,22 +15413,22 @@
1
2
-105651
+101551
2
3
-87976
+84562
3
6
-15779
+15166
6
66
-85
+81
@@ -15448,19 +15438,19 @@
functions
-3565918
+3552236
id
-3565918
+3552236
name
-315848
+303954
kind
-85
+81
@@ -15474,7 +15464,7 @@
1
2
-3565918
+3552236
@@ -15490,7 +15480,7 @@
1
2
-3565918
+3552236
@@ -15506,27 +15496,27 @@
1
2
-214682
+206387
2
3
-31266
+29924
3
5
-28360
+27435
5
13
-23826
+23100
13
-109484
-17711
+118759
+17106
@@ -15542,12 +15532,12 @@
1
2
-314231
+302400
2
3
-1616
+1554
@@ -15563,37 +15553,37 @@
32
33
-12
+11
-477
-478
-12
+478
+479
+11
2735
2736
-12
+11
-5928
-5929
-12
+6052
+6053
+11
-43779
-43780
-12
+43879
+43880
+11
-108979
-108980
-12
+109948
+109949
+11
-131406
-131407
-12
+140883
+140884
+11
@@ -15609,37 +15599,37 @@
11
12
-12
+11
42
43
-12
+11
-228
-229
-12
+229
+230
+11
-1485
-1486
-12
+1494
+1495
+11
2735
2736
-12
+11
-2858
-2859
-12
+2879
+2880
+11
18756
18757
-12
+11
@@ -15649,15 +15639,15 @@
function_entry_point
-1068501
+1030977
id
-1065255
+1027857
entry_point
-1068501
+1030977
@@ -15671,12 +15661,12 @@
1
2
-1062313
+1025030
2
9
-2941
+2827
@@ -15692,7 +15682,7 @@
1
2
-1068501
+1030977
@@ -15702,15 +15692,15 @@
function_return_type
-3577065
+3562951
id
-3565347
+3551686
return_type
-1033588
+1048715
@@ -15724,12 +15714,12 @@
1
2
-3554126
+3540901
2
6
-11220
+10784
@@ -15745,17 +15735,17 @@
1
2
-319945
+309177
2
3
-649566
+677865
3
-81742
-64076
+82133
+61671
@@ -15765,60 +15755,60 @@
purefunctions
-21018
+20805
id
-21018
+20805
function_deleted
-51251
+49379
id
-51251
+49379
function_defaulted
-9554
+9184
id
-9554
+9184
fun_decls
-3668324
+3646017
id
-3657006
+3635139
function
-3484737
+3469555
type_id
-1026294
+1041634
name
-281968
+271389
location
-875943
+843835
@@ -15832,7 +15822,7 @@
1
2
-3657006
+3635139
@@ -15848,12 +15838,12 @@
1
2
-3646053
+3624611
2
6
-10952
+10527
@@ -15869,7 +15859,7 @@
1
2
-3657006
+3635139
@@ -15885,7 +15875,7 @@
1
2
-3657006
+3635139
@@ -15901,12 +15891,12 @@
1
2
-3343699
+3333988
2
9
-141038
+135566
@@ -15922,12 +15912,12 @@
1
2
-3466345
+3451876
2
6
-18392
+17678
@@ -15943,7 +15933,7 @@
1
2
-3484737
+3469555
@@ -15959,12 +15949,12 @@
1
2
-3389832
+3378332
2
9
-94905
+91222
@@ -15980,17 +15970,17 @@
1
2
-305953
+295716
2
3
-648059
+676381
3
-87017
-72282
+87408
+69535
@@ -16006,17 +15996,17 @@
1
2
-318972
+308231
2
3
-644096
+672572
3
-80918
-63225
+81309
+60830
@@ -16032,12 +16022,12 @@
1
2
-956638
+974669
2
-7429
-69656
+7459
+66965
@@ -16053,17 +16043,17 @@
1
2
-921129
+940538
2
5
-81642
+78474
5
-22296
-23522
+22349
+22621
@@ -16079,32 +16069,32 @@
1
2
-169351
+162826
2
3
-32554
+31420
3
4
-18866
+17994
4
7
-25650
+24841
7
19
-21261
+20518
19
-109747
-14283
+119022
+13787
@@ -16120,32 +16110,32 @@
1
2
-181155
+174172
2
3
-31412
+30099
3
4
-16654
+16171
4
7
-22623
+21862
7
-26
-21383
+25
+20366
-26
-109468
-8740
+25
+118743
+8716
@@ -16161,17 +16151,17 @@
1
2
-246046
+236860
2
5
-23170
+22271
5
-56245
-12752
+60936
+12257
@@ -16187,27 +16177,27 @@
1
2
-180486
+173599
2
3
-47823
+46213
3
4
-18040
+17340
4
8
-22696
+21815
8
-8793
-12922
+8910
+12420
@@ -16223,27 +16213,27 @@
1
2
-589769
+567012
2
3
-147895
+142319
3
5
-69790
+67350
5
-179
-65766
+141
+63307
-179
-3027
-2723
+142
+3039
+3844
@@ -16259,22 +16249,22 @@
1
2
-602727
+579468
2
3
-164743
+158514
3
9
-69753
+67747
9
-3027
-38718
+3039
+38103
@@ -16290,17 +16280,17 @@
1
2
-773854
+744445
2
4
-68209
+65890
4
-1514
-33879
+1520
+33500
@@ -16316,12 +16306,12 @@
1
2
-848299
+817018
2
134
-27643
+26816
@@ -16331,22 +16321,22 @@
fun_def
-1296860
+1250592
id
-1296860
+1250592
fun_specialized
-6505
+6439
id
-6505
+6439
@@ -16364,11 +16354,11 @@
fun_decl_specifiers
-512313
+512614
id
-274687
+274848
name
@@ -16386,17 +16376,17 @@
1
2
-72048
+72090
2
3
-167651
+167750
3
4
-34987
+35007
@@ -16583,26 +16573,26 @@
fun_decl_empty_throws
-1416734
+1471304
fun_decl
-1416734
+1471304
fun_decl_noexcept
-16569
+15937
fun_decl
-15693
+15096
constant
-16435
+15809
@@ -16616,12 +16606,12 @@
1
2
-14818
+14255
2
3
-875
+841
@@ -16637,12 +16627,12 @@
1
2
-16301
+15680
2
3
-133
+128
@@ -16652,26 +16642,26 @@
fun_decl_empty_noexcept
-364559
+350681
fun_decl
-364559
+350681
fun_decl_typedef_type
-194
+186
fun_decl
-194
+186
typedeftype_id
-97
+93
@@ -16685,7 +16675,7 @@
1
2
-194
+186
@@ -16701,7 +16691,7 @@
2
3
-97
+93
@@ -16711,19 +16701,19 @@
param_decl_bind
-4830661
+4766932
id
-4830661
+4766932
index
-389
+373
fun_decl
-3158896
+3153051
@@ -16737,7 +16727,7 @@
1
2
-4830661
+4766932
@@ -16753,7 +16743,7 @@
1
2
-4830661
+4766932
@@ -16769,57 +16759,57 @@
2
3
-158
+151
4
10
-24
+23
15
44
-24
+23
115
191
-24
+23
263
337
-24
+23
422
615
-24
+23
885
1215
-24
+23
1695
2656
-24
+23
4907
-13240
-24
+13252
+23
-34828
-76062
-24
+34902
+76574
+23
-259854
-259855
-12
+269844
+269845
+11
@@ -16835,57 +16825,57 @@
2
3
-158
+151
4
10
-24
+23
15
44
-24
+23
115
191
-24
+23
263
337
-24
+23
422
615
-24
+23
885
1215
-24
+23
1695
2656
-24
+23
4907
-13240
-24
+13252
+23
-34828
-76062
-24
+34902
+76574
+23
-259854
-259855
-12
+269844
+269845
+11
@@ -16901,22 +16891,22 @@
1
2
-2234266
+2258317
2
3
-501246
+486913
3
4
-262445
+252985
4
33
-160938
+154834
@@ -16932,22 +16922,22 @@
1
2
-2234266
+2258317
2
3
-501246
+486913
3
4
-262445
+252985
4
33
-160938
+154834
@@ -16957,27 +16947,27 @@
var_decls
-5602108
+5518014
id
-5579181
+5495954
variable
-5340611
+5266618
type_id
-2038268
+2068405
name
-139592
+134175
location
-1358468
+1305755
@@ -16991,7 +16981,7 @@
1
2
-5579181
+5495954
@@ -17007,12 +16997,12 @@
1
2
-5556716
+5474337
2
7
-22465
+21616
@@ -17028,7 +17018,7 @@
1
2
-5579181
+5495954
@@ -17044,12 +17034,12 @@
1
2
-5579132
+5495907
2
3
-48
+46
@@ -17065,12 +17055,12 @@
1
2
-5146145
+5079674
2
9
-194466
+186943
@@ -17086,12 +17076,12 @@
1
2
-5290709
+5218605
2
7
-49902
+48012
@@ -17107,12 +17097,12 @@
1
2
-5321866
+5248600
2
3
-18745
+18017
@@ -17128,12 +17118,12 @@
1
2
-5225490
+5155963
2
9
-115121
+110654
@@ -17149,22 +17139,22 @@
1
2
-1580700
+1627085
2
3
-244952
+236522
3
-9
-154629
+10
+155430
-9
-5708
-57986
+10
+5721
+49367
@@ -17180,22 +17170,22 @@
1
2
-1607080
+1652441
2
3
-234777
+226741
3
-11
-155359
+13
+156353
-11
-5254
-41052
+13
+5267
+32869
@@ -17211,17 +17201,17 @@
1
2
-1850925
+1888086
2
5
-162458
+156341
5
770
-24884
+23977
@@ -17237,17 +17227,17 @@
1
2
-1771751
+1811867
2
4
-165132
+159052
4
3604
-101384
+97485
@@ -17263,42 +17253,42 @@
1
2
-58861
+56530
2
3
-20860
+20039
3
4
-12290
+11801
4
6
-12715
+12268
6
10
-11524
+11088
10
22
-10673
+10270
22
255
-10490
+10083
263
-149390
-2176
+159500
+2091
@@ -17314,37 +17304,37 @@
1
2
-62277
+59814
2
3
-20118
+19314
3
4
-13359
+12841
4
6
-11949
+11532
6
11
-11499
+11077
11
28
-10515
+10095
28
-148426
-9871
+158536
+9499
@@ -17360,32 +17350,32 @@
1
2
-84973
+81606
2
3
-18149
+17445
3
4
-9676
+9347
4
7
-11706
+11275
7
28
-10576
+10165
28
-111448
-4510
+120730
+4335
@@ -17401,32 +17391,32 @@
1
2
-80329
+77212
2
3
-21273
+20448
3
4
-7780
+7478
4
7
-12423
+11941
7
21
-10563
+10154
21
9993
-7220
+6940
@@ -17442,22 +17432,22 @@
1
2
-1008108
+967927
2
3
-144734
+139422
3
6
-124044
+119546
6
-114124
-81581
+123459
+78860
@@ -17473,22 +17463,22 @@
1
2
-1060320
+1018112
2
3
-107961
+103970
3
6
-111863
+107943
6
-113877
-78323
+123212
+75728
@@ -17504,17 +17494,17 @@
1
2
-1166129
+1119863
2
3
-93045
+89797
3
-104379
-99293
+113652
+96095
@@ -17530,12 +17520,12 @@
1
2
-1348524
+1296197
2
52
-9943
+9558
@@ -17545,11 +17535,11 @@
var_def
-2573394
+2477557
id
-2573394
+2477557
@@ -17619,19 +17609,19 @@
type_decls
-1469165
+1413769
id
-1469165
+1413769
type_id
-1433996
+1379965
location
-1203571
+1156868
@@ -17645,7 +17635,7 @@
1
2
-1469165
+1413769
@@ -17661,7 +17651,7 @@
1
2
-1469165
+1413769
@@ -17677,12 +17667,12 @@
1
2
-1408431
+1355392
2
24
-25564
+24572
@@ -17698,12 +17688,12 @@
1
2
-1409866
+1356771
2
24
-24130
+23194
@@ -17719,12 +17709,12 @@
1
2
-1142582
+1098234
2
469
-60988
+58633
@@ -17740,12 +17730,12 @@
1
2
-1144223
+1099812
2
469
-59347
+57056
@@ -17755,45 +17745,45 @@
type_def
-1035654
+995467
id
-1035654
+995467
type_decl_top
-297552
+286006
type_decl
-297552
+286006
namespace_decls
-151627
+145743
id
-151627
+145743
namespace_id
-8485
+8155
location
-135422
+130167
bodylocation
-135787
+130518
@@ -17807,7 +17797,7 @@
1
2
-151627
+145743
@@ -17823,7 +17813,7 @@
1
2
-151627
+145743
@@ -17839,7 +17829,7 @@
1
2
-151627
+145743
@@ -17855,42 +17845,42 @@
1
2
-4011
+3855
2
3
-1191
+1145
3
4
-449
+432
4
7
-717
+689
7
13
-656
+630
13
27
-656
+630
28
163
-644
+619
172
3743
-158
+151
@@ -17906,42 +17896,42 @@
1
2
-4011
+3855
2
3
-1191
+1145
3
4
-449
+432
4
7
-717
+689
7
13
-656
+630
13
27
-656
+630
28
163
-644
+619
172
3743
-158
+151
@@ -17957,42 +17947,42 @@
1
2
-4011
+3855
2
3
-1191
+1145
3
4
-449
+432
4
7
-717
+689
7
13
-656
+630
13
27
-656
+630
28
163
-644
+619
172
3742
-158
+151
@@ -18008,12 +17998,12 @@
1
2
-126135
+121240
2
8
-9287
+8927
@@ -18029,12 +18019,12 @@
1
2
-126135
+121240
2
8
-9287
+8927
@@ -18050,12 +18040,12 @@
1
2
-134595
+129373
2
3
-826
+794
@@ -18071,12 +18061,12 @@
1
2
-126900
+121976
2
11
-8886
+8541
@@ -18092,12 +18082,12 @@
1
2
-126900
+121976
2
9
-8886
+8541
@@ -18113,12 +18103,12 @@
1
2
-135349
+130097
2
5
-437
+420
@@ -18128,19 +18118,19 @@
usings
-320601
+308161
id
-320601
+308161
element_id
-49002
+47101
location
-26464
+25437
@@ -18154,7 +18144,7 @@
1
2
-320601
+308161
@@ -18170,7 +18160,7 @@
1
2
-320601
+308161
@@ -18186,17 +18176,17 @@
1
2
-41234
+39634
2
4
-4169
+4007
4
127
-3598
+3458
@@ -18212,17 +18202,17 @@
1
2
-41234
+39634
2
4
-4169
+4007
4
127
-3598
+3458
@@ -18238,22 +18228,22 @@
1
2
-20033
+19256
2
3
-2540
+2442
3
21
-2054
+1974
21
347
-1835
+1764
@@ -18269,22 +18259,22 @@
1
2
-20033
+19256
2
3
-2540
+2442
3
21
-2054
+1974
21
347
-1835
+1764
@@ -18294,15 +18284,15 @@
using_container
-485187
+466360
parent
-8667
+8331
child
-301029
+289348
@@ -18316,47 +18306,47 @@
1
2
-3379
+3248
2
3
-559
+537
3
6
-668
+642
6
15
-656
+630
16
31
-705
+677
31
143
-291
+280
178
179
-1397
+1343
179
182
-765
+736
182
501
-243
+233
@@ -18372,22 +18362,22 @@
1
2
-217478
+209039
2
3
-55773
+53609
3
6
-22659
+21780
6
47
-5117
+4919
@@ -18397,23 +18387,23 @@
static_asserts
-132358
+131017
id
-132358
+131017
condition
-132358
+131017
message
-30094
+29789
location
-16938
+16766
@@ -18427,7 +18417,7 @@
1
2
-132358
+131017
@@ -18443,7 +18433,7 @@
1
2
-132358
+131017
@@ -18459,7 +18449,7 @@
1
2
-132358
+131017
@@ -18475,7 +18465,7 @@
1
2
-132358
+131017
@@ -18491,7 +18481,7 @@
1
2
-132358
+131017
@@ -18507,7 +18497,7 @@
1
2
-132358
+131017
@@ -18523,32 +18513,32 @@
1
2
-22395
+22168
2
3
-428
+424
3
4
-2867
+2837
4
11
-1463
+1448
12
17
-2379
+2355
17
513
-560
+554
@@ -18564,32 +18554,32 @@
1
2
-22395
+22168
2
3
-428
+424
3
4
-2867
+2837
4
11
-1463
+1448
12
17
-2379
+2355
17
513
-560
+554
@@ -18605,12 +18595,12 @@
1
2
-27912
+27629
2
33
-2181
+2159
@@ -18626,32 +18616,32 @@
1
2
-2939
+2909
2
3
-2801
+2772
3
4
-1344
+1330
5
6
-3776
+3738
6
7
-177
+176
14
15
-2062
+2042
16
@@ -18661,12 +18651,12 @@
17
18
-3447
+3412
19
52
-349
+345
@@ -18682,32 +18672,32 @@
1
2
-2939
+2909
2
3
-2801
+2772
3
4
-1344
+1330
5
6
-3776
+3738
6
7
-177
+176
14
15
-2062
+2042
16
@@ -18717,12 +18707,12 @@
17
18
-3447
+3412
19
52
-349
+345
@@ -18738,22 +18728,22 @@
1
2
-4475
+4429
2
3
-6063
+6002
3
4
-6208
+6145
4
7
-191
+189
@@ -18763,23 +18753,23 @@
params
-4803552
+4749557
id
-4779409
+4724692
function
-3118318
+3117564
index
-389
+373
type_id
-1865866
+1906163
@@ -18793,12 +18783,12 @@
1
2
-4778668
+4723979
2
69
-741
+712
@@ -18814,7 +18804,7 @@
1
2
-4779409
+4724692
@@ -18830,12 +18820,12 @@
1
2
-4757747
+4702211
2
7
-21662
+22481
@@ -18851,22 +18841,22 @@
1
2
-2207692
+2232786
2
3
-482853
+472740
3
4
-264220
+254691
4
33
-163552
+157346
@@ -18882,22 +18872,22 @@
1
2
-2207692
+2232786
2
3
-482853
+472740
3
4
-264220
+254691
4
33
-163552
+157346
@@ -18913,22 +18903,22 @@
1
2
-2314438
+2335471
2
3
-493113
+480884
3
5
-270978
+262941
5
20
-39787
+38267
@@ -18944,57 +18934,57 @@
2
3
-158
+151
4
10
-24
+23
15
44
-24
+23
115
191
-24
+23
263
337
-24
+23
422
615
-24
+23
883
1209
-24
+23
1659
2596
-24
+23
4880
-13455
-24
+13467
+23
-35189
-74910
-24
+35263
+75722
+23
-256345
-256346
-12
+266636
+266637
+11
@@ -19010,57 +19000,57 @@
2
3
-158
+151
4
10
-24
+23
15
44
-24
+23
115
191
-24
+23
263
337
-24
+23
422
615
-24
+23
883
1209
-24
+23
1659
2596
-24
+23
4880
-13455
-24
+13467
+23
-35189
-74910
-24
+35263
+75722
+23
-256516
-256517
-12
+266807
+266808
+11
@@ -19076,57 +19066,57 @@
1
2
-158
+151
3
7
-24
+23
8
20
-24
+23
36
40
-24
+23
42
45
-24
+23
61
105
-24
+23
173
257
-24
+23
406
661
-24
+23
1178
2710
-24
+23
-7491
-16702
-24
+7492
+16795
+23
-135733
-135734
-12
+145286
+145287
+11
@@ -19142,22 +19132,22 @@
1
2
-1495095
+1547921
2
3
-199608
+193171
3
-13
-141671
+18
+144002
-13
-5275
-29491
+18
+5288
+21067
@@ -19173,22 +19163,22 @@
1
2
-1517195
+1569164
2
3
-187245
+181276
3
-17
-140893
+25
+143324
-17
-4798
-20532
+25
+4811
+12397
@@ -19204,12 +19194,12 @@
1
2
-1751170
+1795906
2
33
-114695
+110257
@@ -19219,15 +19209,15 @@
overrides
-161127
+159494
new
-126169
+124890
old
-15666
+15507
@@ -19241,12 +19231,12 @@
1
2
-91218
+90293
2
3
-34944
+34590
3
@@ -19267,37 +19257,37 @@
1
2
-8232
+8148
2
3
-2043
+2022
3
4
-883
+874
4
5
-1278
+1265
5
10
-1245
+1233
10
43
-1179
+1167
44
218
-804
+795
@@ -19307,19 +19297,19 @@
membervariables
-329658
+325582
id
-325099
+321201
type_id
-145086
+139772
name
-59068
+56776
@@ -19333,12 +19323,12 @@
1
2
-320637
+316912
2
7
-4461
+4288
@@ -19354,7 +19344,7 @@
1
2
-325099
+321201
@@ -19370,22 +19360,22 @@
1
2
-118391
+113949
2
3
-13396
+12934
3
11
-10989
+10656
11
-1212
-2309
+1715
+2231
@@ -19401,17 +19391,17 @@
1
2
-125916
+121310
2
3
-9883
+9511
3
266
-9287
+8950
@@ -19427,32 +19417,32 @@
1
2
-31217
+29971
2
3
-9056
+8705
3
4
-5944
+5725
4
6
-4485
+4311
6
15
-4534
+4358
15
-1317
-3829
+1953
+3704
@@ -19468,32 +19458,32 @@
1
2
-38256
+36736
2
3
-7524
+7232
3
4
-4035
+3891
4
7
-4765
+4592
7
-319
-4437
+291
+4264
-323
+318
605
-48
+58
@@ -19674,19 +19664,19 @@
localvariables
-527180
+521836
id
-527101
+521758
type_id
-48087
+47599
name
-76217
+75444
@@ -19700,12 +19690,12 @@
1
2
-527022
+521680
2
3
-79
+78
@@ -19721,7 +19711,7 @@
1
2
-527101
+521758
@@ -19737,32 +19727,32 @@
1
2
-26759
+26487
2
3
-6841
+6772
3
4
-2893
+2864
4
6
-4119
+4077
6
13
-3862
+3823
13
4908
-3611
+3575
@@ -19778,22 +19768,22 @@
1
2
-36072
+35706
2
3
-4969
+4919
3
5
-4323
+4279
5
1158
-2722
+2694
@@ -19809,32 +19799,32 @@
1
2
-43526
+43085
2
3
-13096
+12963
3
4
-5140
+5088
4
7
-6821
+6752
7
31
-5767
+5708
31
6112
-1865
+1846
@@ -19850,17 +19840,17 @@
1
2
-64564
+63910
2
3
-6472
+6406
3
819
-5180
+5127
@@ -19870,11 +19860,11 @@
autoderivation
-19759
+19559
var
-19759
+19559
derivation_type
@@ -19892,7 +19882,7 @@
1
2
-19759
+19559
@@ -19938,31 +19928,31 @@
enumconstants
-94487
+94097
id
-94487
+94097
parent
-7539
+8031
index
-7678
+7600
type_id
-7394
+7887
name
-73851
+73102
location
-76856
+76077
@@ -19976,7 +19966,7 @@
1
2
-94487
+94097
@@ -19992,7 +19982,7 @@
1
2
-94487
+94097
@@ -20008,7 +19998,7 @@
1
2
-94487
+94097
@@ -20024,7 +20014,7 @@
1
2
-94487
+94097
@@ -20040,7 +20030,7 @@
1
2
-94487
+94097
@@ -20056,47 +20046,47 @@
1
2
-1041
+1598
2
3
-830
+822
3
4
-2484
+2459
4
5
-586
+580
5
6
-586
+580
6
-8
-540
+9
+730
-8
-13
-659
+9
+16
+613
-13
-46
-573
+16
+392
+606
-46
+426
1166
-237
+39
@@ -20112,47 +20102,42 @@
1
2
-1041
+1598
2
3
-843
+835
3
4
-2530
+2505
4
5
-579
+574
5
6
-593
+587
6
-8
-527
+9
+704
-8
-13
-632
+9
+17
+626
-13
-49
-566
-
-
-50
+17
1166
-224
+600
@@ -20168,12 +20153,12 @@
1
2
-6788
+7287
2
3
-751
+743
@@ -20189,47 +20174,42 @@
1
2
-1041
+1598
2
3
-843
+835
3
4
-2530
+2505
4
5
-579
+574
5
6
-593
+587
6
-8
-527
+9
+704
-8
-13
-632
+9
+17
+626
-13
-49
-566
-
-
-50
+17
1166
-224
+600
@@ -20245,47 +20225,47 @@
1
2
-1080
+1637
2
3
-843
+835
3
4
-2484
+2459
4
5
-586
+580
5
6
-566
+561
6
-8
-514
+9
+704
-8
-13
-659
+9
+16
+613
-13
-46
-566
+16
+427
+606
-46
+466
1166
-237
+32
@@ -20301,47 +20281,47 @@
1
2
-2642
+2616
2
3
-942
+932
3
4
-935
+926
4
7
-579
+574
7
10
-698
+691
10
11
-355
+352
11
12
-560
+554
12
30
-606
+600
30
-1166
-355
+1253
+352
@@ -20357,47 +20337,47 @@
1
2
-2642
+2616
2
3
-942
+932
3
4
-935
+926
4
7
-579
+574
7
9
-685
+678
9
11
-369
+365
11
12
-560
+554
12
29
-606
+600
29
-1145
-355
+1232
+352
@@ -20413,47 +20393,47 @@
1
2
-2642
+2616
2
3
-942
+932
3
4
-935
+926
4
7
-579
+574
7
9
-685
+678
9
11
-369
+365
11
12
-560
+554
12
28
-606
+600
28
-1123
-355
+1210
+352
@@ -20469,47 +20449,47 @@
1
2
-2642
+2616
2
3
-942
+932
3
4
-935
+926
4
7
-579
+574
7
10
-698
+691
10
11
-355
+352
11
12
-560
+554
12
28
-606
+600
28
674
-355
+352
@@ -20525,47 +20505,47 @@
1
2
-2642
+2616
2
3
-942
+932
3
4
-935
+926
4
7
-579
+574
7
10
-698
+691
10
11
-355
+352
11
12
-560
+554
12
28
-606
+600
28
774
-355
+352
@@ -20581,47 +20561,47 @@
1
2
-1041
+1598
2
3
-810
+802
3
4
-2458
+2433
4
5
-566
+561
5
6
-566
+561
6
-8
-520
+9
+704
-8
-13
-639
+9
+16
+600
-13
-46
-560
+16
+470
+593
-46
+479
1166
-230
+32
@@ -20637,7 +20617,7 @@
1
2
-7388
+7881
137
@@ -20658,47 +20638,42 @@
1
2
-1041
+1598
2
3
-823
+815
3
4
-2504
+2479
4
5
-560
+554
5
6
-573
+567
6
-8
-507
+9
+678
-8
-13
-612
+9
+17
+613
-13
-51
-560
-
-
-52
+17
1166
-210
+580
@@ -20714,47 +20689,42 @@
1
2
-1041
+1598
2
3
-823
+815
3
4
-2504
+2479
4
5
-560
+554
5
6
-573
+567
6
-8
-507
+9
+678
-8
-13
-612
+9
+17
+613
-13
-51
-560
-
-
-52
+17
1166
-210
+580
@@ -20770,47 +20740,47 @@
1
2
-1080
+1637
2
3
-823
+815
3
4
-2458
+2433
4
5
-566
+561
5
6
-547
+541
6
-8
-494
+9
+678
-8
-13
-639
+9
+16
+600
-13
-47
-560
+16
+470
+593
-48
+621
1166
-224
+26
@@ -20826,17 +20796,17 @@
1
2
-66396
+65723
2
3
-6927
+6856
3
239
-527
+521
@@ -20852,17 +20822,17 @@
1
2
-67049
+66369
2
3
-6274
+6210
3
239
-527
+521
@@ -20878,12 +20848,12 @@
1
2
-68762
+68065
2
13
-5088
+5036
@@ -20899,17 +20869,17 @@
1
2
-61941
+61313
2
3
-11382
+11267
3
239
-527
+521
@@ -20925,12 +20895,12 @@
1
2
-71346
+70623
2
23
-2504
+2479
@@ -20946,12 +20916,12 @@
1
2
-71531
+70773
2
229
-5325
+5304
@@ -20967,12 +20937,12 @@
1
2
-71643
+70884
2
229
-5213
+5193
@@ -20988,12 +20958,12 @@
1
2
-73211
+72469
2
17
-3644
+3607
@@ -21009,17 +20979,17 @@
1
2
-66535
+65828
2
3
-10090
+9994
3
229
-230
+254
@@ -21035,12 +21005,12 @@
1
2
-76685
+75907
2
27
-171
+169
@@ -21050,31 +21020,31 @@
builtintypes
-559
+537
id
-559
+537
name
-559
+537
kind
-559
+537
size
-85
+81
sign
-36
+35
alignment
-60
+58
@@ -21088,7 +21058,7 @@
1
2
-559
+537
@@ -21104,7 +21074,7 @@
1
2
-559
+537
@@ -21120,7 +21090,7 @@
1
2
-559
+537
@@ -21136,7 +21106,7 @@
1
2
-559
+537
@@ -21152,7 +21122,7 @@
1
2
-559
+537
@@ -21168,7 +21138,7 @@
1
2
-559
+537
@@ -21184,7 +21154,7 @@
1
2
-559
+537
@@ -21200,7 +21170,7 @@
1
2
-559
+537
@@ -21216,7 +21186,7 @@
1
2
-559
+537
@@ -21232,7 +21202,7 @@
1
2
-559
+537
@@ -21248,7 +21218,7 @@
1
2
-559
+537
@@ -21264,7 +21234,7 @@
1
2
-559
+537
@@ -21280,7 +21250,7 @@
1
2
-559
+537
@@ -21296,7 +21266,7 @@
1
2
-559
+537
@@ -21312,7 +21282,7 @@
1
2
-559
+537
@@ -21328,37 +21298,37 @@
1
2
-12
+11
2
3
-12
+11
4
5
-12
+11
6
7
-12
+11
9
10
-12
+11
11
12
-12
+11
13
14
-12
+11
@@ -21374,37 +21344,37 @@
1
2
-12
+11
2
3
-12
+11
4
5
-12
+11
6
7
-12
+11
9
10
-12
+11
11
12
-12
+11
13
14
-12
+11
@@ -21420,37 +21390,37 @@
1
2
-12
+11
2
3
-12
+11
4
5
-12
+11
6
7
-12
+11
9
10
-12
+11
11
12
-12
+11
13
14
-12
+11
@@ -21466,12 +21436,12 @@
1
2
-24
+23
3
4
-60
+58
@@ -21487,12 +21457,12 @@
1
2
-60
+58
2
3
-24
+23
@@ -21508,17 +21478,17 @@
6
7
-12
+11
12
13
-12
+11
28
29
-12
+11
@@ -21534,17 +21504,17 @@
6
7
-12
+11
12
13
-12
+11
28
29
-12
+11
@@ -21560,17 +21530,17 @@
6
7
-12
+11
12
13
-12
+11
28
29
-12
+11
@@ -21586,12 +21556,12 @@
5
6
-24
+23
7
8
-12
+11
@@ -21607,7 +21577,7 @@
5
6
-36
+35
@@ -21623,27 +21593,27 @@
4
5
-12
+11
7
8
-12
+11
10
11
-12
+11
12
13
-12
+11
13
14
-12
+11
@@ -21659,27 +21629,27 @@
4
5
-12
+11
7
8
-12
+11
10
11
-12
+11
12
13
-12
+11
13
14
-12
+11
@@ -21695,27 +21665,27 @@
4
5
-12
+11
7
8
-12
+11
10
11
-12
+11
12
13
-12
+11
13
14
-12
+11
@@ -21731,12 +21701,12 @@
1
2
-12
+11
2
3
-48
+46
@@ -21752,7 +21722,7 @@
3
4
-60
+58
@@ -21762,23 +21732,23 @@
derivedtypes
-4572495
+4651908
id
-4572495
+4651908
name
-2240442
+2328554
kind
-97
+93
type_id
-2743147
+2780308
@@ -21792,7 +21762,7 @@
1
2
-4572495
+4651908
@@ -21808,7 +21778,7 @@
1
2
-4572495
+4651908
@@ -21824,7 +21794,7 @@
1
2
-4572495
+4651908
@@ -21840,17 +21810,17 @@
1
2
-1640327
+1709696
2
3
-479376
+500222
3
-42612
-120737
+43371
+118634
@@ -21866,12 +21836,12 @@
1
2
-2240417
+2328530
2
3
-24
+23
@@ -21887,17 +21857,17 @@
1
2
-1640607
+1709965
2
3
-479097
+499954
3
-42594
-120737
+43353
+118634
@@ -21913,42 +21883,42 @@
21
22
-12
+11
61
62
-12
+11
2051
2052
-12
+11
-25122
-25123
-12
+27346
+27347
+11
-42664
-42665
-12
+43423
+43424
+11
-53936
-53937
-12
+58521
+58522
+11
-97759
-97760
-12
+102765
+102766
+11
-154522
-154523
-12
+163929
+163930
+11
@@ -21964,42 +21934,42 @@
1
2
-12
+11
13
14
-12
+11
38
39
-12
+11
1152
1153
-12
+11
-13367
-13368
-12
+15027
+15028
+11
-36098
-36099
-12
+39331
+39332
+11
-50248
-50249
-12
+53789
+53790
+11
-83386
-83387
-12
+89933
+89934
+11
@@ -22015,42 +21985,42 @@
12
13
-12
+11
21
22
-12
+11
969
970
-12
+11
-25122
-25123
-12
+27346
+27347
+11
-42664
-42665
-12
+43423
+43424
+11
-53936
-53937
-12
+58521
+58522
+11
-97431
-97432
-12
+102434
+102435
+11
-154522
-154523
-12
+163929
+163930
+11
@@ -22066,22 +22036,22 @@
1
2
-1661856
+1683160
2
3
-405550
+392781
3
4
-615674
+646083
4
202
-60064
+58283
@@ -22097,22 +22067,22 @@
1
2
-1663206
+1684457
2
3
-405380
+392618
3
4
-614495
+644949
4
198
-60064
+58283
@@ -22128,22 +22098,22 @@
1
2
-1663534
+1684784
2
3
-406814
+393985
3
4
-614446
+644902
4
7
-58350
+56635
@@ -22153,19 +22123,19 @@
pointerishsize
-3358396
+3426426
id
-3358396
+3426426
size
-24
+23
alignment
-12
+11
@@ -22179,7 +22149,7 @@
1
2
-3358396
+3426426
@@ -22195,7 +22165,7 @@
1
2
-3358396
+3426426
@@ -22211,12 +22181,12 @@
21
22
-12
+11
-276244
-276245
-12
+293219
+293220
+11
@@ -22232,7 +22202,7 @@
1
2
-24
+23
@@ -22246,9 +22216,9 @@
12
-276265
-276266
-12
+293240
+293241
+11
@@ -22264,7 +22234,7 @@
2
3
-12
+11
@@ -22274,23 +22244,23 @@
arraysizes
-18830
+18099
id
-18830
+18099
num_elements
-2394
+2301
bytesize
-2783
+2675
alignment
-85
+81
@@ -22304,7 +22274,7 @@
1
2
-18830
+18099
@@ -22320,7 +22290,7 @@
1
2
-18830
+18099
@@ -22336,7 +22306,7 @@
1
2
-18830
+18099
@@ -22352,37 +22322,37 @@
1
2
-182
+175
2
3
-1422
+1367
3
4
-85
+81
4
5
-182
+175
5
13
-182
+175
13
25
-182
+175
38
116
-158
+151
@@ -22398,27 +22368,27 @@
1
2
-1762
+1694
2
3
-243
+233
3
4
-133
+128
4
6
-182
+175
6
11
-72
+70
@@ -22434,27 +22404,27 @@
1
2
-1774
+1705
2
3
-255
+245
3
4
-158
+151
4
7
-182
+175
7
8
-24
+23
@@ -22470,42 +22440,42 @@
1
2
-170
+163
2
3
-1556
+1495
3
4
-133
+128
4
6
-218
+210
6
9
-218
+210
9
17
-218
+210
17
53
-218
+210
55
75
-48
+46
@@ -22521,22 +22491,22 @@
1
2
-2115
+2033
2
3
-389
+373
3
6
-243
+233
6
7
-36
+35
@@ -22552,22 +22522,22 @@
1
2
-2176
+2091
2
3
-303
+292
3
5
-255
+245
5
7
-48
+46
@@ -22583,37 +22553,37 @@
17
18
-12
+11
18
19
-12
+11
33
34
-12
+11
50
51
-12
+11
181
182
-12
+11
389
390
-12
+11
861
862
-12
+11
@@ -22629,37 +22599,37 @@
4
5
-12
+11
5
6
-12
+11
13
14
-12
+11
16
17
-12
+11
39
40
-12
+11
40
41
-12
+11
190
191
-12
+11
@@ -22675,37 +22645,37 @@
1
2
-12
+11
2
3
-12
+11
14
15
-12
+11
17
18
-12
+11
41
42
-12
+11
53
54
-12
+11
191
192
-12
+11
@@ -22715,15 +22685,15 @@
typedefbase
-1919913
+1867884
id
-1919913
+1867884
type_id
-899600
+871937
@@ -22737,7 +22707,7 @@
1
2
-1919913
+1867884
@@ -22753,22 +22723,22 @@
1
2
-698168
+676919
2
3
-93312
+90264
3
6
-72975
+70856
6
-5423
-35144
+5485
+33897
@@ -22778,23 +22748,23 @@
decltypes
-45841
+44063
id
-45841
+44063
expr
-43325
+41644
base_type
-6479
+6227
parentheses_would_change_meaning
-24
+23
@@ -22808,7 +22778,7 @@
1
2
-45841
+44063
@@ -22824,7 +22794,7 @@
1
2
-45841
+44063
@@ -22840,7 +22810,7 @@
1
2
-45841
+44063
@@ -22856,12 +22826,12 @@
1
2
-40809
+39225
2
3
-2516
+2418
@@ -22877,12 +22847,12 @@
1
2
-40809
+39225
2
3
-2516
+2418
@@ -22898,7 +22868,7 @@
1
2
-43325
+41644
@@ -22914,17 +22884,17 @@
1
2
-3622
+3482
2
3
-2552
+2453
3
277
-303
+292
@@ -22940,22 +22910,22 @@
1
2
-2540
+2442
2
3
-3282
+3154
3
12
-522
+502
13
2445
-133
+128
@@ -22971,7 +22941,7 @@
1
2
-6479
+6227
@@ -22987,12 +22957,12 @@
8
9
-12
+11
1082
1083
-12
+11
@@ -23008,12 +22978,12 @@
8
9
-12
+11
3556
3557
-12
+11
@@ -23029,12 +22999,12 @@
8
9
-12
+11
525
526
-12
+11
@@ -23044,19 +23014,19 @@
usertypes
-4363319
+4337028
id
-4363319
+4337028
name
-899429
+917472
kind
-133
+128
@@ -23070,7 +23040,7 @@
1
2
-4363319
+4337028
@@ -23086,7 +23056,7 @@
1
2
-4363319
+4337028
@@ -23102,22 +23072,22 @@
1
2
-596127
+606962
2
3
-199888
+203676
3
8
-67589
+69886
8
-31201
-35824
+32070
+36947
@@ -23133,12 +23103,12 @@
1
2
-842355
+861619
2
10
-57074
+55852
@@ -23154,57 +23124,57 @@
23
24
-12
+11
372
373
-12
+11
773
774
-12
+11
-1526
-1527
-12
+1856
+1857
+11
-4123
-4124
-12
+4195
+4196
+11
14604
14605
-12
+11
-17528
-17529
-12
+17544
+17545
+11
-20287
-20288
-12
+20425
+20426
+11
-75247
-75248
-12
+75551
+75552
+11
-81118
-81119
-12
+90575
+90576
+11
-143330
-143331
-12
+145253
+145254
+11
@@ -23220,52 +23190,52 @@
16
17
-12
+11
38
39
-24
+23
404
405
-12
+11
548
549
-12
+11
-776
-777
-12
+777
+778
+11
-2846
-2847
-12
+2848
+2849
+11
4545
4546
-12
+11
-9121
-9122
-12
+9129
+9130
+11
11659
11660
-12
+11
-49218
-49219
-12
+53824
+53825
+11
@@ -23275,19 +23245,19 @@
usertypesize
-1364814
+1420908
id
-1364814
+1420908
size
-1641
+1577
alignment
-97
+93
@@ -23301,7 +23271,7 @@
1
2
-1364814
+1420908
@@ -23317,7 +23287,7 @@
1
2
-1364814
+1420908
@@ -23333,52 +23303,52 @@
1
2
-474
+455
2
3
-218
+210
3
4
-72
+70
4
5
-109
+105
5
8
-121
+116
8
12
-109
+105
12
16
-133
+128
16
36
-133
+128
37
170
-133
+128
260
-86086
-133
+95028
+128
@@ -23394,17 +23364,17 @@
1
2
-1349
+1297
2
3
-194
+186
3
6
-97
+93
@@ -23420,42 +23390,42 @@
1
2
-12
+11
3
4
-12
+11
7
8
-12
+11
50
51
-12
+11
54
55
-12
+11
-1916
-1917
-12
+2246
+2247
+11
-9656
-9657
-12
+9717
+9718
+11
-100584
-100585
-12
+109526
+109527
+11
@@ -23471,37 +23441,37 @@
1
2
-24
+23
3
4
-12
+11
8
9
-12
+11
12
13
-12
+11
17
18
-12
+11
25
26
-12
+11
106
107
-12
+11
@@ -23511,26 +23481,26 @@
usertype_final
-1331
+1317
id
-1331
+1317
usertype_uuid
-4897
+4847
id
-4897
+4847
uuid
-4897
+4847
@@ -23544,7 +23514,7 @@
1
2
-4897
+4847
@@ -23560,7 +23530,7 @@
1
2
-4897
+4847
@@ -23570,15 +23540,15 @@
mangled_name
-4359684
+4333558
id
-4359684
+4333558
mangled_name
-532986
+514256
@@ -23592,7 +23562,7 @@
1
2
-4359684
+4333558
@@ -23608,32 +23578,32 @@
1
2
-325269
+310895
2
3
-68246
+66497
3
4
-35958
+35217
4
-8
-45307
+7
+39225
-8
-34
-40237
+7
+23
+38664
-34
-8470
-17967
+23
+8589
+23755
@@ -23643,59 +23613,59 @@
is_pod_class
-1041477
+1104649
id
-1041477
+1104649
is_standard_layout_class
-1118962
+1180366
id
-1118962
+1180366
is_complete
-1345984
+1398952
id
-1345984
+1398952
is_class_template
-246617
+238660
id
-246617
+238660
class_instantiation
-1108921
+1176522
to
-1107195
+1174863
from
-72513
+72363
@@ -23709,12 +23679,12 @@
1
2
-1105566
+1173297
2
4
-1628
+1565
@@ -23730,47 +23700,47 @@
1
2
-21601
+21289
2
3
-12897
+12771
3
4
-7488
+7314
4
5
-4789
+4942
5
7
-5871
+5994
7
11
-6503
+6438
11
20
-5555
+5585
20
-89
-5470
+87
+5456
-89
-2079
-2334
+87
+3629
+2570
@@ -23780,19 +23750,19 @@
class_template_argument
-2800063
+3135757
type_id
-1339675
+1428725
index
-1361
+1308
arg_type
-921287
+904899
@@ -23806,27 +23776,27 @@
1
2
-593732
+586000
2
3
-438105
+428957
3
4
-175599
+258501
4
7
-108629
+129501
7
113
-23607
+25764
@@ -23842,22 +23812,22 @@
1
2
-619710
+613658
2
3
-445691
+442173
3
4
-187999
+272382
4
113
-86274
+100511
@@ -23873,37 +23843,37 @@
1
2
-12
+11
2
3
-863
+829
3
26
-109
+105
29
64
-109
+105
69
-427
-109
+435
+105
-594
-8438
-109
+616
+9263
+105
-11951
-101100
-48
+13601
+119714
+46
@@ -23919,37 +23889,37 @@
1
2
-12
+11
2
3
-863
+829
3
14
-121
+116
14
26
-109
+105
29
-147
-109
+148
+105
-191
-3560
-109
+198
+3591
+105
-11321
-39550
-36
+11582
+41130
+35
@@ -23965,22 +23935,27 @@
1
2
-571096
+550198
2
3
-205784
+200100
3
-5
-75369
+4
+54918
-5
-5259
-69036
+4
+10
+70727
+
+
+10
+11421
+28954
@@ -23996,17 +23971,253 @@
1
2
-805922
+786767
2
3
-96011
+98069
3
22
-19353
+20062
+
+
+
+
+
+
+
+
+class_template_argument_value
+362635
+
+
+type_id
+233565
+
+
+index
+163
+
+
+arg_value
+345447
+
+
+
+
+type_id
+index
+
+
+12
+
+
+1
+2
+209845
+
+
+2
+3
+14512
+
+
+3
+14
+9207
+
+
+
+
+
+
+type_id
+arg_value
+
+
+12
+
+
+1
+2
+197436
+
+
+2
+3
+17971
+
+
+3
+22
+17527
+
+
+24
+173
+630
+
+
+
+
+
+
+index
+type_id
+
+
+12
+
+
+8
+9
+58
+
+
+20
+21
+11
+
+
+25
+26
+11
+
+
+206
+207
+11
+
+
+389
+390
+11
+
+
+552
+553
+11
+
+
+1312
+1313
+11
+
+
+5393
+5394
+11
+
+
+5423
+5424
+11
+
+
+9668
+9669
+11
+
+
+
+
+
+
+index
+arg_value
+
+
+12
+
+
+8
+9
+58
+
+
+20
+21
+11
+
+
+42
+43
+11
+
+
+311
+312
+11
+
+
+514
+515
+11
+
+
+715
+716
+11
+
+
+1585
+1586
+11
+
+
+6302
+6303
+11
+
+
+8160
+8161
+11
+
+
+11875
+11876
+11
+
+
+
+
+
+
+arg_value
+type_id
+
+
+12
+
+
+1
+2
+328387
+
+
+2
+4
+17059
+
+
+
+
+
+
+arg_value
+index
+
+
+12
+
+
+1
+2
+345447
@@ -24016,15 +24227,15 @@
is_proxy_class_for
-50120
+49017
id
-50120
+49017
templ_param_id
-50120
+49017
@@ -24038,7 +24249,7 @@
1
2
-50120
+49017
@@ -24054,7 +24265,7 @@
1
2
-50120
+49017
@@ -24064,19 +24275,19 @@
type_mentions
-1699359
+1682135
id
-1699359
+1682135
type_id
-68077
+67387
location
-1668455
+1651543
kind
@@ -24094,7 +24305,7 @@
1
2
-1699359
+1682135
@@ -24110,7 +24321,7 @@
1
2
-1699359
+1682135
@@ -24126,7 +24337,7 @@
1
2
-1699359
+1682135
@@ -24142,37 +24353,37 @@
1
2
-30463
+30154
2
3
-12463
+12337
3
4
-3684
+3646
4
7
-6142
+6080
7
13
-5213
+5160
13
35
-5259
+5206
35
9490
-4850
+4801
@@ -24188,37 +24399,37 @@
1
2
-30463
+30154
2
3
-12463
+12337
3
4
-3684
+3646
4
7
-6142
+6080
7
13
-5213
+5160
13
35
-5259
+5206
35
9490
-4850
+4801
@@ -24234,12 +24445,12 @@
1
2
-66818
+66141
2
3
-1258
+1246
@@ -24255,12 +24466,12 @@
1
2
-1637892
+1621291
2
5
-30562
+30252
@@ -24276,12 +24487,12 @@
1
2
-1637892
+1621291
2
5
-30562
+30252
@@ -24297,7 +24508,7 @@
1
2
-1668455
+1651543
@@ -24370,26 +24581,26 @@
is_function_template
-1058083
+1023581
id
-1058083
+1023581
function_instantiation
-739463
+719194
to
-739463
+719194
from
-136103
+134923
@@ -24403,7 +24614,7 @@
1
2
-739463
+719194
@@ -24419,37 +24630,32 @@
1
2
-63018
+64125
2
3
-32396
+31385
3
4
-8193
+7898
4
-5
-9299
+6
+12467
-5
-10
-10940
+6
+15
+10434
-10
-57
-10223
-
-
-58
+15
645
-2030
+8611
@@ -24459,19 +24665,19 @@
function_template_argument
-1910796
+1981225
function_id
-1112422
+1088560
index
-243
+233
arg_type
-369847
+359386
@@ -24485,22 +24691,22 @@
1
2
-634796
+600045
2
3
-361033
+302330
3
-5
-84645
+4
+131242
-5
+4
21
-31947
+54941
@@ -24516,22 +24722,22 @@
1
2
-657966
+618530
2
3
-332393
+293520
3
-5
-90905
+4
+116683
-5
+4
21
-31156
+59825
@@ -24547,102 +24753,102 @@
4
5
-12
+11
7
8
-12
+11
17
18
-12
+11
39
40
-12
+11
65
66
-12
+11
152
153
-12
+11
-238
-239
-12
+241
+242
+11
-325
-326
-12
+328
+329
+11
-422
-423
-12
+425
+426
+11
-520
-521
-12
+523
+524
+11
-754
-755
-12
+758
+759
+11
-1007
-1008
-12
+1011
+1012
+11
-1259
-1260
-12
+1520
+1521
+11
-1514
-1515
-12
+1701
+1702
+11
-2559
-2560
-12
+2566
+2567
+11
-2804
-2805
-12
+2917
+2918
+11
-4818
-4819
-12
+5686
+5687
+11
-13309
-13310
-12
+17602
+17603
+11
-40569
-40570
-12
+42858
+42859
+11
-84931
-84932
-12
+88286
+88287
+11
@@ -24658,102 +24864,102 @@
4
5
-12
+11
7
8
-12
+11
14
15
-12
+11
22
23
-12
+11
32
33
-12
+11
54
55
-12
+11
-57
-58
-12
+60
+61
+11
-61
-62
-12
+62
+63
+11
-75
-76
-12
+78
+79
+11
-90
-91
-12
+91
+92
+11
-137
-138
-12
+140
+141
+11
214
215
-12
+11
-238
-239
-12
+242
+243
+11
-316
-317
-12
+317
+318
+11
-517
-518
-12
+521
+522
+11
-695
-696
-12
+700
+701
+11
-1468
-1469
-12
+1491
+1492
+11
-3652
-3653
-12
+3698
+3699
+11
-8773
-8774
-12
+8798
+8799
+11
-17388
-17389
-12
+17653
+17654
+11
@@ -24769,27 +24975,27 @@
1
2
-249547
+242738
2
3
-48698
+46902
3
6
-29783
+28756
6
-19
-27996
+20
+27704
-19
-906
-13821
+20
+1989
+13285
@@ -24805,17 +25011,238 @@
1
2
-341230
+331740
2
5
-28129
+27131
5
-10
-486
+12
+514
+
+
+
+
+
+
+
+
+function_template_argument_value
+209892
+
+
+function_id
+113037
+
+
+index
+163
+
+
+arg_value
+181755
+
+
+
+
+function_id
+index
+
+
+12
+
+
+1
+2
+107207
+
+
+2
+14
+5830
+
+
+
+
+
+
+function_id
+arg_value
+
+
+12
+
+
+1
+2
+89610
+
+
+2
+3
+17106
+
+
+3
+113
+6321
+
+
+
+
+
+
+index
+function_id
+
+
+12
+
+
+3
+4
+70
+
+
+5
+6
+11
+
+
+6
+7
+11
+
+
+111
+112
+11
+
+
+441
+442
+11
+
+
+857
+858
+11
+
+
+2136
+2137
+11
+
+
+2428
+2429
+11
+
+
+4217
+4218
+11
+
+
+
+
+
+
+index
+arg_value
+
+
+12
+
+
+5
+6
+70
+
+
+7
+8
+11
+
+
+8
+9
+11
+
+
+157
+158
+11
+
+
+405
+406
+11
+
+
+973
+974
+11
+
+
+2523
+2524
+11
+
+
+4848
+4849
+11
+
+
+6604
+6605
+11
+
+
+
+
+
+
+arg_value
+function_id
+
+
+12
+
+
+1
+2
+153712
+
+
+2
+3
+27949
+
+
+3
+4
+93
+
+
+
+
+
+
+arg_value
+index
+
+
+12
+
+
+1
+2
+181755
@@ -24825,26 +25252,26 @@
is_variable_template
-19778
+19011
id
-19778
+19011
variable_instantiation
-31837
+38057
to
-31837
+38057
from
-6734
+6929
@@ -24858,7 +25285,7 @@
1
2
-31837
+38057
@@ -24874,37 +25301,37 @@
1
2
-2382
+2383
2
3
-2030
+2033
3
4
-449
+432
4
5
-692
+782
5
9
-534
+560
9
-29
-534
+21
+525
-42
-214
-109
+24
+286
+210
@@ -24914,11 +25341,11 @@
variable_template_argument
-5529
+5499
variable_id
-843
+848
index
@@ -24926,7 +25353,7 @@
arg_type
-4257
+4214
@@ -24940,12 +25367,12 @@
1
2
-692
+685
2
3
-112
+123
3
@@ -24966,12 +25393,12 @@
1
2
-369
+371
2
3
-125
+130
3
@@ -24981,12 +25408,12 @@
4
6
-72
+71
6
8
-72
+71
8
@@ -25025,13 +25452,13 @@
6
-9
-10
+10
+11
6
-17
-18
+20
+21
6
@@ -25066,8 +25493,8 @@
6
-137
-138
+139
+140
6
@@ -25089,17 +25516,17 @@
1
2
-3532
+3490
2
3
-481
+476
3
11
-243
+247
@@ -25115,12 +25542,148 @@
1
2
-4046
+3999
+
+
+2
+4
+215
+
+
+
+
+
+
+
+
+variable_template_argument_value
+137
+
+
+variable_id
+19
+
+
+index
+13
+
+
+arg_value
+137
+
+
+
+
+variable_id
+index
+
+
+12
+
+
+1
+2
+13
2
3
-210
+6
+
+
+
+
+
+
+variable_id
+arg_value
+
+
+12
+
+
+3
+4
+13
+
+
+15
+16
+6
+
+
+
+
+
+
+index
+variable_id
+
+
+12
+
+
+1
+2
+6
+
+
+3
+4
+6
+
+
+
+
+
+
+index
+arg_value
+
+
+12
+
+
+6
+7
+6
+
+
+15
+16
+6
+
+
+
+
+
+
+arg_value
+variable_id
+
+
+12
+
+
+1
+2
+137
+
+
+
+
+
+
+arg_value
+index
+
+
+12
+
+
+1
+2
+137
@@ -25130,15 +25693,15 @@
routinetypes
-444572
+436132
id
-444572
+436132
return_type
-184814
+178086
@@ -25152,7 +25715,7 @@
1
2
-444572
+436132
@@ -25168,22 +25731,22 @@
1
2
-148344
+142985
2
3
-21030
+20191
3
-18
-13943
+17
+13367
-18
-7709
-1495
+17
+8001
+1542
@@ -25193,19 +25756,19 @@
routinetypeargs
-741201
+726544
routine
-362760
+357377
index
-389
+373
type_id
-209394
+208724
@@ -25219,27 +25782,27 @@
1
2
-169412
+166448
2
3
-95355
+96574
3
4
-58144
+55888
4
6
-31351
+30298
6
33
-8497
+8167
@@ -25255,22 +25818,22 @@
1
2
-194831
+190916
2
3
-95853
+97018
3
4
-49707
+47778
4
22
-22367
+21663
@@ -25286,62 +25849,62 @@
1
2
-133
+128
2
7
-24
+23
10
16
-24
+23
19
33
-24
+23
52
74
-24
+23
93
115
-24
+23
139
199
-24
+23
269
364
-24
+23
473
700
-24
+23
1319
-3279
-24
+3293
+23
-8061
-15906
-24
+8075
+16341
+23
-29841
-29842
-12
+30585
+30586
+11
@@ -25357,62 +25920,62 @@
1
2
-133
+128
2
5
-24
+23
6
10
-24
+23
11
22
-24
+23
33
37
-24
+23
38
42
-24
+23
44
83
-24
+23
124
183
-24
+23
248
346
-24
+23
463
950
-24
+23
-2463
-5546
-24
+2464
+5642
+23
-12306
-12307
-12
+12850
+12851
+11
@@ -25428,27 +25991,27 @@
1
2
-123691
+124231
2
3
-40869
+41258
3
4
-13505
+13016
4
7
-17942
+17293
7
-1097
-13384
+1099
+12923
@@ -25464,17 +26027,17 @@
1
2
-156830
+158176
2
3
-41161
+39576
3
33
-11402
+10971
@@ -25484,19 +26047,19 @@
ptrtomembers
-12180
+13227
id
-12180
+13227
type_id
-10247
+10013
class_id
-5519
+6601
@@ -25510,7 +26073,7 @@
1
2
-12180
+13227
@@ -25526,7 +26089,7 @@
1
2
-12180
+13227
@@ -25542,12 +26105,12 @@
1
2
-9895
+9628
2
-65
-352
+100
+385
@@ -25563,12 +26126,12 @@
1
2
-9895
+9628
2
-65
-352
+100
+385
@@ -25584,22 +26147,22 @@
1
2
-4619
+5573
2
-7
-352
+3
+490
8
-9
-461
+17
+502
-16
+64
65
-85
+35
@@ -25615,22 +26178,22 @@
1
2
-4619
+5573
2
-7
-352
+3
+490
8
-9
-461
+17
+502
-16
+64
65
-85
+35
@@ -25640,15 +26203,15 @@
specifiers
-547
+525
id
-547
+525
str
-547
+525
@@ -25662,7 +26225,7 @@
1
2
-547
+525
@@ -25678,7 +26241,7 @@
1
2
-547
+525
@@ -25688,15 +26251,15 @@
typespecifiers
-1464874
+1479986
type_id
-1460193
+1472695
spec_id
-85
+81
@@ -25710,12 +26273,12 @@
1
2
-1455513
+1465403
2
3
-4680
+7291
@@ -25731,37 +26294,37 @@
102
103
-12
+11
222
223
-12
+11
518
519
-12
+11
-718
-719
-12
+957
+958
+11
2323
2324
-12
+11
-19328
-19329
-12
+20241
+20242
+11
-97291
-97292
-12
+102297
+102298
+11
@@ -25771,15 +26334,15 @@
funspecifiers
-11370456
+11412148
func_id
-3511992
+3500391
spec_id
-194
+186
@@ -25793,27 +26356,27 @@
1
2
-342616
+329999
2
3
-464083
+448167
3
4
-909155
+883458
4
5
-1670402
+1717910
5
8
-125733
+120855
@@ -25829,82 +26392,82 @@
22
23
-12
+11
169
170
-12
+11
491
492
-12
+11
-506
-507
-12
+598
+599
+11
632
633
-12
+11
5650
5651
-12
+11
9530
9531
-12
+11
10451
10452
-12
+11
-11821
-11822
-12
+11834
+11835
+11
14848
14849
-12
+11
-25330
-25331
-12
+26196
+26197
+11
-33532
-33533
-12
+33724
+33725
+11
-122462
-122463
-12
+131801
+131802
+11
-204591
-204592
-12
+214925
+214926
+11
-232301
-232302
-12
+242884
+242885
+11
-263009
-263010
-12
+272918
+272919
+11
@@ -25914,11 +26477,11 @@
varspecifiers
-1124158
+1113938
var_id
-935091
+926194
spec_id
@@ -25936,17 +26499,17 @@
1
2
-795258
+787198
2
3
-92279
+91911
3
5
-47553
+47084
@@ -25980,13 +26543,13 @@
6
-8409
-8410
+8411
+8412
6
-8751
-8752
+8753
+8754
6
@@ -25995,13 +26558,13 @@
6
-13352
-13353
+13439
+13440
6
-42323
-42324
+42412
+42413
6
@@ -26590,11 +27153,11 @@
attribute_args
-118319
+118389
id
-118319
+118389
kind
@@ -26602,7 +27165,7 @@
attribute
-116952
+117020
index
@@ -26610,7 +27173,7 @@
location
-58256
+58290
@@ -26624,7 +27187,7 @@
1
2
-118319
+118389
@@ -26640,7 +27203,7 @@
1
2
-118319
+118389
@@ -26656,7 +27219,7 @@
1
2
-118319
+118389
@@ -26672,7 +27235,7 @@
1
2
-118319
+118389
@@ -26772,12 +27335,12 @@
1
2
-116132
+116200
2
4
-819
+820
@@ -26793,7 +27356,7 @@
1
2
-116431
+116499
2
@@ -26814,12 +27377,12 @@
1
2
-116132
+116200
2
4
-819
+820
@@ -26835,7 +27398,7 @@
1
2
-116137
+116205
2
@@ -26955,22 +27518,22 @@
1
2
-28468
+28485
2
3
-7516
+7521
3
4
-19458
+19469
4
25
-2812
+2814
@@ -26986,12 +27549,12 @@
1
2
-52020
+52051
2
3
-6235
+6239
@@ -27007,22 +27570,22 @@
1
2
-28452
+28469
2
3
-7534
+7539
3
4
-19454
+19466
4
25
-2814
+2815
@@ -27038,7 +27601,7 @@
1
2
-58250
+58285
3
@@ -27053,15 +27616,15 @@
attribute_arg_value
-118292
+118362
arg
-118292
+118362
value
-2257
+2258
@@ -27075,7 +27638,7 @@
1
2
-118292
+118362
@@ -27091,7 +27654,7 @@
1
2
-1808
+1809
2
@@ -27116,15 +27679,15 @@
attribute_arg_type
-60
+58
arg
-60
+58
type_id
-36
+35
@@ -27138,7 +27701,7 @@
1
2
-60
+58
@@ -27154,12 +27717,12 @@
1
2
-12
+11
2
3
-24
+23
@@ -27222,15 +27785,15 @@
typeattributes
-12119
+12701
type_id
-10831
+11462
spec_id
-12119
+12701
@@ -27244,12 +27807,12 @@
1
2
-10296
+10948
2
34
-534
+514
@@ -27265,7 +27828,7 @@
1
2
-12119
+12701
@@ -27275,15 +27838,15 @@
funcattributes
-327044
+314529
func_id
-174943
+168330
spec_id
-327044
+314529
@@ -27297,22 +27860,22 @@
1
2
-94078
+90603
2
3
-13554
+13028
3
4
-65134
+62606
4
14
-2176
+2091
@@ -27328,7 +27891,7 @@
1
2
-327044
+314529
@@ -27444,15 +28007,15 @@
unspecifiedtype
-9406353
+9451546
type_id
-9406353
+9451546
unspecified_type_id
-5062897
+5133540
@@ -27466,7 +28029,7 @@
1
2
-9406353
+9451546
@@ -27482,22 +28045,17 @@
1
2
-2733810
+2776289
2
3
-1943594
+1978655
3
-30
-379779
-
-
-30
-7873
-5713
+7936
+378596
@@ -27507,19 +28065,19 @@
member
-5112192
+5066844
parent
-809800
+833190
index
-2966
+2851
child
-5095258
+5050544
@@ -27533,47 +28091,47 @@
1
2
-46948
+45126
2
3
-191658
+219789
3
4
-208336
+209109
4
5
-90285
+90638
5
7
-65073
+67210
7
9
-67212
+65539
9
15
-68221
+66497
15
-39
-62471
+45
+62758
-39
+45
245
-9591
+6520
@@ -27589,47 +28147,47 @@
1
2
-46218
+44425
2
3
-191719
+219824
3
4
-202769
+203723
4
5
-93154
+93454
5
7
-65766
+67876
7
9
-67346
+65668
9
15
-68999
+67245
15
-38
-61462
+41
+62641
-38
+41
281
-12363
+8331
@@ -27645,62 +28203,62 @@
1
2
-547
+525
2
5
-267
+257
5
9
-255
+245
9
18
-230
+222
23
100
-230
+222
122
186
-230
+222
188
293
-230
+222
296
374
-230
+222
375
542
-230
+222
572
3257
-230
+222
3427
-21556
-230
+22111
+222
-29162
-65993
-48
+30337
+70680
+46
@@ -27716,62 +28274,62 @@
1
2
-534
+514
2
5
-218
+210
5
7
-230
+222
7
13
-230
+222
13
70
-230
+222
71
160
-230
+222
160
256
-230
+222
263
345
-230
+222
346
476
-243
+233
492
1685
-230
+222
1926
-8765
-230
+8775
+222
-10213
-66838
-121
+10226
+71530
+116
@@ -27787,7 +28345,7 @@
1
2
-5095258
+5050544
@@ -27803,12 +28361,12 @@
1
2
-5078555
+5034466
2
7
-16702
+16078
@@ -27818,15 +28376,15 @@
enclosingfunction
-131751
+127164
child
-131751
+127164
parent
-74239
+71639
@@ -27840,7 +28398,7 @@
1
2
-131751
+127164
@@ -27856,27 +28414,27 @@
1
2
-39240
+37811
2
3
-21930
+21231
3
4
-7208
+6952
4
6
-5652
+5445
6
45
-206
+198
@@ -27886,27 +28444,27 @@
derivations
-370309
+392220
derivation
-370309
+392220
sub
-346555
+367484
index
-72
+70
super
-237840
+236475
location
-96351
+92613
@@ -27920,7 +28478,7 @@
1
2
-370309
+392220
@@ -27936,7 +28494,7 @@
1
2
-370309
+392220
@@ -27952,7 +28510,7 @@
1
2
-370309
+392220
@@ -27968,7 +28526,7 @@
1
2
-370309
+392220
@@ -27984,12 +28542,12 @@
1
2
-326108
+345926
2
7
-20447
+21558
@@ -28005,12 +28563,12 @@
1
2
-334933
+356161
2
7
-11621
+11322
@@ -28026,12 +28584,12 @@
1
2
-326120
+345937
2
7
-20434
+21546
@@ -28047,12 +28605,12 @@
1
2
-334921
+356150
2
7
-11633
+11334
@@ -28068,32 +28626,32 @@
1
2
-12
+11
4
5
-12
+11
44
45
-12
+11
220
221
-12
+11
-957
-958
-12
+970
+971
+11
-29236
-29237
-12
+32328
+32329
+11
@@ -28109,32 +28667,32 @@
1
2
-12
+11
4
5
-12
+11
44
45
-12
+11
220
221
-12
+11
-956
-957
-12
+969
+970
+11
-28508
-28509
-12
+31450
+31451
+11
@@ -28150,32 +28708,32 @@
1
2
-12
+11
3
4
-12
+11
29
30
-12
+11
84
85
-12
+11
-441
-442
-12
+452
+453
+11
-19051
-19052
-12
+19713
+19714
+11
@@ -28191,32 +28749,32 @@
1
2
-12
+11
4
5
-12
+11
17
18
-12
+11
51
52
-12
+11
254
255
-12
+11
7602
7603
-12
+11
@@ -28232,12 +28790,12 @@
1
2
-222438
+221343
2
-766
-15402
+1134
+15131
@@ -28253,12 +28811,12 @@
1
2
-222450
+221355
2
-766
-15390
+1134
+15120
@@ -28274,12 +28832,12 @@
1
2
-237342
+235996
2
4
-498
+479
@@ -28295,12 +28853,12 @@
1
2
-229780
+228634
2
439
-8059
+7840
@@ -28316,22 +28874,22 @@
1
2
-74652
+70786
2
3
-9336
+8985
3
8
-7306
+7606
8
-682
-5057
+698
+5234
@@ -28347,22 +28905,22 @@
1
2
-77193
+73146
2
3
-7002
+6858
3
-9
-7609
+8
+7443
-9
-682
-4546
+8
+698
+5164
@@ -28378,12 +28936,12 @@
1
2
-96327
+92589
2
4
-24
+23
@@ -28399,22 +28957,22 @@
1
2
-77655
+73882
2
3
-9056
+8833
3
-11
-7269
+10
+7326
-11
-682
-2370
+10
+698
+2570
@@ -28424,15 +28982,15 @@
derspecifiers
-372947
+394756
der_id
-370272
+392185
spec_id
-48
+46
@@ -28446,12 +29004,12 @@
1
2
-367598
+389615
2
3
-2674
+2570
@@ -28467,22 +29025,22 @@
220
221
-12
+11
242
243
-12
+11
979
980
-12
+11
-29238
-29239
-12
+32343
+32344
+11
@@ -28492,15 +29050,15 @@
direct_base_offsets
-282029
+307366
der_id
-282029
+307366
offset
-206
+210
@@ -28514,7 +29072,7 @@
1
2
-282029
+307366
@@ -28530,62 +29088,67 @@
1
2
-36
+46
2
3
-12
+11
4
5
-24
+23
5
6
-12
+11
6
7
-24
+11
7
8
-12
+23
8
9
-24
+11
+
+
+10
+11
+11
11
12
-12
+11
21
22
-12
+11
-78
-79
-12
+85
+86
+11
200
201
-12
+11
-22837
-22838
-12
+25931
+25932
+11
@@ -28595,19 +29158,19 @@
virtual_base_offsets
-7026
+6753
sub
-3890
+3739
super
-534
+514
offset
-267
+257
@@ -28621,22 +29184,22 @@
1
2
-3063
+2944
2
4
-340
+327
4
7
-279
+268
7
11
-206
+198
@@ -28652,17 +29215,17 @@
1
2
-3282
+3154
2
4
-328
+315
4
8
-279
+268
@@ -28678,52 +29241,52 @@
1
2
-85
+81
2
3
-48
+46
3
4
-60
+58
4
5
-97
+93
5
7
-36
+35
8
13
-48
+46
13
15
-48
+46
15
23
-48
+46
24
60
-48
+46
196
197
-12
+11
@@ -28739,32 +29302,32 @@
1
2
-303
+292
2
3
-85
+81
4
6
-36
+35
6
8
-48
+46
8
10
-48
+46
14
15
-12
+11
@@ -28780,57 +29343,57 @@
2
3
-36
+35
4
5
-12
+11
5
6
-24
+23
6
8
-24
+23
8
9
-36
+35
10
12
-24
+23
14
19
-24
+23
20
27
-24
+23
28
31
-24
+23
36
97
-24
+23
97
98
-12
+11
@@ -28846,37 +29409,37 @@
1
2
-85
+81
2
3
-36
+35
3
4
-48
+46
5
7
-24
+23
7
10
-24
+23
12
14
-24
+23
21
29
-24
+23
@@ -28886,23 +29449,23 @@
frienddecls
-231178
+222208
id
-231178
+222208
type_id
-19511
+18753
decl_id
-28810
+27692
location
-8096
+7782
@@ -28916,7 +29479,7 @@
1
2
-231178
+222208
@@ -28932,7 +29495,7 @@
1
2
-231178
+222208
@@ -28948,7 +29511,7 @@
1
2
-231178
+222208
@@ -28964,47 +29527,47 @@
1
2
-6856
+6590
2
3
-2467
+2371
3
4
-1191
+1145
4
6
-1714
+1647
6
10
-1556
+1495
10
16
-1470
+1413
16
34
-1786
+1717
36
59
-1470
+1413
59
129
-996
+958
@@ -29020,47 +29583,47 @@
1
2
-6856
+6590
2
3
-2467
+2371
3
4
-1191
+1145
4
6
-1714
+1647
6
10
-1556
+1495
10
16
-1470
+1413
16
34
-1786
+1717
36
59
-1470
+1413
59
129
-996
+958
@@ -29076,17 +29639,17 @@
1
2
-17748
+17059
2
5
-1543
+1483
5
31
-218
+210
@@ -29102,37 +29665,37 @@
1
2
-15815
+15201
2
3
-2261
+2173
3
5
-2479
+2383
5
9
-2188
+2103
9
20
-2030
+1951
20
28
-2467
+2371
28
390
-1568
+1507
@@ -29148,37 +29711,37 @@
1
2
-15815
+15201
2
3
-2261
+2173
3
5
-2479
+2383
5
9
-2188
+2103
9
20
-2030
+1951
20
28
-2467
+2371
28
390
-1568
+1507
@@ -29194,12 +29757,12 @@
1
2
-28215
+27120
2
46
-595
+572
@@ -29215,17 +29778,17 @@
1
2
-6917
+6648
2
3
-1045
+1004
3
18239
-133
+128
@@ -29241,12 +29804,12 @@
1
2
-7609
+7314
2
1215
-486
+467
@@ -29262,17 +29825,17 @@
1
2
-6929
+6660
2
3
-1033
+993
3
1734
-133
+128
@@ -29282,19 +29845,19 @@
comments
-1743633
+1675974
id
-1743633
+1675974
contents
-864492
+830947
location
-1743633
+1675974
@@ -29308,7 +29871,7 @@
1
2
-1743633
+1675974
@@ -29324,7 +29887,7 @@
1
2
-1743633
+1675974
@@ -29340,17 +29903,17 @@
1
2
-731525
+703139
2
3
-83149
+79923
3
10736
-49817
+47883
@@ -29366,17 +29929,17 @@
1
2
-731525
+703139
2
3
-83149
+79923
3
10736
-49817
+47883
@@ -29392,7 +29955,7 @@
1
2
-1743633
+1675974
@@ -29408,7 +29971,7 @@
1
2
-1743633
+1675974
@@ -29418,15 +29981,15 @@
commentbinding
-778436
+748230
id
-679021
+652673
element
-747438
+718434
@@ -29440,17 +30003,17 @@
1
2
-616002
+592099
2
4
-58545
+56273
4
97
-4473
+4299
@@ -29466,12 +30029,12 @@
1
2
-716439
+688638
2
3
-30998
+29796
@@ -29481,15 +30044,15 @@
exprconv
-6445331
+6446816
converted
-6445038
+6446523
conversion
-6445331
+6446816
@@ -29503,7 +30066,7 @@
1
2
-6444746
+6446231
2
@@ -29524,7 +30087,7 @@
1
2
-6445331
+6446816
@@ -29534,30 +30097,30 @@
compgenerated
-6720341
+6652484
id
-6720341
+6652484
synthetic_destructor_call
-59493
+57185
element
-47422
+45582
i
-340
+327
destructor_call
-49573
+47650
@@ -29571,17 +30134,17 @@
1
2
-38791
+37285
2
3
-6321
+6076
3
29
-2309
+2220
@@ -29597,17 +30160,17 @@
1
2
-38791
+37285
2
3
-6321
+6076
3
29
-2309
+2220
@@ -29623,27 +30186,27 @@
1
2
-255
+245
2
7
-24
+23
22
43
-24
+23
190
711
-24
+23
3901
3902
-12
+11
@@ -29659,27 +30222,27 @@
1
2
-255
+245
2
7
-24
+23
21
37
-24
+23
146
550
-24
+23
3297
3298
-12
+11
@@ -29695,17 +30258,17 @@
1
2
-43823
+42123
2
3
-3719
+3575
3
26
-2030
+1951
@@ -29721,7 +30284,7 @@
1
2
-49573
+47650
@@ -29731,15 +30294,15 @@
namespaces
-8497
+8167
id
-8497
+8167
name
-4570
+4393
@@ -29753,7 +30316,7 @@
1
2
-8497
+8167
@@ -29769,17 +30332,17 @@
1
2
-3841
+3692
2
3
-461
+444
3
139
-267
+257
@@ -29789,26 +30352,26 @@
namespace_inline
-170
+163
id
-170
+163
namespacembrs
-1570027
+1616300
parentid
-7913
+7606
memberid
-1570027
+1616300
@@ -29822,62 +30385,67 @@
1
2
-875
+829
2
3
-826
+794
3
4
-644
+385
4
-6
-680
-
-
-6
-9
+5
607
-9
-16
-680
+5
+8
+666
-16
-27
-607
+8
+14
+677
-27
-46
-619
-
-
-46
-85
-607
-
-
-85
-169
-607
-
-
-169
-444
+14
+22
595
-475
-29073
-559
+22
+42
+595
+
+
+42
+63
+572
+
+
+63
+127
+572
+
+
+127
+304
+572
+
+
+321
+1041
+572
+
+
+1101
+32701
+163
@@ -29893,7 +30461,7 @@
1
2
-1570027
+1616300
@@ -29903,19 +30471,19 @@
exprparents
-13615303
+13481241
expr_id
-13615112
+13481052
child_index
-3163
+3131
parent_id
-9644209
+9549204
@@ -29929,7 +30497,7 @@
1
2
-13615105
+13481045
2
@@ -29950,12 +30518,12 @@
1
2
-13614927
+13480869
2
4
-184
+182
@@ -29971,37 +30539,37 @@
1
2
-72
+71
2
3
-652
+645
3
4
-1674
+1657
4
46
-243
+241
46
56
-237
+234
56
3660
-237
+234
6434
-1187727
-46
+1188148
+45
@@ -30017,37 +30585,37 @@
1
2
-72
+71
2
3
-652
+645
3
4
-1674
+1657
4
31
-243
+241
31
41
-237
+234
41
3645
-237
+234
6419
-1187740
-46
+1188161
+45
@@ -30063,17 +30631,17 @@
1
2
-6840662
+6772879
2
3
-2212086
+2190858
3
1681
-591461
+585466
@@ -30089,17 +30657,17 @@
1
2
-6840682
+6772898
2
3
-2212066
+2190839
3
480
-591461
+585466
@@ -30109,22 +30677,22 @@
expr_isload
-5063114
+5014574
expr_id
-5063114
+5014574
conversionkinds
-4254113
+4255501
expr_id
-4254113
+4255501
kind
@@ -30142,7 +30710,7 @@
1
2
-4254113
+4255501
@@ -30166,8 +30734,8 @@
1
-13109
-13110
+13672
+13673
1
@@ -30181,8 +30749,8 @@
1
-4161592
-4161593
+4162417
+4162418
1
@@ -30193,15 +30761,15 @@
iscall
-2365240
+2284876
caller
-2365240
+2284876
kind
-36
+35
@@ -30215,7 +30783,7 @@
1
2
-2365240
+2284876
@@ -30231,17 +30799,17 @@
1319
1320
-12
+11
-5604
-5605
-12
+5643
+5644
+11
-187644
-187645
-12
+188582
+188583
+11
@@ -30251,15 +30819,15 @@
numtemplatearguments
-157948
+152181
expr_id
-157948
+152181
num
-48
+46
@@ -30273,7 +30841,7 @@
1
2
-157948
+152181
@@ -30289,22 +30857,22 @@
3
4
-12
+11
41
42
-12
+11
651
652
-12
+11
-12298
-12299
-12
+12329
+12330
+11
@@ -30314,15 +30882,15 @@
specialnamequalifyingelements
-12
+11
id
-12
+11
name
-12
+11
@@ -30336,7 +30904,7 @@
1
2
-12
+11
@@ -30352,7 +30920,7 @@
1
2
-12
+11
@@ -30362,23 +30930,23 @@
namequalifiers
-1125621
+1116919
id
-1125621
+1116919
qualifiableelement
-1125621
+1116919
qualifyingelement
-37001
+38961
location
-509589
+506087
@@ -30392,7 +30960,7 @@
1
2
-1125621
+1116919
@@ -30408,7 +30976,7 @@
1
2
-1125621
+1116919
@@ -30424,7 +30992,7 @@
1
2
-1125621
+1116919
@@ -30440,7 +31008,7 @@
1
2
-1125621
+1116919
@@ -30456,7 +31024,7 @@
1
2
-1125621
+1116919
@@ -30472,7 +31040,7 @@
1
2
-1125621
+1116919
@@ -30488,109 +31056,109 @@
1
2
-17109
+18965
2
3
-7935
+8142
3
4
-5081
-
-
-4
-10
-2860
-
-
-10
-86
-2781
-
-
-86
-24926
-1232
-
-
-
-
-
-
-qualifyingelement
-qualifiableelement
-
-
-12
-
-
-1
-2
-17109
-
-
-2
-3
-7935
-
-
-3
-4
-5081
-
-
-4
-10
-2860
-
-
-10
-86
-2781
-
-
-86
-24926
-1232
-
-
-
-
-
-
-qualifyingelement
-location
-
-
-12
-
-
-1
-2
-22745
-
-
-2
-3
-4817
-
-
-3
-4
-3802
+5043
4
11
-3018
+3027
+
+
+11
+129
+2935
+
+
+132
+24926
+848
+
+
+
+
+
+
+qualifyingelement
+qualifiableelement
+
+
+12
+
+
+1
+2
+18965
+
+
+2
+3
+8142
+
+
+3
+4
+5043
+
+
+4
+11
+3027
+
+
+11
+129
+2935
+
+
+132
+24926
+848
+
+
+
+
+
+
+qualifyingelement
+location
+
+
+12
+
+
+1
+2
+24850
+
+
+2
+3
+4762
+
+
+3
+4
+3770
+
+
+4
+11
+2974
11
16728
-2616
+2603
@@ -30606,22 +31174,22 @@
1
2
-387650
+384719
2
3
-57004
+56877
3
7
-39037
+38851
7
381
-25895
+25639
@@ -30637,22 +31205,22 @@
1
2
-387650
+384719
2
3
-57004
+56877
3
7
-39037
+38851
7
381
-25895
+25639
@@ -30668,17 +31236,17 @@
1
2
-452478
+449080
2
3
-44785
+44650
3
190
-12324
+12356
@@ -30688,15 +31256,15 @@
varbind
-5497554
+5445518
expr
-5497428
+5445394
var
-1549133
+1534266
@@ -30710,12 +31278,12 @@
1
2
-5497303
+5445270
2
3
-125
+123
@@ -30731,32 +31299,32 @@
1
2
-685882
+679661
2
3
-311295
+308179
3
4
-236831
+234430
4
5
-93953
+93020
5
9
-134777
+133430
9
6150
-86393
+85544
@@ -30766,15 +31334,15 @@
funbind
-2442767
+2419854
expr
-2142538
+2122577
fun
-438611
+434205
@@ -30788,17 +31356,17 @@
1
2
-1842553
+1825541
2
3
-299807
+296859
3
5
-177
+176
@@ -30814,32 +31382,32 @@
1
2
-255153
+252065
2
3
-76151
+75516
3
4
-31642
+31302
4
7
-33910
+33957
7
37
-33831
+33520
37
6664
-7922
+7841
@@ -30849,19 +31417,19 @@
expr_allocator
-27692
+26617
expr
-27692
+26617
func
-133
+128
form
-12
+11
@@ -30875,7 +31443,7 @@
1
2
-27692
+26617
@@ -30891,7 +31459,7 @@
1
2
-27692
+26617
@@ -30907,42 +31475,42 @@
1
2
-36
+35
3
4
-12
+11
4
5
-12
+11
5
6
-12
+11
7
8
-24
+23
39
40
-12
+11
973
974
-12
+11
1237
1238
-12
+11
@@ -30958,7 +31526,7 @@
1
2
-133
+128
@@ -30974,7 +31542,7 @@
2278
2279
-12
+11
@@ -30990,7 +31558,7 @@
11
12
-12
+11
@@ -31000,19 +31568,19 @@
expr_deallocator
-30998
+29796
expr
-30998
+29796
func
-145
+140
form
-24
+23
@@ -31026,7 +31594,7 @@
1
2
-30998
+29796
@@ -31042,7 +31610,7 @@
1
2
-30998
+29796
@@ -31058,42 +31626,42 @@
1
2
-36
+35
2
3
-24
+23
3
4
-12
+11
4
5
-12
+11
7
8
-24
+23
118
119
-12
+11
883
884
-12
+11
1521
1522
-12
+11
@@ -31109,7 +31677,7 @@
1
2
-145
+140
@@ -31125,12 +31693,12 @@
891
892
-12
+11
1659
1660
-12
+11
@@ -31146,12 +31714,12 @@
4
5
-12
+11
8
9
-12
+11
@@ -31161,26 +31729,26 @@
expr_cond_two_operand
-610
+611
cond
-610
+611
expr_cond_guard
-154429
+154519
cond
-154429
+154519
guard
-154429
+154519
@@ -31194,7 +31762,7 @@
1
2
-154429
+154519
@@ -31210,7 +31778,7 @@
1
2
-154429
+154519
@@ -31220,15 +31788,15 @@
expr_cond_true
-154429
+154519
cond
-154429
+154519
true
-154429
+154519
@@ -31242,7 +31810,7 @@
1
2
-154429
+154519
@@ -31258,7 +31826,7 @@
1
2
-154429
+154519
@@ -31268,15 +31836,15 @@
expr_cond_false
-154429
+154519
cond
-154429
+154519
false
-154429
+154519
@@ -31290,7 +31858,7 @@
1
2
-154429
+154519
@@ -31306,7 +31874,7 @@
1
2
-154429
+154519
@@ -31316,15 +31884,15 @@
values
-8776796
+8788031
id
-8776796
+8788031
str
-651390
+651491
@@ -31338,7 +31906,7 @@
1
2
-8776796
+8788031
@@ -31354,17 +31922,17 @@
1
2
-540103
+540120
2
3
-65463
+65472
3
-4044535
-45824
+4046841
+45899
@@ -31374,15 +31942,15 @@
valuetext
-4759381
+4766569
id
-4759381
+4766569
text
-704971
+705085
@@ -31396,7 +31964,7 @@
1
2
-4759381
+4766569
@@ -31412,22 +31980,22 @@
1
2
-528095
+528108
2
3
-102815
+102830
3
7
-56849
+56879
7
427516
-17212
+17268
@@ -31437,15 +32005,15 @@
valuebind
-9499071
+9509366
val
-8769631
+8779926
expr
-9499071
+9509366
@@ -31459,7 +32027,7 @@
1
2
-8040923
+8051218
2
@@ -31485,7 +32053,7 @@
1
2
-9499071
+9509366
@@ -31495,19 +32063,19 @@
fieldoffsets
-259539
+251575
id
-259539
+251575
byteoffset
-3914
+9022
bitoffset
-85
+52
@@ -31521,7 +32089,7 @@
1
2
-259539
+251575
@@ -31537,7 +32105,7 @@
1
2
-259539
+251575
@@ -31553,42 +32121,27 @@
1
2
-1689
+6132
2
3
-534
+782
3
-4
-194
-
-
-4
6
-340
+750
6
-11
-328
+17
+678
-11
-23
-328
-
-
-23
-84
-303
-
-
-90
-12369
-194
+17
+11685
+678
@@ -31604,12 +32157,12 @@
1
2
-3853
+8579
2
-8
-60
+9
+443
@@ -31623,29 +32176,44 @@
12
-1
-2
-36
+83
+84
+6
-2
-3
-12
+87
+88
+6
-3
-4
-12
+102
+103
+6
-4
-5
-12
+122
+123
+6
-21338
-21339
-12
+127
+128
+6
+
+
+153
+154
+6
+
+
+195
+196
+6
+
+
+37692
+37693
+6
@@ -31659,24 +32227,44 @@
12
-1
-2
-36
+40
+41
+6
-2
-3
-24
+44
+45
+6
-3
-4
-12
+45
+46
+6
-322
-323
-12
+52
+53
+6
+
+
+54
+55
+6
+
+
+58
+59
+6
+
+
+66
+67
+6
+
+
+1383
+1384
+6
@@ -31686,11 +32274,11 @@
bitfield
-13357
+13365
id
-13357
+13365
bits
@@ -31712,7 +32300,7 @@
1
2
-13357
+13365
@@ -31728,7 +32316,7 @@
1
2
-13357
+13365
@@ -31892,23 +32480,23 @@
initialisers
-1685017
+1668506
init
-1685017
+1668506
var
-649685
+643667
expr
-1685017
+1668506
location
-321906
+318643
@@ -31922,7 +32510,7 @@
1
2
-1685017
+1668506
@@ -31938,7 +32526,7 @@
1
2
-1685017
+1668506
@@ -31954,7 +32542,7 @@
1
2
-1685017
+1668506
@@ -31970,22 +32558,22 @@
1
2
-562000
+556871
2
16
-29079
+28784
16
17
-49688
+49185
17
53
-8917
+8827
@@ -32001,22 +32589,22 @@
1
2
-562000
+556871
2
16
-29079
+28784
16
17
-49688
+49185
17
53
-8917
+8827
@@ -32032,7 +32620,7 @@
1
2
-649672
+643654
2
@@ -32053,7 +32641,7 @@
1
2
-1685017
+1668506
@@ -32069,7 +32657,7 @@
1
2
-1685017
+1668506
@@ -32085,7 +32673,7 @@
1
2
-1685017
+1668506
@@ -32101,27 +32689,27 @@
1
2
-248450
+245906
2
3
-24096
+23845
3
7
-24485
+24243
7
65
-24346
+24126
67
109238
-527
+521
@@ -32137,22 +32725,22 @@
1
2
-271334
+268551
2
3
-25342
+25091
3
-24
-24155
+23
+23904
-24
+23
12632
-1074
+1096
@@ -32168,27 +32756,27 @@
1
2
-248450
+245906
2
3
-24096
+23845
3
7
-24485
+24243
7
65
-24346
+24126
67
109238
-527
+521
@@ -32198,15 +32786,15 @@
expr_ancestor
-67772
+68706
exp
-67176
+68133
ancestor
-49695
+51330
@@ -32220,12 +32808,12 @@
1
2
-66605
+67584
2
4
-571
+549
@@ -32241,17 +32829,17 @@
1
2
-37405
+39517
2
3
-10150
+9756
3
29
-2139
+2056
@@ -32261,19 +32849,19 @@
exprs
-18449753
+18460593
id
-18449753
+18460593
kind
-393
+1168
location
-6150603
+3836046
@@ -32287,7 +32875,7 @@
1
2
-18449753
+18460593
@@ -32303,7 +32891,7 @@
1
2
-18449753
+18460593
@@ -32317,69 +32905,69 @@
12
-5
-28
-30
+1
+14
+105
-71
-82
-30
+15
+44
+93
-94
-255
-30
+47
+86
+93
-271
-627
-30
+90
+223
+93
-858
-1879
-30
+296
+463
+93
-2191
-3716
-30
+483
+715
+93
-4305
-6068
-30
+788
+2129
+93
-7004
-11661
-30
+2165
+2950
+93
-12107
-20202
-30
+3030
+4378
+93
-21965
-29561
-30
+4477
+6077
+93
-32830
-41032
-30
+6490
+17249
+93
-44670
-145995
-30
+19347
+188353
+93
-447805
-725766
-24
+191022
+403956
+35
@@ -32394,68 +32982,68 @@
1
+4
+105
+
+
+6
+13
+105
+
+
+13
24
-30
+93
-27
-72
-30
+24
+38
+93
-77
-157
-30
+38
+134
+93
-171
-402
-30
+144
+259
+93
-422
-1083
-30
+269
+480
+93
-1179
-1862
-30
+481
+1074
+93
-2201
-4268
-30
+1095
+1411
+93
-4679
-6584
-30
+1422
+2045
+93
-6624
-11083
-30
+2059
+4557
+93
-11359
-12983
-30
+5888
+59687
+93
-17158
-28621
-30
-
-
-29980
-88945
-30
-
-
-128315
-425042
-24
+72153
+117893
+23
@@ -32471,22 +33059,37 @@
1
2
-4450587
+1838158
2
3
-874643
+753582
3
-6
-496205
+4
+356208
-6
-22445
-329167
+4
+5
+276250
+
+
+5
+9
+301489
+
+
+9
+72
+287759
+
+
+72
+136887
+22598
@@ -32502,22 +33105,17 @@
1
2
-4599301
+2734142
2
3
-812812
+859259
3
-5
-498909
-
-
-5
-33
-239579
+30
+242644
@@ -32527,19 +33125,19 @@
expr_types
-18617706
+18629051
id
-18444987
+18456012
typeid
-1372691
+1345343
value_category
-36
+35
@@ -32553,12 +33151,12 @@
1
2
-18272500
+18283254
2
4
-172487
+172758
@@ -32574,7 +33172,7 @@
1
2
-18444987
+18456012
@@ -32590,42 +33188,42 @@
1
2
-530591
+526443
2
3
-259102
+254107
3
4
-113553
+110864
4
5
-95427
+92110
5
8
-122925
+118483
8
14
-105736
+102381
14
-46
-103864
+47
+101797
-46
-111456
-41489
+47
+123210
+39155
@@ -32641,17 +33239,17 @@
1
2
-1207109
+1185928
2
3
-157753
+151877
3
4
-7828
+7536
@@ -32667,17 +33265,17 @@
4533
4534
-12
+11
-340895
-340896
-12
+342547
+342548
+11
-1171875
-1171876
-12
+1232420
+1232421
+11
@@ -32691,19 +33289,19 @@
12
-1340
-1341
-12
+1341
+1342
+11
-29733
-29734
-12
+29841
+29842
+11
-96111
-96112
-12
+98243
+98244
+11
@@ -32713,15 +33311,15 @@
new_allocated_type
-29527
+28382
expr
-29527
+28382
type_id
-18234
+17527
@@ -32735,7 +33333,7 @@
1
2
-29527
+28382
@@ -32751,22 +33349,22 @@
1
2
-12667
+12175
2
3
-4035
+3879
3
9
-1446
+1390
10
92
-85
+81
@@ -32776,15 +33374,15 @@
new_array_allocated_type
-5364
+5310
expr
-5364
+5310
type_id
-2306
+2283
@@ -32798,7 +33396,7 @@
1
2
-5364
+5310
@@ -32819,12 +33417,12 @@
2
3
-2043
+2022
3
7
-177
+176
8
@@ -33376,15 +33974,15 @@
condition_decl_bind
-7646
+7349
expr
-7646
+7349
decl
-7646
+7349
@@ -33398,7 +33996,7 @@
1
2
-7646
+7349
@@ -33414,7 +34012,7 @@
1
2
-7646
+7349
@@ -33424,15 +34022,15 @@
typeid_bind
-4899
+4708
expr
-4899
+4708
type_id
-2601
+2500
@@ -33446,7 +34044,7 @@
1
2
-4899
+4708
@@ -33462,22 +34060,22 @@
1
2
-1300
+1250
2
3
-996
+958
3
6
-230
+222
6
17
-72
+70
@@ -33487,15 +34085,15 @@
uuidof_bind
-856
+848
expr
-856
+848
type_id
-652
+645
@@ -33509,7 +34107,7 @@
1
2
-856
+848
@@ -33525,12 +34123,12 @@
1
2
-481
+476
2
3
-138
+137
3
@@ -33545,15 +34143,15 @@
sizeof_bind
-156997
+157089
expr
-156997
+157089
type_id
-2673
+2674
@@ -33567,7 +34165,7 @@
1
2
-156997
+157089
@@ -33583,7 +34181,7 @@
1
2
-1044
+1045
2
@@ -33681,11 +34279,11 @@
lambdas
-12641
+12513
expr
-12641
+12513
default_capture
@@ -33707,7 +34305,7 @@
1
2
-12641
+12513
@@ -33723,7 +34321,7 @@
1
2
-12641
+12513
@@ -33812,23 +34410,23 @@
lambda_capture
-21730
+21509
id
-21730
+21509
lambda
-10097
+9994
index
-112
+110
field
-21730
+21509
captured_by_reference
@@ -33840,7 +34438,7 @@
location
-14051
+13909
@@ -33854,7 +34452,7 @@
1
2
-21730
+21509
@@ -33870,7 +34468,7 @@
1
2
-21730
+21509
@@ -33886,7 +34484,7 @@
1
2
-21730
+21509
@@ -33902,7 +34500,7 @@
1
2
-21730
+21509
@@ -33918,7 +34516,7 @@
1
2
-21730
+21509
@@ -33934,7 +34532,7 @@
1
2
-21730
+21509
@@ -33950,27 +34548,27 @@
1
2
-5002
+4951
2
3
-2379
+2355
3
4
-1265
+1252
4
6
-922
+913
6
18
-527
+521
@@ -33986,27 +34584,27 @@
1
2
-5002
+4951
2
3
-2379
+2355
3
4
-1265
+1252
4
6
-922
+913
6
18
-527
+521
@@ -34022,27 +34620,27 @@
1
2
-5002
+4951
2
3
-2379
+2355
3
4
-1265
+1252
4
6
-922
+913
6
18
-527
+521
@@ -34058,12 +34656,12 @@
1
2
-9629
+9531
2
3
-467
+463
@@ -34079,7 +34677,7 @@
1
2
-10077
+9975
2
@@ -34100,27 +34698,27 @@
1
2
-5483
+5428
2
3
-2504
+2479
3
4
-1041
+1030
4
7
-823
+815
7
18
-243
+241
@@ -34429,7 +35027,7 @@
2
3
-85
+84
@@ -34450,7 +35048,7 @@
2
3
-46
+45
@@ -34562,7 +35160,7 @@
1
2
-21730
+21509
@@ -34578,7 +35176,7 @@
1
2
-21730
+21509
@@ -34594,7 +35192,7 @@
1
2
-21730
+21509
@@ -34610,7 +35208,7 @@
1
2
-21730
+21509
@@ -34626,7 +35224,7 @@
1
2
-21730
+21509
@@ -34642,7 +35240,7 @@
1
2
-21730
+21509
@@ -34900,17 +35498,17 @@
1
2
-12667
+12539
2
6
-1061
+1050
6
68
-322
+319
@@ -34926,12 +35524,12 @@
1
2
-13115
+12982
2
68
-935
+926
@@ -34947,12 +35545,12 @@
1
2
-13511
+13374
2
8
-540
+534
@@ -34968,17 +35566,17 @@
1
2
-12667
+12539
2
6
-1061
+1050
6
68
-322
+319
@@ -34994,7 +35592,7 @@
1
2
-14032
+13889
2
@@ -35015,7 +35613,7 @@
1
2
-14051
+13909
@@ -35141,19 +35739,19 @@
stmts
-4943740
+4765273
id
-4943740
+4765273
kind
-230
+222
location
-1317574
+1266448
@@ -35167,7 +35765,7 @@
1
2
-4943740
+4765273
@@ -35183,7 +35781,7 @@
1
2
-4943740
+4765273
@@ -35199,97 +35797,97 @@
2
3
-12
+11
28
29
-12
+11
338
339
-12
+11
473
474
-12
+11
690
691
-12
+11
1560
1561
-12
+11
1757
1758
-12
+11
-2076
-2077
-12
+2080
+2081
+11
-2191
-2192
-12
+2193
+2194
+11
2707
2708
-12
+11
2748
2749
-12
+11
-2944
-2945
-12
+2946
+2947
+11
3296
3297
-12
+11
4540
4541
-12
+11
-28688
-28689
-12
+28694
+28695
+11
-53254
-53255
-12
+53369
+53370
+11
-85878
-85879
-12
+86211
+86212
+11
-98483
-98484
-12
+98824
+98825
+11
-115024
-115025
-12
+115365
+115366
+11
@@ -35305,97 +35903,97 @@
2
3
-12
+11
23
24
-12
+11
106
107
-12
+11
112
113
-12
+11
178
179
-12
+11
252
253
-12
+11
296
297
-12
+11
661
662
-12
+11
663
664
-12
+11
991
992
-12
+11
1030
1031
-12
+11
1408
1409
-12
+11
1918
1919
-12
+11
2676
2677
-12
+11
10172
10173
-12
+11
10231
10232
-12
+11
22268
22269
-12
+11
26534
26535
-12
+11
31957
31958
-12
+11
@@ -35411,32 +36009,32 @@
1
2
-779628
+747015
2
3
-179173
+173050
3
4
-120275
+116169
4
6
-106891
+103199
6
19
-102794
+99168
19
-4895
-28810
+4923
+27844
@@ -35452,12 +36050,12 @@
1
2
-1291693
+1241571
2
9
-25881
+24876
@@ -35563,15 +36161,15 @@
if_then
-524558
+524866
if_stmt
-524558
+524866
then_id
-524558
+524866
@@ -35585,7 +36183,7 @@
1
2
-524558
+524866
@@ -35601,7 +36199,7 @@
1
2
-524558
+524866
@@ -35611,15 +36209,15 @@
if_else
-148234
+148322
if_stmt
-148234
+148322
else_id
-148234
+148322
@@ -35633,7 +36231,7 @@
1
2
-148234
+148322
@@ -35649,7 +36247,7 @@
1
2
-148234
+148322
@@ -35755,15 +36353,15 @@
while_body
-32907
+31630
while_stmt
-32907
+31630
body_id
-32907
+31630
@@ -35777,7 +36375,7 @@
1
2
-32907
+31630
@@ -35793,7 +36391,7 @@
1
2
-32907
+31630
@@ -35803,15 +36401,15 @@
do_body
-149900
+149988
do_stmt
-149900
+149988
body_id
-149900
+149988
@@ -35825,7 +36423,7 @@
1
2
-149900
+149988
@@ -35841,7 +36439,7 @@
1
2
-149900
+149988
@@ -35851,11 +36449,11 @@
switch_case
-281530
+281695
switch_stmt
-55225
+55258
index
@@ -35863,7 +36461,7 @@
case_id
-281530
+281695
@@ -35877,17 +36475,17 @@
1
5
-4288
+4290
5
6
-48725
+48753
6
156
-2212
+2213
@@ -35903,17 +36501,17 @@
1
5
-4288
+4290
5
6
-48725
+48753
6
156
-2212
+2213
@@ -36031,7 +36629,7 @@
1
2
-281530
+281695
@@ -36047,7 +36645,7 @@
1
2
-281530
+281695
@@ -36057,15 +36655,15 @@
switch_body
-55225
+55258
switch_stmt
-55225
+55258
body_id
-55225
+55258
@@ -36079,7 +36677,7 @@
1
2
-55225
+55258
@@ -36095,7 +36693,7 @@
1
2
-55225
+55258
@@ -36105,15 +36703,15 @@
for_initialization
-29922
+29619
for_stmt
-29922
+29619
init_id
-29922
+29619
@@ -36127,7 +36725,7 @@
1
2
-29922
+29619
@@ -36143,7 +36741,7 @@
1
2
-29922
+29619
@@ -36153,15 +36751,15 @@
for_condition
-31781
+31459
for_stmt
-31781
+31459
condition_id
-31781
+31459
@@ -36175,7 +36773,7 @@
1
2
-31781
+31459
@@ -36191,7 +36789,7 @@
1
2
-31781
+31459
@@ -36201,15 +36799,15 @@
for_update
-29659
+29358
for_stmt
-29659
+29358
update_id
-29659
+29358
@@ -36223,7 +36821,7 @@
1
2
-29659
+29358
@@ -36239,7 +36837,7 @@
1
2
-29659
+29358
@@ -36249,15 +36847,15 @@
for_body
-32387
+32059
for_stmt
-32387
+32059
body_id
-32387
+32059
@@ -36271,7 +36869,7 @@
1
2
-32387
+32059
@@ -36287,7 +36885,7 @@
1
2
-32387
+32059
@@ -36297,19 +36895,19 @@
stmtparents
-4168478
+4131960
id
-4168478
+4131960
index
-12799
+836
parent
-1762006
+1583254
@@ -36323,7 +36921,7 @@
1
2
-4168478
+4131960
@@ -36339,7 +36937,7 @@
1
2
-4168478
+4131960
@@ -36355,52 +36953,57 @@
1
2
-4020
+182
2
3
-1094
+149
3
-4
-520
+5
+41
-4
-5
-1496
+5
+7
+72
7
-8
-1047
+9
+68
-8
-12
-830
+9
+18
+63
-12
-29
-1127
+18
+39
+64
-29
-37
-909
+39
+111
+63
-37
-74
-975
+112
+836
+63
-74
-191996
-777
+920
+136298
+63
+
+
+254134
+706946
+5
@@ -36416,52 +37019,57 @@
1
2
-4020
+182
2
3
-1094
+149
3
-4
-520
+5
+41
-4
-5
-1496
+5
+7
+72
7
-8
-1047
+9
+68
-8
-12
-830
+9
+18
+63
-12
-29
-1127
+18
+39
+64
-29
-37
-909
+39
+111
+63
-37
-74
-975
+112
+836
+63
-74
-191996
-777
+920
+136298
+63
+
+
+254134
+706946
+5
@@ -36477,32 +37085,27 @@
1
2
-1004414
+841847
2
3
-386602
+376317
3
4
-109343
+145318
4
-6
-115439
+9
+119501
-6
-17
-133386
-
-
-17
-1943
-12819
+9
+465
+100269
@@ -36518,32 +37121,27 @@
1
2
-1004414
+841847
2
3
-386602
+376317
3
4
-109343
+145318
4
-6
-115439
+9
+119501
-6
-17
-133386
-
-
-17
-1943
-12819
+9
+465
+100269
@@ -36553,26 +37151,26 @@
ishandler
-21888
+21666
block
-21888
+21666
successors
-17214104
+17224218
from
-16042874
+16052300
to
-16040997
+16050421
@@ -36586,12 +37184,12 @@
1
2
-15044821
+15053661
2
156
-998052
+998638
@@ -36607,12 +37205,12 @@
1
2
-15328885
+15337891
2
419
-712111
+712530
@@ -36622,15 +37220,15 @@
truecond
-966805
+967373
from
-966805
+967373
to
-937112
+937663
@@ -36644,7 +37242,7 @@
1
2
-966805
+967373
@@ -36660,12 +37258,12 @@
1
2
-913540
+914077
2
21
-23572
+23585
@@ -36675,15 +37273,15 @@
falsecond
-966805
+967373
from
-966805
+967373
to
-812105
+812583
@@ -36697,7 +37295,7 @@
1
2
-966805
+967373
@@ -36713,17 +37311,17 @@
1
2
-698749
+699160
2
3
-87006
+87057
3
25
-26349
+26365
@@ -36733,11 +37331,11 @@
stmt_decl_bind
-538233
+532777
stmt
-531279
+525894
num
@@ -36745,7 +37343,7 @@
decl
-538233
+532777
@@ -36759,12 +37357,12 @@
1
2
-525776
+520447
2
9
-5503
+5447
@@ -36780,12 +37378,12 @@
1
2
-525756
+520427
2
9
-5523
+5467
@@ -36903,7 +37501,7 @@
1
2
-538233
+532777
@@ -36919,7 +37517,7 @@
1
2
-538233
+532777
@@ -36929,19 +37527,19 @@
stmt_decl_entry_bind
-519726
+520031
stmt
-474524
+474803
num
-491
+492
decl_entry
-495657
+495948
@@ -36955,12 +37553,12 @@
1
2
-441842
+442101
2
274
-32682
+32702
@@ -36976,12 +37574,12 @@
1
2
-441842
+442101
2
15
-32682
+32702
@@ -37064,12 +37662,12 @@
1
2
-483634
+483918
2
85
-12022
+12029
@@ -37085,7 +37683,7 @@
1
2
-495588
+495879
2
@@ -37100,15 +37698,15 @@
blockscope
-1398256
+1347984
block
-1398256
+1347984
enclosing
-1254288
+1209602
@@ -37122,7 +37720,7 @@
1
2
-1398256
+1347984
@@ -37138,12 +37736,12 @@
1
2
-1171636
+1130157
2
509
-82651
+79444
@@ -37153,19 +37751,19 @@
jumpinfo
-366503
+366719
id
-366503
+366719
str
-6361
+6365
target
-85508
+85558
@@ -37179,7 +37777,7 @@
1
2
-366503
+366719
@@ -37195,7 +37793,7 @@
1
2
-366503
+366719
@@ -37216,12 +37814,12 @@
2
3
-3507
+3509
3
4
-835
+836
4
@@ -37231,12 +37829,12 @@
5
7
-491
+492
7
15
-500
+501
15
@@ -37257,12 +37855,12 @@
1
2
-5095
+5098
2
3
-700
+701
3
@@ -37293,32 +37891,32 @@
2
3
-21251
+21263
3
4
-7559
+7564
4
5
-3816
+3818
5
6
-39695
+39718
6
7
-11019
+11025
7
162
-1880
+1882
@@ -37334,7 +37932,7 @@
1
2
-85508
+85558
@@ -37344,19 +37942,19 @@
preprocdirects
-1456121
+1399618
id
-1456121
+1399618
kind
-158
+151
location
-1449131
+1392900
@@ -37370,7 +37968,7 @@
1
2
-1456121
+1399618
@@ -37386,7 +37984,7 @@
1
2
-1456121
+1399618
@@ -37402,67 +38000,67 @@
4
5
-12
+11
8
9
-12
+11
500
501
-12
+11
929
930
-12
+11
1740
1741
-12
+11
1873
1874
-12
+11
5235
5236
-12
+11
5497
5498
-12
+11
7551
7552
-12
+11
14073
14074
-12
+11
26464
26465
-12
+11
27121
27122
-12
+11
28787
28788
-12
+11
@@ -37478,67 +38076,67 @@
4
5
-12
+11
7
8
-12
+11
500
501
-12
+11
929
930
-12
+11
1740
1741
-12
+11
1873
1874
-12
+11
5235
5236
-12
+11
5497
5498
-12
+11
7551
7552
-12
+11
14073
14074
-12
+11
26122
26123
-12
+11
27121
27122
-12
+11
28555
28556
-12
+11
@@ -37554,12 +38152,12 @@
1
2
-1448766
+1392549
2
234
-364
+350
@@ -37575,7 +38173,7 @@
1
2
-1449131
+1392900
@@ -37585,15 +38183,15 @@
preprocpair
-416102
+399956
begin
-329694
+316901
elseelifend
-416102
+399956
@@ -37607,17 +38205,17 @@
1
2
-261399
+251256
2
3
-60247
+57909
3
53
-8047
+7735
@@ -37633,7 +38231,7 @@
1
2
-416102
+399956
@@ -37643,41 +38241,41 @@
preproctrue
-183112
+176006
branch
-183112
+176006
preprocfalse
-130000
+124956
branch
-130000
+124956
preproctext
-1062775
+1021536
id
-1062775
+1021536
head
-510083
+490290
body
-192959
+185471
@@ -37691,7 +38289,7 @@
1
2
-1062775
+1021536
@@ -37707,7 +38305,7 @@
1
2
-1062775
+1021536
@@ -37723,22 +38321,22 @@
1
2
-380459
+365696
2
3
-86116
+82774
3
19
-38414
+36923
19
752
-5093
+4895
@@ -37754,12 +38352,12 @@
1
2
-486208
+467341
2
38
-23875
+22948
@@ -37775,12 +38373,12 @@
1
2
-181252
+174219
2
64395
-11706
+11252
@@ -37796,12 +38394,12 @@
1
2
-182893
+175796
2
21671
-10065
+9674
@@ -37811,15 +38409,15 @@
includes
-321805
+309317
id
-321805
+309317
included
-60162
+57827
@@ -37833,7 +38431,7 @@
1
2
-321805
+309317
@@ -37849,37 +38447,37 @@
1
2
-29503
+28358
2
3
-9895
+9511
3
4
-5117
+4919
4
6
-5348
+5141
6
11
-4643
+4463
11
41
-4558
+4381
41
763
-1094
+1051
@@ -37889,15 +38487,15 @@
link_targets
-644
+619
id
-644
+619
binary
-644
+619
@@ -37911,7 +38509,7 @@
1
2
-644
+619
@@ -37927,7 +38525,7 @@
1
2
-644
+619
@@ -37937,15 +38535,15 @@
link_parent
-19143690
+19072521
element
-5076549
+5117392
link_target
-644
+619
@@ -37959,32 +38557,32 @@
1
2
-1439430
+1455425
2
3
-1904730
+1924496
3
4
-772395
+779113
4
6
-426167
+434215
6
-27
-383109
+28
+394382
-27
+28
45
-150715
+129758
@@ -38000,67 +38598,67 @@
2
3
-97
+93
5
557
-48
+46
-2555
-5912
-48
+2662
+6059
+46
-6322
-8240
-48
+6479
+8402
+46
-9873
-12705
-48
+10060
+12929
+46
-12726
-19568
-48
+13044
+20082
+46
-24613
-26319
-48
+24978
+26985
+46
-26410
-31881
-48
+27088
+32537
+46
-32502
-37729
-48
+33104
+38465
+46
-39858
-40615
-48
+41123
+42511
+46
-43096
-52498
-48
+44410
+55889
+46
-53361
-126529
-48
+55937
+132605
+46
-345660
-345661
-12
+362472
+362473
+11
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp
new file mode 100644
index 00000000000..9c3c8bc4569
--- /dev/null
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/BarrierGuard.cpp
@@ -0,0 +1,68 @@
+int source();
+void sink(int);
+bool guarded(int);
+
+void bg_basic(int source) {
+ if (guarded(source)) {
+ sink(source); // no flow
+ } else {
+ sink(source); // flow
+ }
+}
+
+void bg_not(int source) {
+ if (!guarded(source)) {
+ sink(source); // flow
+ } else {
+ sink(source); // no flow
+ }
+}
+
+void bg_and(int source, bool arbitrary) {
+ if (guarded(source) && arbitrary) {
+ sink(source); // no flow
+ } else {
+ sink(source); // flow
+ }
+}
+
+void bg_or(int source, bool arbitrary) {
+ if (guarded(source) || arbitrary) {
+ sink(source); // flow
+ } else {
+ sink(source); // flow
+ }
+}
+
+void bg_return(int source) {
+ if (!guarded(source)) {
+ return;
+ }
+ sink(source); // no flow
+}
+
+struct XY {
+ int x, y;
+};
+
+void bg_stackstruct(XY s1, XY s2) {
+ s1.x = source();
+ if (guarded(s1.x)) {
+ sink(s1.x); // no flow
+ } else if (guarded(s1.y)) {
+ sink(s1.x); // flow
+ } else if (guarded(s2.y)) {
+ sink(s1.x); // flow
+ }
+}
+
+void bg_structptr(XY *p1, XY *p2) {
+ p1->x = source();
+ if (guarded(p1->x)) {
+ sink(p1->x); // no flow [FALSE POSITIVE in AST]
+ } else if (guarded(p1->y)) {
+ sink(p1->x); // flow [NOT DETECTED in IR]
+ } else if (guarded(p2->x)) {
+ sink(p1->x); // flow [NOT DETECTED in IR]
+ }
+}
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/DataflowTestCommon.qll b/cpp/ql/test/library-tests/dataflow/dataflow-tests/DataflowTestCommon.qll
index 02ee4d45380..a81394640ee 100644
--- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/DataflowTestCommon.qll
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/DataflowTestCommon.qll
@@ -1,6 +1,20 @@
import cpp
import semmle.code.cpp.dataflow.DataFlow
+/**
+ * A `BarrierGuard` that stops flow to all occurrences of `x` within statement
+ * S in `if (guarded(x)) S`.
+ */
+// This is tested in `BarrierGuard.cpp`.
+class TestBarrierGuard extends DataFlow::BarrierGuard {
+ TestBarrierGuard() { this.(FunctionCall).getTarget().getName() = "guarded" }
+
+ override predicate checks(Expr checked, boolean isTrue) {
+ checked = this.(FunctionCall).getArgument(0) and
+ isTrue = true
+ }
+}
+
/** Common data flow configuration to be used by tests. */
class TestAllocationConfig extends DataFlow::Configuration {
TestAllocationConfig() { this = "TestAllocationConfig" }
@@ -26,4 +40,6 @@ class TestAllocationConfig extends DataFlow::Configuration {
override predicate isBarrier(DataFlow::Node barrier) {
barrier.asExpr().(VariableAccess).getTarget().hasName("barrier")
}
+
+ override predicate isBarrierGuard(DataFlow::BarrierGuard bg) { bg instanceof TestBarrierGuard }
}
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/IRDataflowTestCommon.qll b/cpp/ql/test/library-tests/dataflow/dataflow-tests/IRDataflowTestCommon.qll
index eb5fa14e2e0..490f7e4290a 100644
--- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/IRDataflowTestCommon.qll
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/IRDataflowTestCommon.qll
@@ -1,5 +1,20 @@
import cpp
import semmle.code.cpp.ir.dataflow.DataFlow
+import semmle.code.cpp.ir.IR
+
+/**
+ * A `BarrierGuard` that stops flow to all occurrences of `x` within statement
+ * S in `if (guarded(x)) S`.
+ */
+// This is tested in `BarrierGuard.cpp`.
+class TestBarrierGuard extends DataFlow::BarrierGuard {
+ TestBarrierGuard() { this.(CallInstruction).getStaticCallTarget().getName() = "guarded" }
+
+ override predicate checks(Instruction checked, boolean isTrue) {
+ checked = this.(CallInstruction).getPositionalArgument(0) and
+ isTrue = true
+ }
+}
/** Common data flow configuration to be used by tests. */
class TestAllocationConfig extends DataFlow::Configuration {
@@ -24,4 +39,6 @@ class TestAllocationConfig extends DataFlow::Configuration {
override predicate isBarrier(DataFlow::Node barrier) {
barrier.asExpr().(VariableAccess).getTarget().hasName("barrier")
}
+
+ override predicate isBarrierGuard(DataFlow::BarrierGuard bg) { bg instanceof TestBarrierGuard }
}
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected
index b9fca1f678f..6527db4b77e 100644
--- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test.expected
@@ -1,3 +1,13 @@
+| BarrierGuard.cpp:9:10:9:15 | source | BarrierGuard.cpp:5:19:5:24 | source |
+| BarrierGuard.cpp:15:10:15:15 | source | BarrierGuard.cpp:13:17:13:22 | source |
+| BarrierGuard.cpp:25:10:25:15 | source | BarrierGuard.cpp:21:17:21:22 | source |
+| BarrierGuard.cpp:31:10:31:15 | source | BarrierGuard.cpp:29:16:29:21 | source |
+| BarrierGuard.cpp:33:10:33:15 | source | BarrierGuard.cpp:29:16:29:21 | source |
+| BarrierGuard.cpp:53:13:53:13 | x | BarrierGuard.cpp:49:10:49:15 | call to source |
+| BarrierGuard.cpp:55:13:55:13 | x | BarrierGuard.cpp:49:10:49:15 | call to source |
+| BarrierGuard.cpp:62:14:62:14 | x | BarrierGuard.cpp:60:11:60:16 | call to source |
+| BarrierGuard.cpp:64:14:64:14 | x | BarrierGuard.cpp:60:11:60:16 | call to source |
+| BarrierGuard.cpp:66:14:66:14 | x | BarrierGuard.cpp:60:11:60:16 | call to source |
| acrossLinkTargets.cpp:12:8:12:8 | x | acrossLinkTargets.cpp:19:27:19:32 | call to source |
| clang.cpp:18:8:18:19 | sourceArray1 | clang.cpp:12:9:12:20 | sourceArray1 |
| clang.cpp:22:8:22:20 | & ... | clang.cpp:12:9:12:20 | sourceArray1 |
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected
index cd7e3dac785..7d0d4e7d72e 100644
--- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected
@@ -1,3 +1,6 @@
+| BarrierGuard.cpp:60:11:60:16 | BarrierGuard.cpp:62:14:62:14 | AST only |
+| BarrierGuard.cpp:60:11:60:16 | BarrierGuard.cpp:64:14:64:14 | AST only |
+| BarrierGuard.cpp:60:11:60:16 | BarrierGuard.cpp:66:14:66:14 | AST only |
| clang.cpp:12:9:12:20 | clang.cpp:22:8:22:20 | AST only |
| clang.cpp:28:27:28:32 | clang.cpp:29:27:29:28 | AST only |
| clang.cpp:28:27:28:32 | clang.cpp:30:27:30:34 | AST only |
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected
index 83ba546480f..9b67a013a58 100644
--- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected
@@ -1,3 +1,10 @@
+| BarrierGuard.cpp:9:10:9:15 | Load: source | BarrierGuard.cpp:5:19:5:24 | InitializeParameter: source |
+| BarrierGuard.cpp:15:10:15:15 | Load: source | BarrierGuard.cpp:13:17:13:22 | InitializeParameter: source |
+| BarrierGuard.cpp:25:10:25:15 | Load: source | BarrierGuard.cpp:21:17:21:22 | InitializeParameter: source |
+| BarrierGuard.cpp:31:10:31:15 | Load: source | BarrierGuard.cpp:29:16:29:21 | InitializeParameter: source |
+| BarrierGuard.cpp:33:10:33:15 | Load: source | BarrierGuard.cpp:29:16:29:21 | InitializeParameter: source |
+| BarrierGuard.cpp:53:13:53:13 | Load: x | BarrierGuard.cpp:49:10:49:15 | Call: call to source |
+| BarrierGuard.cpp:55:13:55:13 | Load: x | BarrierGuard.cpp:49:10:49:15 | Call: call to source |
| acrossLinkTargets.cpp:12:8:12:8 | Convert: (int)... | acrossLinkTargets.cpp:19:27:19:32 | Call: call to source |
| acrossLinkTargets.cpp:12:8:12:8 | Load: x | acrossLinkTargets.cpp:19:27:19:32 | Call: call to source |
| clang.cpp:18:8:18:19 | Convert: (const int *)... | clang.cpp:12:9:12:20 | InitializeParameter: sourceArray1 |
diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
index 19a4288a4c4..dab6a40fae6 100644
--- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
+++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
@@ -67,31 +67,7 @@ bad_asts.cpp:
# 5| params:
#-----| 0: [Parameter] p#0
#-----| Type = [RValueReferenceType] S &&
-# 9| [MemberFunction] int Bad::S::MemberFunction(int)
-# 9| params:
-# 9| 0: [Parameter] y
-# 9| Type = [IntType] int
-# 9| body: [Block] { ... }
-# 10| 0: [ReturnStmt] return ...
-# 10| 0: [AddExpr] ... + ...
-# 10| Type = [IntType] int
-# 10| ValueCategory = prvalue
-# 10| 0: [AddExpr] ... + ...
-# 10| Type = [IntType] int
-# 10| ValueCategory = prvalue
-# 10| 0: [Literal] Unknown literal
-# 10| Type = [IntType] int
-# 10| ValueCategory = prvalue
-# 10| 1: [PointerFieldAccess] x
-# 10| Type = [IntType] int
-# 10| ValueCategory = prvalue(load)
-#-----| -1: [ThisExpr] this
-#-----| Type = [PointerType] S *
-#-----| ValueCategory = prvalue(load)
-# 10| 1: [VariableAccess] y
-# 10| Type = [IntType] int
-# 10| ValueCategory = prvalue(load)
-# 9| [TopLevelFunction] int MemberFunction(int)
+# 9| [FunctionTemplateInstantiation,MemberFunction] int Bad::S::MemberFunction(int)
# 9| params:
# 9| 0: [Parameter] y
# 9| Type = [IntType] int
@@ -116,6 +92,31 @@ bad_asts.cpp:
# 10| 1: [VariableAccess] y
# 10| Type = [IntType] int
# 10| ValueCategory = prvalue(load)
+# 9| [MemberFunction,TemplateFunction] int Bad::S::MemberFunction(int)
+# 9| params:
+# 9| 0: [Parameter] y
+# 9| Type = [IntType] int
+# 9| body: [Block] { ... }
+# 10| 0: [ReturnStmt] return ...
+# 10| 0: [AddExpr] ... + ...
+# 10| Type = [IntType] int
+# 10| ValueCategory = prvalue
+# 10| 0: [AddExpr] ... + ...
+# 10| Type = [IntType] int
+# 10| ValueCategory = prvalue
+# 10| 0: [Literal] t
+# 10| Type = [IntType] int
+# 10| Value = [Literal] t
+# 10| ValueCategory = prvalue
+# 10| 1: [PointerFieldAccess] x
+# 10| Type = [IntType] int
+# 10| ValueCategory = prvalue(load)
+#-----| -1: [ThisExpr] this
+#-----| Type = [PointerType] S *
+#-----| ValueCategory = prvalue(load)
+# 10| 1: [VariableAccess] y
+# 10| Type = [IntType] int
+# 10| ValueCategory = prvalue(load)
# 14| [TopLevelFunction] void Bad::CallBadMemberFunction()
# 14| params:
# 14| body: [Block] { ... }
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 435be4b08d7..bd19489cddb 100644
--- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
@@ -1,4 +1,28 @@
bad_asts.cpp:
+# 9| int Bad::S::MemberFunction(int)
+# 9| Block 0
+# 9| v0_0(void) = EnterFunction :
+# 9| mu0_1(unknown) = AliasedDefinition :
+# 9| mu0_2(unknown) = UnmodeledDefinition :
+# 9| r0_3(glval) = InitializeThis :
+# 9| r0_4(glval) = VariableAddress[y] :
+# 9| mu0_5(int) = InitializeParameter[y] : &:r0_4
+# 10| r0_6(glval) = VariableAddress[#return] :
+# 10| r0_7(int) = Constant[6] :
+#-----| r0_8(S *) = CopyValue : r0_3
+# 10| r0_9(glval) = FieldAddress[x] : r0_8
+# 10| r0_10(int) = Load : &:r0_9, ~mu0_2
+# 10| r0_11(int) = Add : r0_7, r0_10
+# 10| r0_12(glval) = VariableAddress[y] :
+# 10| r0_13(int) = Load : &:r0_12, ~mu0_2
+# 10| r0_14(int) = Add : r0_11, r0_13
+# 10| mu0_15(int) = Store : &:r0_6, r0_14
+# 9| r0_16(glval) = VariableAddress[#return] :
+# 9| v0_17(void) = ReturnValue : &:r0_16, ~mu0_2
+# 9| v0_18(void) = UnmodeledUse : mu*
+# 9| v0_19(void) = AliasedUse : ~mu0_2
+# 9| v0_20(void) = ExitFunction :
+
# 14| void Bad::CallBadMemberFunction()
# 14| Block 0
# 14| v0_0(void) = EnterFunction :
@@ -14,7 +38,7 @@ bad_asts.cpp:
# 16| r0_10(int) = Constant[1] :
# 16| r0_11(int) = Call : func:r0_9, this:r0_8, 0:r0_10
# 16| mu0_12(unknown) = ^CallSideEffect : ~mu0_2
-# 16| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_8, ~mu0_2
+# 16| v0_13(void) = ^BufferReadSideEffect[-1] : &:r0_8, ~mu0_2
# 16| mu0_14(S) = ^IndirectMayWriteSideEffect[-1] : &:r0_8
# 17| v0_15(void) = NoOp :
# 14| v0_16(void) = ReturnVoid :
@@ -2738,8 +2762,8 @@ ir.cpp:
# 585| r0_8(char *) = Convert : r0_7
# 585| v0_9(void) = Call : func:r0_3, 0:r0_5, 1:r0_6, 2:r0_8
# 585| mu0_10(unknown) = ^CallSideEffect : ~mu0_2
-# 585| v0_11(void) = ^IndirectReadSideEffect[0] : &:r0_5, ~mu0_2
-# 585| v0_12(void) = ^IndirectReadSideEffect[2] : &:r0_8, ~mu0_2
+# 585| v0_11(void) = ^BufferReadSideEffect[0] : &:r0_5, ~mu0_2
+# 585| v0_12(void) = ^BufferReadSideEffect[2] : &:r0_8, ~mu0_2
# 585| mu0_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_5
# 585| mu0_14(unknown) = ^BufferMayWriteSideEffect[2] : &:r0_8
# 586| v0_15(void) = NoOp :
@@ -2790,7 +2814,7 @@ ir.cpp:
# 617| v0_14(void) = Call : func:r0_11, this:r0_9, 0:r0_13
# 617| mu0_15(unknown) = ^CallSideEffect : ~mu0_2
# 617| mu0_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_9
-# 617| v0_17(void) = ^IndirectReadSideEffect[0] : &:r0_13, ~mu0_2
+# 617| v0_17(void) = ^BufferReadSideEffect[0] : &:r0_13, ~mu0_2
# 617| mu0_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_13
# 618| r0_19(glval) = VariableAddress[s3] :
# 618| r0_20(glval) = FunctionAddress[ReturnObject] :
@@ -2805,7 +2829,7 @@ ir.cpp:
# 619| v0_29(void) = Call : func:r0_26, this:r0_24, 0:r0_28
# 619| mu0_30(unknown) = ^CallSideEffect : ~mu0_2
# 619| mu0_31(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_24
-# 619| v0_32(void) = ^IndirectReadSideEffect[0] : &:r0_28, ~mu0_2
+# 619| v0_32(void) = ^BufferReadSideEffect[0] : &:r0_28, ~mu0_2
# 619| mu0_33(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_28
# 620| v0_34(void) = NoOp :
# 615| v0_35(void) = ReturnVoid :
@@ -2830,7 +2854,7 @@ ir.cpp:
# 623| r0_12(glval) = FunctionAddress[c_str] :
# 623| r0_13(char *) = Call : func:r0_12, this:r0_11
# 623| mu0_14(unknown) = ^CallSideEffect : ~mu0_2
-# 623| v0_15(void) = ^IndirectReadSideEffect[-1] : &:r0_11, ~mu0_2
+# 623| v0_15(void) = ^BufferReadSideEffect[-1] : &:r0_11, ~mu0_2
# 623| mu0_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_11
# 624| r0_17(glval) = VariableAddress[p] :
# 624| r0_18(String *) = Load : &:r0_17, ~mu0_2
@@ -2838,14 +2862,14 @@ ir.cpp:
# 624| r0_20(glval) = FunctionAddress[c_str] :
# 624| r0_21(char *) = Call : func:r0_20, this:r0_19
# 624| mu0_22(unknown) = ^CallSideEffect : ~mu0_2
-# 624| v0_23(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~mu0_2
+# 624| v0_23(void) = ^BufferReadSideEffect[-1] : &:r0_19, ~mu0_2
# 624| mu0_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_19
# 625| r0_25(glval) = VariableAddress[s] :
# 625| r0_26(glval) = Convert : r0_25
# 625| r0_27(glval) = FunctionAddress[c_str] :
# 625| r0_28(char *) = Call : func:r0_27, this:r0_26
# 625| mu0_29(unknown) = ^CallSideEffect : ~mu0_2
-# 625| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_26, ~mu0_2
+# 625| v0_30(void) = ^BufferReadSideEffect[-1] : &:r0_26, ~mu0_2
# 625| mu0_31(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_26
# 626| v0_32(void) = NoOp :
# 622| v0_33(void) = ReturnVoid :
@@ -2958,21 +2982,21 @@ ir.cpp:
# 653| r0_6(int) = Constant[0] :
# 653| r0_7(int) = Call : func:r0_5, this:r0_4, 0:r0_6
# 653| mu0_8(unknown) = ^CallSideEffect : ~mu0_2
-# 653| v0_9(void) = ^IndirectReadSideEffect[-1] : &:r0_4, ~mu0_2
+# 653| v0_9(void) = ^BufferReadSideEffect[-1] : &:r0_4, ~mu0_2
# 653| mu0_10(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_4
# 654| r0_11(C *) = CopyValue : r0_3
# 654| r0_12(glval) = FunctionAddress[InstanceMemberFunction] :
# 654| r0_13(int) = Constant[1] :
# 654| r0_14(int) = Call : func:r0_12, this:r0_11, 0:r0_13
# 654| mu0_15(unknown) = ^CallSideEffect : ~mu0_2
-# 654| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_11, ~mu0_2
+# 654| v0_16(void) = ^BufferReadSideEffect[-1] : &:r0_11, ~mu0_2
# 654| mu0_17(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_11
#-----| r0_18(C *) = CopyValue : r0_3
# 655| r0_19(glval) = FunctionAddress[InstanceMemberFunction] :
# 655| r0_20(int) = Constant[2] :
# 655| r0_21(int) = Call : func:r0_19, this:r0_18, 0:r0_20
# 655| mu0_22(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_23(void) = ^IndirectReadSideEffect[-1] : &:r0_18, ~mu0_2
+#-----| v0_23(void) = ^BufferReadSideEffect[-1] : &:r0_18, ~mu0_2
#-----| mu0_24(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_18
# 656| v0_25(void) = NoOp :
# 652| v0_26(void) = ReturnVoid :
@@ -3007,7 +3031,7 @@ ir.cpp:
# 662| v0_22(void) = Call : func:r0_19, this:r0_18, 0:r0_21
# 662| mu0_23(unknown) = ^CallSideEffect : ~mu0_2
# 662| mu0_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_18
-# 662| v0_25(void) = ^IndirectReadSideEffect[0] : &:r0_21, ~mu0_2
+# 662| v0_25(void) = ^BufferReadSideEffect[0] : &:r0_21, ~mu0_2
# 662| mu0_26(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_21
# 664| v0_27(void) = NoOp :
# 658| v0_28(void) = ReturnVoid :
@@ -3216,7 +3240,7 @@ ir.cpp:
# 721| r0_6(char) = Constant[111] :
# 721| r0_7(long) = Call : func:r0_4, 0:r0_5, 1:r0_6
# 721| mu0_8(unknown) = ^CallSideEffect : ~mu0_2
-# 721| v0_9(void) = ^IndirectReadSideEffect[0] : &:r0_5, ~mu0_2
+# 721| v0_9(void) = ^BufferReadSideEffect[0] : &:r0_5, ~mu0_2
# 721| mu0_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_5
# 721| r0_11(double) = Convert : r0_7
# 721| mu0_12(double) = Store : &:r0_3, r0_11
@@ -3293,7 +3317,7 @@ ir.cpp:
# 731| v7_4(void) = Call : func:r7_1, this:r7_0, 0:r7_3
# 731| mu7_5(unknown) = ^CallSideEffect : ~mu0_2
# 731| mu7_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r7_0
-# 731| v7_7(void) = ^IndirectReadSideEffect[0] : &:r7_3, ~mu0_2
+# 731| v7_7(void) = ^BufferReadSideEffect[0] : &:r7_3, ~mu0_2
# 731| mu7_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r7_3
# 731| v7_9(void) = ThrowValue : &:r7_0, ~mu0_2
#-----| Exception -> Block 9
@@ -3319,7 +3343,7 @@ ir.cpp:
# 736| v10_6(void) = Call : func:r10_3, this:r10_2, 0:r10_5
# 736| mu10_7(unknown) = ^CallSideEffect : ~mu0_2
# 736| mu10_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r10_2
-# 736| v10_9(void) = ^IndirectReadSideEffect[0] : &:r10_5, ~mu0_2
+# 736| v10_9(void) = ^BufferReadSideEffect[0] : &:r10_5, ~mu0_2
# 736| mu10_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r10_5
# 736| v10_11(void) = ThrowValue : &:r10_2, ~mu0_2
#-----| Exception -> Block 2
@@ -3361,8 +3385,8 @@ ir.cpp:
#-----| r0_11(glval) = FieldAddress[base_s] : r0_10
# 745| r0_12(String &) = Call : func:r0_8, this:r0_7, 0:r0_11
# 745| mu0_13(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~mu0_2
-#-----| v0_15(void) = ^IndirectReadSideEffect[0] : &:r0_11, ~mu0_2
+#-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~mu0_2
+#-----| v0_15(void) = ^BufferReadSideEffect[0] : &:r0_11, ~mu0_2
#-----| mu0_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_7
#-----| mu0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_11
#-----| r0_18(glval) = VariableAddress[#return] :
@@ -3442,8 +3466,8 @@ ir.cpp:
#-----| r0_11(Base *) = ConvertToBase[Middle : Base] : r0_10
# 754| r0_12(Base &) = Call : func:r0_8, this:r0_7, 0:r0_11
# 754| mu0_13(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~mu0_2
-#-----| v0_15(void) = ^IndirectReadSideEffect[0] : &:r0_11, ~mu0_2
+#-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~mu0_2
+#-----| v0_15(void) = ^BufferReadSideEffect[0] : &:r0_11, ~mu0_2
#-----| mu0_16(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_7
#-----| mu0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_11
#-----| r0_18(Middle *) = CopyValue : r0_3
@@ -3454,8 +3478,8 @@ ir.cpp:
#-----| r0_23(glval) = FieldAddress[middle_s] : r0_22
# 754| r0_24(String &) = Call : func:r0_20, this:r0_19, 0:r0_23
# 754| mu0_25(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~mu0_2
-#-----| v0_27(void) = ^IndirectReadSideEffect[0] : &:r0_23, ~mu0_2
+#-----| v0_26(void) = ^BufferReadSideEffect[-1] : &:r0_19, ~mu0_2
+#-----| v0_27(void) = ^BufferReadSideEffect[0] : &:r0_23, ~mu0_2
#-----| mu0_28(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_19
#-----| mu0_29(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_23
#-----| r0_30(glval) = VariableAddress[#return] :
@@ -3525,8 +3549,8 @@ ir.cpp:
#-----| r0_11(Middle *) = ConvertToBase[Derived : Middle] : r0_10
# 763| r0_12(Middle &) = Call : func:r0_8, this:r0_7, 0:r0_11
# 763| mu0_13(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~mu0_2
-#-----| v0_15(void) = ^IndirectReadSideEffect[0] : &:r0_11, ~mu0_2
+#-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~mu0_2
+#-----| v0_15(void) = ^BufferReadSideEffect[0] : &:r0_11, ~mu0_2
#-----| mu0_16(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_7
#-----| mu0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_11
#-----| r0_18(Derived *) = CopyValue : r0_3
@@ -3537,8 +3561,8 @@ ir.cpp:
#-----| r0_23(glval) = FieldAddress[derived_s] : r0_22
# 763| r0_24(String &) = Call : func:r0_20, this:r0_19, 0:r0_23
# 763| mu0_25(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_26(void) = ^IndirectReadSideEffect[-1] : &:r0_19, ~mu0_2
-#-----| v0_27(void) = ^IndirectReadSideEffect[0] : &:r0_23, ~mu0_2
+#-----| v0_26(void) = ^BufferReadSideEffect[-1] : &:r0_19, ~mu0_2
+#-----| v0_27(void) = ^BufferReadSideEffect[0] : &:r0_23, ~mu0_2
#-----| mu0_28(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_19
#-----| mu0_29(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_23
#-----| r0_30(glval) = VariableAddress[#return] :
@@ -3774,8 +3798,8 @@ ir.cpp:
# 808| r0_33(glval) = ConvertToBase[Middle : Base] : r0_32
# 808| r0_34(Base &) = Call : func:r0_31, this:r0_30, 0:r0_33
# 808| mu0_35(unknown) = ^CallSideEffect : ~mu0_2
-# 808| v0_36(void) = ^IndirectReadSideEffect[-1] : &:r0_30, ~mu0_2
-# 808| v0_37(void) = ^IndirectReadSideEffect[0] : &:r0_33, ~mu0_2
+# 808| v0_36(void) = ^BufferReadSideEffect[-1] : &:r0_30, ~mu0_2
+# 808| v0_37(void) = ^BufferReadSideEffect[0] : &:r0_33, ~mu0_2
# 808| mu0_38(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_30
# 808| mu0_39(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_33
# 809| r0_40(glval) = VariableAddress[b] :
@@ -3786,13 +3810,13 @@ ir.cpp:
# 809| v0_45(void) = Call : func:r0_42, 0:r0_44
# 809| mu0_46(unknown) = ^CallSideEffect : ~mu0_2
# 809| mu0_47(Base) = ^IndirectMayWriteSideEffect[-1] :
-# 809| v0_48(void) = ^IndirectReadSideEffect[0] : &:r0_44, ~mu0_2
+# 809| v0_48(void) = ^BufferReadSideEffect[0] : &:r0_44, ~mu0_2
# 809| mu0_49(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_44
# 809| r0_50(glval) = Convert : v0_45
# 809| r0_51(Base &) = Call : func:r0_41, this:r0_40, 0:r0_50
# 809| mu0_52(unknown) = ^CallSideEffect : ~mu0_2
-# 809| v0_53(void) = ^IndirectReadSideEffect[-1] : &:r0_40, ~mu0_2
-# 809| v0_54(void) = ^IndirectReadSideEffect[0] : &:r0_50, ~mu0_2
+# 809| v0_53(void) = ^BufferReadSideEffect[-1] : &:r0_40, ~mu0_2
+# 809| v0_54(void) = ^BufferReadSideEffect[0] : &:r0_50, ~mu0_2
# 809| mu0_55(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_40
# 809| mu0_56(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_50
# 810| r0_57(glval) = VariableAddress[b] :
@@ -3803,13 +3827,13 @@ ir.cpp:
# 810| v0_62(void) = Call : func:r0_59, 0:r0_61
# 810| mu0_63(unknown) = ^CallSideEffect : ~mu0_2
# 810| mu0_64(Base) = ^IndirectMayWriteSideEffect[-1] :
-# 810| v0_65(void) = ^IndirectReadSideEffect[0] : &:r0_61, ~mu0_2
+# 810| v0_65(void) = ^BufferReadSideEffect[0] : &:r0_61, ~mu0_2
# 810| mu0_66(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_61
# 810| r0_67(glval) = Convert : v0_62
# 810| r0_68(Base &) = Call : func:r0_58, this:r0_57, 0:r0_67
# 810| mu0_69(unknown) = ^CallSideEffect : ~mu0_2
-# 810| v0_70(void) = ^IndirectReadSideEffect[-1] : &:r0_57, ~mu0_2
-# 810| v0_71(void) = ^IndirectReadSideEffect[0] : &:r0_67, ~mu0_2
+# 810| v0_70(void) = ^BufferReadSideEffect[-1] : &:r0_57, ~mu0_2
+# 810| v0_71(void) = ^BufferReadSideEffect[0] : &:r0_67, ~mu0_2
# 810| mu0_72(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_57
# 810| mu0_73(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_67
# 811| r0_74(glval) = VariableAddress[pm] :
@@ -3839,8 +3863,8 @@ ir.cpp:
# 816| r0_98(glval) = Convert : r0_97
# 816| r0_99(Middle &) = Call : func:r0_95, this:r0_94, 0:r0_98
# 816| mu0_100(unknown) = ^CallSideEffect : ~mu0_2
-# 816| v0_101(void) = ^IndirectReadSideEffect[-1] : &:r0_94, ~mu0_2
-# 816| v0_102(void) = ^IndirectReadSideEffect[0] : &:r0_98, ~mu0_2
+# 816| v0_101(void) = ^BufferReadSideEffect[-1] : &:r0_94, ~mu0_2
+# 816| v0_102(void) = ^BufferReadSideEffect[0] : &:r0_98, ~mu0_2
# 816| mu0_103(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_94
# 816| mu0_104(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_98
# 817| r0_105(glval) = VariableAddress[m] :
@@ -3850,8 +3874,8 @@ ir.cpp:
# 817| r0_109(glval) = Convert : r0_108
# 817| r0_110(Middle &) = Call : func:r0_106, this:r0_105, 0:r0_109
# 817| mu0_111(unknown) = ^CallSideEffect : ~mu0_2
-# 817| v0_112(void) = ^IndirectReadSideEffect[-1] : &:r0_105, ~mu0_2
-# 817| v0_113(void) = ^IndirectReadSideEffect[0] : &:r0_109, ~mu0_2
+# 817| v0_112(void) = ^BufferReadSideEffect[-1] : &:r0_105, ~mu0_2
+# 817| v0_113(void) = ^BufferReadSideEffect[0] : &:r0_109, ~mu0_2
# 817| mu0_114(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_105
# 817| mu0_115(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_109
# 818| r0_116(glval) = VariableAddress[pb] :
@@ -3876,8 +3900,8 @@ ir.cpp:
# 822| r0_135(glval) = ConvertToBase[Middle : Base] : r0_134
# 822| r0_136(Base &) = Call : func:r0_132, this:r0_131, 0:r0_135
# 822| mu0_137(unknown) = ^CallSideEffect : ~mu0_2
-# 822| v0_138(void) = ^IndirectReadSideEffect[-1] : &:r0_131, ~mu0_2
-# 822| v0_139(void) = ^IndirectReadSideEffect[0] : &:r0_135, ~mu0_2
+# 822| v0_138(void) = ^BufferReadSideEffect[-1] : &:r0_131, ~mu0_2
+# 822| v0_139(void) = ^BufferReadSideEffect[0] : &:r0_135, ~mu0_2
# 822| mu0_140(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_131
# 822| mu0_141(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_135
# 823| r0_142(glval) = VariableAddress[b] :
@@ -3889,13 +3913,13 @@ ir.cpp:
# 823| v0_148(void) = Call : func:r0_144, 0:r0_147
# 823| mu0_149(unknown) = ^CallSideEffect : ~mu0_2
# 823| mu0_150(Base) = ^IndirectMayWriteSideEffect[-1] :
-# 823| v0_151(void) = ^IndirectReadSideEffect[0] : &:r0_147, ~mu0_2
+# 823| v0_151(void) = ^BufferReadSideEffect[0] : &:r0_147, ~mu0_2
# 823| mu0_152(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_147
# 823| r0_153(glval) = Convert : v0_148
# 823| r0_154(Base &) = Call : func:r0_143, this:r0_142, 0:r0_153
# 823| mu0_155(unknown) = ^CallSideEffect : ~mu0_2
-# 823| v0_156(void) = ^IndirectReadSideEffect[-1] : &:r0_142, ~mu0_2
-# 823| v0_157(void) = ^IndirectReadSideEffect[0] : &:r0_153, ~mu0_2
+# 823| v0_156(void) = ^BufferReadSideEffect[-1] : &:r0_142, ~mu0_2
+# 823| v0_157(void) = ^BufferReadSideEffect[0] : &:r0_153, ~mu0_2
# 823| mu0_158(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_142
# 823| mu0_159(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_153
# 824| r0_160(glval) = VariableAddress[b] :
@@ -3907,13 +3931,13 @@ ir.cpp:
# 824| v0_166(void) = Call : func:r0_162, 0:r0_165
# 824| mu0_167(unknown) = ^CallSideEffect : ~mu0_2
# 824| mu0_168(Base) = ^IndirectMayWriteSideEffect[-1] :
-# 824| v0_169(void) = ^IndirectReadSideEffect[0] : &:r0_165, ~mu0_2
+# 824| v0_169(void) = ^BufferReadSideEffect[0] : &:r0_165, ~mu0_2
# 824| mu0_170(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_165
# 824| r0_171(glval) = Convert : v0_166
# 824| r0_172(Base &) = Call : func:r0_161, this:r0_160, 0:r0_171
# 824| mu0_173(unknown) = ^CallSideEffect : ~mu0_2
-# 824| v0_174(void) = ^IndirectReadSideEffect[-1] : &:r0_160, ~mu0_2
-# 824| v0_175(void) = ^IndirectReadSideEffect[0] : &:r0_171, ~mu0_2
+# 824| v0_174(void) = ^BufferReadSideEffect[-1] : &:r0_160, ~mu0_2
+# 824| v0_175(void) = ^BufferReadSideEffect[0] : &:r0_171, ~mu0_2
# 824| mu0_176(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_160
# 824| mu0_177(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_171
# 825| r0_178(glval) = VariableAddress[pd] :
@@ -3947,8 +3971,8 @@ ir.cpp:
# 830| r0_206(glval) = Convert : r0_205
# 830| r0_207(Derived &) = Call : func:r0_202, this:r0_201, 0:r0_206
# 830| mu0_208(unknown) = ^CallSideEffect : ~mu0_2
-# 830| v0_209(void) = ^IndirectReadSideEffect[-1] : &:r0_201, ~mu0_2
-# 830| v0_210(void) = ^IndirectReadSideEffect[0] : &:r0_206, ~mu0_2
+# 830| v0_209(void) = ^BufferReadSideEffect[-1] : &:r0_201, ~mu0_2
+# 830| v0_210(void) = ^BufferReadSideEffect[0] : &:r0_206, ~mu0_2
# 830| mu0_211(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r0_201
# 830| mu0_212(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_206
# 831| r0_213(glval) = VariableAddress[d] :
@@ -3959,8 +3983,8 @@ ir.cpp:
# 831| r0_218(glval) = Convert : r0_217
# 831| r0_219(Derived &) = Call : func:r0_214, this:r0_213, 0:r0_218
# 831| mu0_220(unknown) = ^CallSideEffect : ~mu0_2
-# 831| v0_221(void) = ^IndirectReadSideEffect[-1] : &:r0_213, ~mu0_2
-# 831| v0_222(void) = ^IndirectReadSideEffect[0] : &:r0_218, ~mu0_2
+# 831| v0_221(void) = ^BufferReadSideEffect[-1] : &:r0_213, ~mu0_2
+# 831| v0_222(void) = ^BufferReadSideEffect[0] : &:r0_218, ~mu0_2
# 831| mu0_223(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r0_213
# 831| mu0_224(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_218
# 832| r0_225(glval) = VariableAddress[pb] :
@@ -4116,7 +4140,7 @@ ir.cpp:
# 868| v0_7(void) = Call : func:r0_4, this:r0_3, 0:r0_6
# 868| mu0_8(unknown) = ^CallSideEffect : ~mu0_2
# 868| mu0_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_3
-# 868| v0_10(void) = ^IndirectReadSideEffect[0] : &:r0_6, ~mu0_2
+# 868| v0_10(void) = ^BufferReadSideEffect[0] : &:r0_6, ~mu0_2
# 868| mu0_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_6
# 869| v0_12(void) = NoOp :
# 867| v0_13(void) = ReturnVoid :
@@ -4341,7 +4365,7 @@ ir.cpp:
# 945| v0_39(void) = Call : func:r0_36, this:r0_35, 0:r0_38
# 945| mu0_40(unknown) = ^CallSideEffect : ~mu0_2
# 945| mu0_41(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_35
-# 945| v0_42(void) = ^IndirectReadSideEffect[0] : &:r0_38, ~mu0_2
+# 945| v0_42(void) = ^BufferReadSideEffect[0] : &:r0_38, ~mu0_2
# 945| mu0_43(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_38
# 946| r0_44(glval) = FunctionAddress[operator new] :
# 946| r0_45(unsigned long) = Constant[256] :
@@ -4842,7 +4866,7 @@ ir.cpp:
# 1035| r0_28(float) = Constant[1.0] :
# 1035| r0_29(char) = Call : func:r0_27, this:r0_26, 0:r0_28
# 1035| mu0_30(unknown) = ^CallSideEffect : ~mu0_2
-# 1035| v0_31(void) = ^IndirectReadSideEffect[-1] : &:r0_26, ~mu0_2
+# 1035| v0_31(void) = ^BufferReadSideEffect[-1] : &:r0_26, ~mu0_2
# 1035| mu0_32(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r0_26
# 1036| r0_33(glval) = VariableAddress[lambda_val] :
# 1036| mu0_34(decltype([...](...){...})) = Uninitialized[lambda_val] : &:r0_33
@@ -4862,7 +4886,7 @@ ir.cpp:
# 1036| v0_48(void) = Call : func:r0_35, this:r0_33, 0:r0_47
# 1036| mu0_49(unknown) = ^CallSideEffect : ~mu0_2
# 1036| mu0_50(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r0_33
-# 1036| v0_51(void) = ^IndirectReadSideEffect[0] : &:r0_47, ~mu0_2
+# 1036| v0_51(void) = ^BufferReadSideEffect[0] : &:r0_47, ~mu0_2
# 1036| mu0_52(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_47
# 1037| r0_53(glval) = VariableAddress[lambda_val] :
# 1037| r0_54(glval) = Convert : r0_53
@@ -4870,7 +4894,7 @@ ir.cpp:
# 1037| r0_56(float) = Constant[2.0] :
# 1037| r0_57(char) = Call : func:r0_55, this:r0_54, 0:r0_56
# 1037| mu0_58(unknown) = ^CallSideEffect : ~mu0_2
-# 1037| v0_59(void) = ^IndirectReadSideEffect[-1] : &:r0_54, ~mu0_2
+# 1037| v0_59(void) = ^BufferReadSideEffect[-1] : &:r0_54, ~mu0_2
# 1037| mu0_60(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r0_54
# 1038| r0_61(glval) = VariableAddress[lambda_ref_explicit] :
# 1038| r0_62(glval) = VariableAddress[#temp1038:30] :
@@ -4887,7 +4911,7 @@ ir.cpp:
# 1039| r0_73(float) = Constant[3.0] :
# 1039| r0_74(char) = Call : func:r0_72, this:r0_71, 0:r0_73
# 1039| mu0_75(unknown) = ^CallSideEffect : ~mu0_2
-# 1039| v0_76(void) = ^IndirectReadSideEffect[-1] : &:r0_71, ~mu0_2
+# 1039| v0_76(void) = ^BufferReadSideEffect[-1] : &:r0_71, ~mu0_2
# 1039| mu0_77(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r0_71
# 1040| r0_78(glval) = VariableAddress[lambda_val_explicit] :
# 1040| mu0_79(decltype([...](...){...})) = Uninitialized[lambda_val_explicit] : &:r0_78
@@ -4903,7 +4927,7 @@ ir.cpp:
# 1040| v0_89(void) = Call : func:r0_80, this:r0_78, 0:r0_88
# 1040| mu0_90(unknown) = ^CallSideEffect : ~mu0_2
# 1040| mu0_91(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r0_78
-# 1040| v0_92(void) = ^IndirectReadSideEffect[0] : &:r0_88, ~mu0_2
+# 1040| v0_92(void) = ^BufferReadSideEffect[0] : &:r0_88, ~mu0_2
# 1040| mu0_93(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_88
# 1041| r0_94(glval) = VariableAddress[lambda_val_explicit] :
# 1041| r0_95(glval) = Convert : r0_94
@@ -4911,7 +4935,7 @@ ir.cpp:
# 1041| r0_97(float) = Constant[4.0] :
# 1041| r0_98(char) = Call : func:r0_96, this:r0_95, 0:r0_97
# 1041| mu0_99(unknown) = ^CallSideEffect : ~mu0_2
-# 1041| v0_100(void) = ^IndirectReadSideEffect[-1] : &:r0_95, ~mu0_2
+# 1041| v0_100(void) = ^BufferReadSideEffect[-1] : &:r0_95, ~mu0_2
# 1041| mu0_101(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r0_95
# 1042| r0_102(glval) = VariableAddress[lambda_mixed_explicit] :
# 1042| r0_103(glval) = VariableAddress[#temp1042:32] :
@@ -4932,7 +4956,7 @@ ir.cpp:
# 1043| r0_118(float) = Constant[5.0] :
# 1043| r0_119(char) = Call : func:r0_117, this:r0_116, 0:r0_118
# 1043| mu0_120(unknown) = ^CallSideEffect : ~mu0_2
-# 1043| v0_121(void) = ^IndirectReadSideEffect[-1] : &:r0_116, ~mu0_2
+# 1043| v0_121(void) = ^BufferReadSideEffect[-1] : &:r0_116, ~mu0_2
# 1043| mu0_122(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r0_116
# 1044| r0_123(glval) = VariableAddress[r] :
# 1044| r0_124(glval) = VariableAddress[x] :
@@ -4968,7 +4992,7 @@ ir.cpp:
# 1046| r0_154(float) = Constant[6.0] :
# 1046| r0_155(char) = Call : func:r0_153, this:r0_152, 0:r0_154
# 1046| mu0_156(unknown) = ^CallSideEffect : ~mu0_2
-# 1046| v0_157(void) = ^IndirectReadSideEffect[-1] : &:r0_152, ~mu0_2
+# 1046| v0_157(void) = ^BufferReadSideEffect[-1] : &:r0_152, ~mu0_2
# 1046| mu0_158(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r0_152
# 1047| v0_159(void) = NoOp :
# 1031| v0_160(void) = ReturnVoid :
@@ -5037,7 +5061,7 @@ ir.cpp:
# 1034| r0_10(glval) = FunctionAddress[c_str] :
# 1034| r0_11(char *) = Call : func:r0_10, this:r0_9
# 1034| mu0_12(unknown) = ^CallSideEffect : ~mu0_2
-# 1034| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~mu0_2
+# 1034| v0_13(void) = ^BufferReadSideEffect[-1] : &:r0_9, ~mu0_2
# 1034| mu0_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_9
#-----| r0_15(lambda [] type at line 1034, col. 21 *) = CopyValue : r0_3
#-----| r0_16(glval) = FieldAddress[x] : r0_15
@@ -5082,7 +5106,7 @@ ir.cpp:
# 1036| r0_9(glval) = FunctionAddress[c_str] :
# 1036| r0_10(char *) = Call : func:r0_9, this:r0_8
# 1036| mu0_11(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_12(void) = ^IndirectReadSideEffect[-1] : &:r0_8, ~mu0_2
+#-----| v0_12(void) = ^BufferReadSideEffect[-1] : &:r0_8, ~mu0_2
#-----| mu0_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_8
#-----| r0_14(lambda [] type at line 1036, col. 21 *) = CopyValue : r0_3
#-----| r0_15(glval) = FieldAddress[x] : r0_14
@@ -5111,7 +5135,7 @@ ir.cpp:
# 1038| r0_10(glval) = FunctionAddress[c_str] :
# 1038| r0_11(char *) = Call : func:r0_10, this:r0_9
# 1038| mu0_12(unknown) = ^CallSideEffect : ~mu0_2
-# 1038| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~mu0_2
+# 1038| v0_13(void) = ^BufferReadSideEffect[-1] : &:r0_9, ~mu0_2
# 1038| mu0_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_9
# 1038| r0_15(int) = Constant[0] :
# 1038| r0_16(glval) = PointerAdd[1] : r0_11, r0_15
@@ -5172,7 +5196,7 @@ ir.cpp:
# 1040| r0_9(glval) = FunctionAddress[c_str] :
# 1040| r0_10(char *) = Call : func:r0_9, this:r0_8
# 1040| mu0_11(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_12(void) = ^IndirectReadSideEffect[-1] : &:r0_8, ~mu0_2
+#-----| v0_12(void) = ^BufferReadSideEffect[-1] : &:r0_8, ~mu0_2
#-----| mu0_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_8
# 1040| r0_14(int) = Constant[0] :
# 1040| r0_15(glval) = PointerAdd[1] : r0_10, r0_14
@@ -5199,7 +5223,7 @@ ir.cpp:
# 1042| r0_10(glval) = FunctionAddress[c_str] :
# 1042| r0_11(char *) = Call : func:r0_10, this:r0_9
# 1042| mu0_12(unknown) = ^CallSideEffect : ~mu0_2
-# 1042| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~mu0_2
+# 1042| v0_13(void) = ^BufferReadSideEffect[-1] : &:r0_9, ~mu0_2
# 1042| mu0_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_9
#-----| r0_15(lambda [] type at line 1042, col. 32 *) = CopyValue : r0_3
#-----| r0_16(glval) = FieldAddress[x] : r0_15
@@ -5228,7 +5252,7 @@ ir.cpp:
# 1045| r0_10(glval) = FunctionAddress[c_str] :
# 1045| r0_11(char *) = Call : func:r0_10, this:r0_9
# 1045| mu0_12(unknown) = ^CallSideEffect : ~mu0_2
-# 1045| v0_13(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~mu0_2
+# 1045| v0_13(void) = ^BufferReadSideEffect[-1] : &:r0_9, ~mu0_2
# 1045| mu0_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_9
#-----| r0_15(lambda [] type at line 1045, col. 23 *) = CopyValue : r0_3
#-----| r0_16(glval) = FieldAddress[x] : r0_15
@@ -5268,7 +5292,7 @@ ir.cpp:
# 1069| r0_12(glval) = FunctionAddress[begin] :
# 1069| r0_13(iterator) = Call : func:r0_12, this:r0_11
# 1069| mu0_14(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_15(void) = ^IndirectReadSideEffect[-1] : &:r0_11, ~mu0_2
+#-----| v0_15(void) = ^BufferReadSideEffect[-1] : &:r0_11, ~mu0_2
#-----| mu0_16(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_11
# 1069| mu0_17(iterator) = Store : &:r0_9, r0_13
# 1069| r0_18(glval) = VariableAddress[(__end)] :
@@ -5277,7 +5301,7 @@ ir.cpp:
# 1069| r0_21(glval) = FunctionAddress[end] :
# 1069| r0_22(iterator) = Call : func:r0_21, this:r0_20
# 1069| mu0_23(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v0_24(void) = ^IndirectReadSideEffect[-1] : &:r0_20, ~mu0_2
+#-----| v0_24(void) = ^BufferReadSideEffect[-1] : &:r0_20, ~mu0_2
#-----| mu0_25(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_20
# 1069| mu0_26(iterator) = Store : &:r0_18, r0_22
#-----| Goto -> Block 4
@@ -5289,7 +5313,7 @@ ir.cpp:
# 1075| r1_3(glval) = FunctionAddress[operator*] :
# 1075| r1_4(int &) = Call : func:r1_3, this:r1_2
# 1075| mu1_5(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v1_6(void) = ^IndirectReadSideEffect[-1] : &:r1_2, ~mu0_2
+#-----| v1_6(void) = ^BufferReadSideEffect[-1] : &:r1_2, ~mu0_2
#-----| mu1_7(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r1_2
# 1075| r1_8(glval) = Convert : r1_4
# 1075| mu1_9(int &) = Store : &:r1_0, r1_8
@@ -5322,7 +5346,7 @@ ir.cpp:
#-----| r4_4(iterator) = Load : &:r4_3, ~mu0_2
# 1069| r4_5(bool) = Call : func:r4_2, this:r4_1, 0:r4_4
# 1069| mu4_6(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v4_7(void) = ^IndirectReadSideEffect[-1] : &:r4_1, ~mu0_2
+#-----| v4_7(void) = ^BufferReadSideEffect[-1] : &:r4_1, ~mu0_2
#-----| mu4_8(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r4_1
# 1069| v4_9(void) = ConditionalBranch : r4_5
#-----| False -> Block 8
@@ -5335,7 +5359,7 @@ ir.cpp:
# 1069| r5_3(glval) = FunctionAddress[operator*] :
# 1069| r5_4(int &) = Call : func:r5_3, this:r5_2
# 1069| mu5_5(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v5_6(void) = ^IndirectReadSideEffect[-1] : &:r5_2, ~mu0_2
+#-----| v5_6(void) = ^BufferReadSideEffect[-1] : &:r5_2, ~mu0_2
#-----| mu5_7(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r5_2
# 1069| r5_8(int) = Load : &:r5_4, ~mu0_2
# 1069| mu5_9(int) = Store : &:r5_0, r5_8
@@ -5357,7 +5381,7 @@ ir.cpp:
# 1069| r7_2(glval) = FunctionAddress[operator++] :
# 1069| r7_3(iterator &) = Call : func:r7_2, this:r7_1
# 1069| mu7_4(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v7_5(void) = ^IndirectReadSideEffect[-1] : &:r7_1, ~mu0_2
+#-----| v7_5(void) = ^BufferReadSideEffect[-1] : &:r7_1, ~mu0_2
#-----| mu7_6(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r7_1
#-----| Goto (back edge) -> Block 4
@@ -5372,7 +5396,7 @@ ir.cpp:
# 1075| r8_7(glval) = FunctionAddress[begin] :
# 1075| r8_8(iterator) = Call : func:r8_7, this:r8_6
# 1075| mu8_9(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v8_10(void) = ^IndirectReadSideEffect[-1] : &:r8_6, ~mu0_2
+#-----| v8_10(void) = ^BufferReadSideEffect[-1] : &:r8_6, ~mu0_2
#-----| mu8_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r8_6
# 1075| mu8_12(iterator) = Store : &:r8_4, r8_8
# 1075| r8_13(glval) = VariableAddress[(__end)] :
@@ -5381,7 +5405,7 @@ ir.cpp:
# 1075| r8_16(glval) = FunctionAddress[end] :
# 1075| r8_17(iterator) = Call : func:r8_16, this:r8_15
# 1075| mu8_18(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v8_19(void) = ^IndirectReadSideEffect[-1] : &:r8_15, ~mu0_2
+#-----| v8_19(void) = ^BufferReadSideEffect[-1] : &:r8_15, ~mu0_2
#-----| mu8_20(vector) = ^IndirectMayWriteSideEffect[-1] : &:r8_15
# 1075| mu8_21(iterator) = Store : &:r8_13, r8_17
#-----| Goto -> Block 9
@@ -5394,7 +5418,7 @@ ir.cpp:
#-----| r9_4(iterator) = Load : &:r9_3, ~mu0_2
# 1075| r9_5(bool) = Call : func:r9_2, this:r9_1, 0:r9_4
# 1075| mu9_6(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v9_7(void) = ^IndirectReadSideEffect[-1] : &:r9_1, ~mu0_2
+#-----| v9_7(void) = ^BufferReadSideEffect[-1] : &:r9_1, ~mu0_2
#-----| mu9_8(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r9_1
# 1075| v9_9(void) = ConditionalBranch : r9_5
#-----| False -> Block 3
@@ -5405,7 +5429,7 @@ ir.cpp:
# 1075| r10_1(glval) = FunctionAddress[operator++] :
# 1075| r10_2(iterator &) = Call : func:r10_1, this:r10_0
# 1075| mu10_3(unknown) = ^CallSideEffect : ~mu0_2
-#-----| v10_4(void) = ^IndirectReadSideEffect[-1] : &:r10_0, ~mu0_2
+#-----| v10_4(void) = ^BufferReadSideEffect[-1] : &:r10_0, ~mu0_2
#-----| mu10_5(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r10_0
#-----| Goto (back edge) -> Block 9
@@ -5574,7 +5598,7 @@ ir.cpp:
# 1140| v7_4(void) = Call : func:r7_1, this:r7_0, 0:r7_3
# 1140| mu7_5(unknown) = ^CallSideEffect : ~mu0_2
# 1140| mu7_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r7_0
-# 1140| v7_7(void) = ^IndirectReadSideEffect[0] : &:r7_3, ~mu0_2
+# 1140| v7_7(void) = ^BufferReadSideEffect[0] : &:r7_3, ~mu0_2
# 1140| mu7_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r7_3
# 1140| v7_9(void) = ThrowValue : &:r7_0, ~mu0_2
#-----| Exception -> Block 9
@@ -5600,7 +5624,7 @@ ir.cpp:
# 1145| v10_6(void) = Call : func:r10_3, this:r10_2, 0:r10_5
# 1145| mu10_7(unknown) = ^CallSideEffect : ~mu0_2
# 1145| mu10_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r10_2
-# 1145| v10_9(void) = ^IndirectReadSideEffect[0] : &:r10_5, ~mu0_2
+# 1145| v10_9(void) = ^BufferReadSideEffect[0] : &:r10_5, ~mu0_2
# 1145| mu10_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r10_5
# 1145| v10_11(void) = ThrowValue : &:r10_2, ~mu0_2
#-----| Exception -> Block 2
diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected
index 6b2268e705d..035ac8c7a9f 100644
--- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected
@@ -334,7 +334,7 @@ ssa.cpp:
# 97| v0_13(void) = Call : func:r0_10, 0:r0_12
# 97| m0_14(unknown) = ^CallSideEffect : ~m0_5
# 97| m0_15(unknown) = Chi : total:m0_5, partial:m0_14
-# 97| v0_16(void) = ^IndirectReadSideEffect[0] : &:r0_12, ~m0_15
+# 97| v0_16(void) = ^BufferReadSideEffect[0] : &:r0_12, ~m0_15
# 97| m0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_12
# 97| m0_18(unknown) = Chi : total:m0_15, partial:m0_17
# 98| v0_19(void) = NoOp :
@@ -390,7 +390,7 @@ ssa.cpp:
# 108| v0_19(void) = Call : func:r0_16, 0:r0_18
# 108| m0_20(unknown) = ^CallSideEffect : ~m0_5
# 108| m0_21(unknown) = Chi : total:m0_5, partial:m0_20
-# 108| v0_22(void) = ^IndirectReadSideEffect[0] : &:r0_18, ~m0_21
+# 108| v0_22(void) = ^BufferReadSideEffect[0] : &:r0_18, ~m0_21
# 108| m0_23(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_18
# 108| m0_24(unknown) = Chi : total:m0_21, partial:m0_23
# 109| v0_25(void) = NoOp :
@@ -462,7 +462,7 @@ ssa.cpp:
# 119| v0_27(void) = Call : func:r0_24, 0:r0_26
# 119| m0_28(unknown) = ^CallSideEffect : ~m0_19
# 119| m0_29(unknown) = Chi : total:m0_19, partial:m0_28
-# 119| v0_30(void) = ^IndirectReadSideEffect[0] : &:r0_26, ~m0_29
+# 119| v0_30(void) = ^BufferReadSideEffect[0] : &:r0_26, ~m0_29
# 119| m0_31(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_26
# 119| m0_32(unknown) = Chi : total:m0_29, partial:m0_31
# 120| v0_33(void) = NoOp :
@@ -915,7 +915,7 @@ ssa.cpp:
# 221| v0_14(void) = Call : func:r0_13, this:r0_12
# 221| m0_15(unknown) = ^CallSideEffect : ~m0_9
# 221| m0_16(unknown) = Chi : total:m0_9, partial:m0_15
-# 221| v0_17(void) = ^IndirectReadSideEffect[-1] : &:r0_12, m0_11
+# 221| v0_17(void) = ^BufferReadSideEffect[-1] : &:r0_12, ~m0_11
# 221| m0_18(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r0_12
# 221| m0_19(Constructible) = Chi : total:m0_11, partial:m0_18
# 222| r0_20(glval) = VariableAddress[c] :
@@ -923,7 +923,7 @@ ssa.cpp:
# 222| v0_22(void) = Call : func:r0_21, this:r0_20
# 222| m0_23(unknown) = ^CallSideEffect : ~m0_16
# 222| m0_24(unknown) = Chi : total:m0_16, partial:m0_23
-# 222| v0_25(void) = ^IndirectReadSideEffect[-1] : &:r0_20, m0_19
+# 222| v0_25(void) = ^BufferReadSideEffect[-1] : &:r0_20, ~m0_19
# 222| m0_26(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r0_20
# 222| m0_27(Constructible) = Chi : total:m0_19, partial:m0_26
# 223| r0_28(glval) = VariableAddress[c2] :
@@ -940,7 +940,7 @@ ssa.cpp:
# 224| v0_39(void) = Call : func:r0_38, this:r0_37
# 224| m0_40(unknown) = ^CallSideEffect : ~m0_34
# 224| m0_41(unknown) = Chi : total:m0_34, partial:m0_40
-# 224| v0_42(void) = ^IndirectReadSideEffect[-1] : &:r0_37, m0_36
+# 224| v0_42(void) = ^BufferReadSideEffect[-1] : &:r0_37, ~m0_36
# 224| m0_43(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r0_37
# 224| m0_44(Constructible) = Chi : total:m0_36, partial:m0_43
# 225| v0_45(void) = NoOp :
diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected
index 90b31a86e95..decdbffd442 100644
--- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected
@@ -333,7 +333,7 @@ ssa.cpp:
# 97| r0_11(void *) = Convert : r0_10
# 97| v0_12(void) = Call : func:r0_9, 0:r0_11
# 97| mu0_13(unknown) = ^CallSideEffect : ~mu0_2
-# 97| v0_14(void) = ^IndirectReadSideEffect[0] : &:r0_11, ~mu0_2
+# 97| v0_14(void) = ^BufferReadSideEffect[0] : &:r0_11, ~mu0_2
# 97| mu0_15(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_11
# 98| v0_16(void) = NoOp :
# 95| v0_17(void) = ReturnVoid :
@@ -386,7 +386,7 @@ ssa.cpp:
# 108| r0_17(void *) = Convert : r0_16
# 108| v0_18(void) = Call : func:r0_15, 0:r0_17
# 108| mu0_19(unknown) = ^CallSideEffect : ~mu0_2
-# 108| v0_20(void) = ^IndirectReadSideEffect[0] : &:r0_17, ~mu0_2
+# 108| v0_20(void) = ^BufferReadSideEffect[0] : &:r0_17, ~mu0_2
# 108| mu0_21(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_17
# 109| v0_22(void) = NoOp :
# 105| v0_23(void) = ReturnVoid :
@@ -451,7 +451,7 @@ ssa.cpp:
# 119| r0_23(void *) = Convert : r0_22
# 119| v0_24(void) = Call : func:r0_21, 0:r0_23
# 119| mu0_25(unknown) = ^CallSideEffect : ~mu0_2
-# 119| v0_26(void) = ^IndirectReadSideEffect[0] : &:r0_23, ~mu0_2
+# 119| v0_26(void) = ^BufferReadSideEffect[0] : &:r0_23, ~mu0_2
# 119| mu0_27(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_23
# 120| v0_28(void) = NoOp :
# 116| v0_29(void) = ReturnVoid :
@@ -876,13 +876,13 @@ ssa.cpp:
# 221| r0_11(glval) = FunctionAddress[g] :
# 221| v0_12(void) = Call : func:r0_11, this:r0_10
# 221| mu0_13(unknown) = ^CallSideEffect : ~mu0_2
-# 221| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_10, ~mu0_2
+# 221| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_10, ~mu0_2
# 221| mu0_15(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r0_10
# 222| r0_16(glval) = VariableAddress[c] :
# 222| r0_17(glval) = FunctionAddress[g] :
# 222| v0_18(void) = Call : func:r0_17, this:r0_16
# 222| mu0_19(unknown) = ^CallSideEffect : ~mu0_2
-# 222| v0_20(void) = ^IndirectReadSideEffect[-1] : &:r0_16, ~mu0_2
+# 222| v0_20(void) = ^BufferReadSideEffect[-1] : &:r0_16, ~mu0_2
# 222| mu0_21(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r0_16
# 223| r0_22(glval) = VariableAddress[c2] :
# 223| mu0_23(Constructible) = Uninitialized[c2] : &:r0_22
@@ -895,7 +895,7 @@ ssa.cpp:
# 224| r0_30(glval) = FunctionAddress[g] :
# 224| v0_31(void) = Call : func:r0_30, this:r0_29
# 224| mu0_32(unknown) = ^CallSideEffect : ~mu0_2
-# 224| v0_33(void) = ^IndirectReadSideEffect[-1] : &:r0_29, ~mu0_2
+# 224| v0_33(void) = ^BufferReadSideEffect[-1] : &:r0_29, ~mu0_2
# 224| mu0_34(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r0_29
# 225| v0_35(void) = NoOp :
# 219| v0_36(void) = ReturnVoid :
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 7af2f7c8c17..e5539a762ab 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
@@ -1,3 +1,7 @@
+| file://:0:0:0:0 | __i | file://:0:0:0:0 | unsigned long |
+| file://:0:0:0:0 | uls | file://:0:0:0:0 | unsigned long |
+| file://:0:0:0:0 | uls | file://:0:0:0:0 | unsigned long |
+| file://:0:0:0:0 | uls | file://:0:0:0:0 | unsigned long |
| segfault.cpp:25:46:25:65 | call to S | file://:0:0:0:0 | void |
| segfault.cpp:25:46:25:65 | call to S | file://:0:0:0:0 | void |
| segfault.cpp:25:48:25:55 | __second | segfault.cpp:15:7:15:11 | tuple |
diff --git a/cpp/ql/test/library-tests/syntax-zoo/drawDifferent.expected b/cpp/ql/test/library-tests/syntax-zoo/drawDifferent.expected
index 00cdd21f9ed..2d0be306bbe 100644
--- a/cpp/ql/test/library-tests/syntax-zoo/drawDifferent.expected
+++ b/cpp/ql/test/library-tests/syntax-zoo/drawDifferent.expected
@@ -1,53 +1,108 @@
-| staticlocals__staticlocals_f2_extractor | false | 22465 | 22465 | f2 |
-| staticlocals__staticlocals_f2_extractor | false | 22470 | 22470 | declaration |
-| staticlocals__staticlocals_f2_extractor | false | 22472 | 22472 | declaration |
-| staticlocals__staticlocals_f2_extractor | false | 22474 | 22474 | declaration |
-| staticlocals__staticlocals_f2_extractor | false | 22476 | 22476 | declaration |
-| staticlocals__staticlocals_f2_extractor | false | 22478 | 22478 | return ... |
-| staticlocals__staticlocals_f2_extractor | false | 22480 | 22480 | { ... } |
-| staticlocals__staticlocals_f2_extractor | false | 22482 | 22482 | call to C |
-| staticlocals__staticlocals_f2_extractor | false | 22484 | 22484 | initializer for c |
-| staticlocals__staticlocals_f2_extractor | false | 22486 | 22486 | call to addOne |
-| staticlocals__staticlocals_f2_extractor | false | 22490 | 22490 | 2 |
-| staticlocals__staticlocals_f2_extractor | false | 22493 | 22493 | initializer for j |
-| staticlocals__staticlocals_f2_extractor | false | 22494 | 22494 | call to addOne |
-| staticlocals__staticlocals_f2_extractor | false | 22499 | 22499 | 2 |
-| staticlocals__staticlocals_f2_extractor | false | 22500 | 22500 | initializer for two |
-| staticlocals__staticlocals_f2_extractor | false | 22503 | 22503 | two |
-| staticlocals__staticlocals_f2_extractor | false | 22508 | 22508 | initializer for i |
-| staticlocals__staticlocals_f2_extractor | true | 22470 | 22500 | |
-| staticlocals__staticlocals_f2_extractor | true | 22472 | 22474 | |
-| staticlocals__staticlocals_f2_extractor | true | 22474 | 22476 | |
-| staticlocals__staticlocals_f2_extractor | true | 22476 | 22478 | |
-| staticlocals__staticlocals_f2_extractor | true | 22478 | 22465 | |
-| staticlocals__staticlocals_f2_extractor | true | 22480 | 22470 | |
-| staticlocals__staticlocals_f2_extractor | true | 22499 | 22472 | |
-| staticlocals__staticlocals_f2_extractor | true | 22500 | 22499 | |
-| staticlocals__staticlocals_f2_ql | false | 22465 | 22465 | f2 |
-| staticlocals__staticlocals_f2_ql | false | 22470 | 22470 | declaration |
-| staticlocals__staticlocals_f2_ql | false | 22472 | 22472 | declaration |
-| staticlocals__staticlocals_f2_ql | false | 22474 | 22474 | declaration |
-| staticlocals__staticlocals_f2_ql | false | 22476 | 22476 | declaration |
-| staticlocals__staticlocals_f2_ql | false | 22478 | 22478 | return ... |
-| staticlocals__staticlocals_f2_ql | false | 22480 | 22480 | { ... } |
-| staticlocals__staticlocals_f2_ql | false | 22482 | 22482 | call to C |
-| staticlocals__staticlocals_f2_ql | false | 22484 | 22484 | initializer for c |
-| staticlocals__staticlocals_f2_ql | false | 22486 | 22486 | call to addOne |
-| staticlocals__staticlocals_f2_ql | false | 22490 | 22490 | 2 |
-| staticlocals__staticlocals_f2_ql | false | 22493 | 22493 | initializer for j |
-| staticlocals__staticlocals_f2_ql | false | 22494 | 22494 | call to addOne |
-| staticlocals__staticlocals_f2_ql | false | 22499 | 22499 | 2 |
-| staticlocals__staticlocals_f2_ql | false | 22500 | 22500 | initializer for two |
-| staticlocals__staticlocals_f2_ql | false | 22503 | 22503 | two |
-| staticlocals__staticlocals_f2_ql | false | 22508 | 22508 | initializer for i |
-| staticlocals__staticlocals_f2_ql | true | 22470 | 22500 | |
-| staticlocals__staticlocals_f2_ql | true | 22472 | 22474 | |
-| staticlocals__staticlocals_f2_ql | true | 22474 | 22476 | |
-| staticlocals__staticlocals_f2_ql | true | 22476 | 22478 | |
-| staticlocals__staticlocals_f2_ql | true | 22476 | 22484 | |
-| staticlocals__staticlocals_f2_ql | true | 22478 | 22465 | |
-| staticlocals__staticlocals_f2_ql | true | 22480 | 22470 | |
-| staticlocals__staticlocals_f2_ql | true | 22482 | 22478 | |
-| staticlocals__staticlocals_f2_ql | true | 22484 | 22482 | |
-| staticlocals__staticlocals_f2_ql | true | 22499 | 22472 | |
-| staticlocals__staticlocals_f2_ql | true | 22500 | 22499 | |
+| pointer_to_member__pmIsConstT_extractor | false | 15733 | 15733 | pmIsConstT |
+| pointer_to_member__pmIsConstT_extractor | false | 15741 | 15741 | declaration |
+| pointer_to_member__pmIsConstT_extractor | false | 15743 | 15743 | return ... |
+| pointer_to_member__pmIsConstT_extractor | false | 15745 | 15745 | { ... } |
+| pointer_to_member__pmIsConstT_extractor | false | 15748 | 15748 | {...} |
+| pointer_to_member__pmIsConstT_extractor | false | 15753 | 15753 | x1 |
+| pointer_to_member__pmIsConstT_extractor | false | 15755 | 15755 | & ... |
+| pointer_to_member__pmIsConstT_extractor | false | 15760 | 15760 | f1 |
+| pointer_to_member__pmIsConstT_extractor | false | 15762 | 15762 | & ... |
+| pointer_to_member__pmIsConstT_extractor | false | 15764 | 15764 | initializer for pms |
+| pointer_to_member__pmIsConstT_extractor | true | 15741 | 15743 | |
+| pointer_to_member__pmIsConstT_extractor | true | 15743 | 15733 | |
+| pointer_to_member__pmIsConstT_extractor | true | 15745 | 15741 | |
+| pointer_to_member__pmIsConstT_ql | false | 15733 | 15733 | pmIsConstT |
+| pointer_to_member__pmIsConstT_ql | false | 15741 | 15741 | declaration |
+| pointer_to_member__pmIsConstT_ql | false | 15743 | 15743 | return ... |
+| pointer_to_member__pmIsConstT_ql | false | 15745 | 15745 | { ... } |
+| pointer_to_member__pmIsConstT_ql | false | 15748 | 15748 | {...} |
+| pointer_to_member__pmIsConstT_ql | false | 15753 | 15753 | x1 |
+| pointer_to_member__pmIsConstT_ql | false | 15755 | 15755 | & ... |
+| pointer_to_member__pmIsConstT_ql | false | 15760 | 15760 | f1 |
+| pointer_to_member__pmIsConstT_ql | false | 15762 | 15762 | & ... |
+| pointer_to_member__pmIsConstT_ql | false | 15764 | 15764 | initializer for pms |
+| pointer_to_member__pmIsConstT_ql | true | 15741 | 15764 | |
+| pointer_to_member__pmIsConstT_ql | true | 15743 | 15733 | |
+| pointer_to_member__pmIsConstT_ql | true | 15745 | 15741 | |
+| pointer_to_member__pmIsConstT_ql | true | 15748 | 15743 | |
+| pointer_to_member__pmIsConstT_ql | true | 15753 | 15755 | |
+| pointer_to_member__pmIsConstT_ql | true | 15755 | 15760 | |
+| pointer_to_member__pmIsConstT_ql | true | 15760 | 15762 | |
+| pointer_to_member__pmIsConstT_ql | true | 15762 | 15748 | |
+| pointer_to_member__pmIsConstT_ql | true | 15764 | 15753 | |
+| staticlocals__staticlocals_f2_extractor | false | 22550 | 22550 | f2 |
+| staticlocals__staticlocals_f2_extractor | false | 22555 | 22555 | declaration |
+| staticlocals__staticlocals_f2_extractor | false | 22557 | 22557 | declaration |
+| staticlocals__staticlocals_f2_extractor | false | 22559 | 22559 | declaration |
+| staticlocals__staticlocals_f2_extractor | false | 22561 | 22561 | declaration |
+| staticlocals__staticlocals_f2_extractor | false | 22563 | 22563 | return ... |
+| staticlocals__staticlocals_f2_extractor | false | 22565 | 22565 | { ... } |
+| staticlocals__staticlocals_f2_extractor | false | 22567 | 22567 | call to C |
+| staticlocals__staticlocals_f2_extractor | false | 22569 | 22569 | initializer for c |
+| staticlocals__staticlocals_f2_extractor | false | 22571 | 22571 | call to addOne |
+| staticlocals__staticlocals_f2_extractor | false | 22575 | 22575 | 2 |
+| staticlocals__staticlocals_f2_extractor | false | 22578 | 22578 | initializer for j |
+| staticlocals__staticlocals_f2_extractor | false | 22579 | 22579 | call to addOne |
+| staticlocals__staticlocals_f2_extractor | false | 22584 | 22584 | 2 |
+| staticlocals__staticlocals_f2_extractor | false | 22585 | 22585 | initializer for two |
+| staticlocals__staticlocals_f2_extractor | false | 22588 | 22588 | two |
+| staticlocals__staticlocals_f2_extractor | false | 22593 | 22593 | initializer for i |
+| staticlocals__staticlocals_f2_extractor | true | 22555 | 22585 | |
+| staticlocals__staticlocals_f2_extractor | true | 22557 | 22559 | |
+| staticlocals__staticlocals_f2_extractor | true | 22559 | 22561 | |
+| staticlocals__staticlocals_f2_extractor | true | 22561 | 22563 | |
+| staticlocals__staticlocals_f2_extractor | true | 22563 | 22550 | |
+| staticlocals__staticlocals_f2_extractor | true | 22565 | 22555 | |
+| staticlocals__staticlocals_f2_extractor | true | 22584 | 22557 | |
+| staticlocals__staticlocals_f2_extractor | true | 22585 | 22584 | |
+| staticlocals__staticlocals_f2_ql | false | 22550 | 22550 | f2 |
+| staticlocals__staticlocals_f2_ql | false | 22555 | 22555 | declaration |
+| staticlocals__staticlocals_f2_ql | false | 22557 | 22557 | declaration |
+| staticlocals__staticlocals_f2_ql | false | 22559 | 22559 | declaration |
+| staticlocals__staticlocals_f2_ql | false | 22561 | 22561 | declaration |
+| staticlocals__staticlocals_f2_ql | false | 22563 | 22563 | return ... |
+| staticlocals__staticlocals_f2_ql | false | 22565 | 22565 | { ... } |
+| staticlocals__staticlocals_f2_ql | false | 22567 | 22567 | call to C |
+| staticlocals__staticlocals_f2_ql | false | 22569 | 22569 | initializer for c |
+| staticlocals__staticlocals_f2_ql | false | 22571 | 22571 | call to addOne |
+| staticlocals__staticlocals_f2_ql | false | 22575 | 22575 | 2 |
+| staticlocals__staticlocals_f2_ql | false | 22578 | 22578 | initializer for j |
+| staticlocals__staticlocals_f2_ql | false | 22579 | 22579 | call to addOne |
+| staticlocals__staticlocals_f2_ql | false | 22584 | 22584 | 2 |
+| staticlocals__staticlocals_f2_ql | false | 22585 | 22585 | initializer for two |
+| staticlocals__staticlocals_f2_ql | false | 22588 | 22588 | two |
+| staticlocals__staticlocals_f2_ql | false | 22593 | 22593 | initializer for i |
+| staticlocals__staticlocals_f2_ql | true | 22555 | 22585 | |
+| staticlocals__staticlocals_f2_ql | true | 22557 | 22559 | |
+| staticlocals__staticlocals_f2_ql | true | 22559 | 22561 | |
+| staticlocals__staticlocals_f2_ql | true | 22561 | 22563 | |
+| staticlocals__staticlocals_f2_ql | true | 22561 | 22569 | |
+| staticlocals__staticlocals_f2_ql | true | 22563 | 22550 | |
+| staticlocals__staticlocals_f2_ql | true | 22565 | 22555 | |
+| staticlocals__staticlocals_f2_ql | true | 22567 | 22563 | |
+| staticlocals__staticlocals_f2_ql | true | 22569 | 22567 | |
+| staticlocals__staticlocals_f2_ql | true | 22584 | 22557 | |
+| staticlocals__staticlocals_f2_ql | true | 22585 | 22584 | |
+| staticlocals__staticlocals_f3_extractor | false | 22529 | 22529 | f3 |
+| staticlocals__staticlocals_f3_extractor | false | 22532 | 22532 | declaration |
+| staticlocals__staticlocals_f3_extractor | false | 22534 | 22534 | return ... |
+| staticlocals__staticlocals_f3_extractor | false | 22536 | 22536 | { ... } |
+| staticlocals__staticlocals_f3_extractor | false | 22543 | 22543 | value |
+| staticlocals__staticlocals_f3_extractor | false | 22545 | 22545 | (int)... |
+| staticlocals__staticlocals_f3_extractor | false | 22546 | 22546 | initializer for i |
+| staticlocals__staticlocals_f3_extractor | true | 22532 | 22534 | |
+| staticlocals__staticlocals_f3_extractor | true | 22534 | 22529 | |
+| staticlocals__staticlocals_f3_extractor | true | 22536 | 22532 | |
+| staticlocals__staticlocals_f3_ql | false | 22529 | 22529 | f3 |
+| staticlocals__staticlocals_f3_ql | false | 22532 | 22532 | declaration |
+| staticlocals__staticlocals_f3_ql | false | 22534 | 22534 | return ... |
+| staticlocals__staticlocals_f3_ql | false | 22536 | 22536 | { ... } |
+| staticlocals__staticlocals_f3_ql | false | 22543 | 22543 | value |
+| staticlocals__staticlocals_f3_ql | false | 22545 | 22545 | (int)... |
+| staticlocals__staticlocals_f3_ql | false | 22546 | 22546 | initializer for i |
+| staticlocals__staticlocals_f3_ql | true | 22532 | 22534 | |
+| staticlocals__staticlocals_f3_ql | true | 22532 | 22546 | |
+| staticlocals__staticlocals_f3_ql | true | 22534 | 22529 | |
+| staticlocals__staticlocals_f3_ql | true | 22536 | 22532 | |
+| staticlocals__staticlocals_f3_ql | true | 22543 | 22534 | |
+| staticlocals__staticlocals_f3_ql | true | 22546 | 22543 | |
diff --git a/cpp/ql/test/library-tests/syntax-zoo/tellDifferent.expected b/cpp/ql/test/library-tests/syntax-zoo/tellDifferent.expected
index 0e06bb202c4..ae6f3429892 100644
--- a/cpp/ql/test/library-tests/syntax-zoo/tellDifferent.expected
+++ b/cpp/ql/test/library-tests/syntax-zoo/tellDifferent.expected
@@ -1,3 +1,14 @@
+| pointer_to_member__pmIsConstT | pointer_to_member.cpp:41:3:44:29 | declaration | pointer_to_member.cpp:44:11:44:28 | initializer for pms | Standard edge, only from QL | uninstantiated |
+| pointer_to_member__pmIsConstT | pointer_to_member.cpp:41:3:44:29 | declaration | pointer_to_member.cpp:45:1:45:1 | return ... | Standard edge, only from extractor | uninstantiated |
+| pointer_to_member__pmIsConstT | pointer_to_member.cpp:44:11:44:28 | initializer for pms | pointer_to_member.cpp:44:14:44:18 | x1 | Standard edge, only from QL | uninstantiated |
+| pointer_to_member__pmIsConstT | pointer_to_member.cpp:44:11:44:28 | {...} | pointer_to_member.cpp:45:1:45:1 | return ... | Standard edge, only from QL | uninstantiated |
+| pointer_to_member__pmIsConstT | pointer_to_member.cpp:44:13:44:18 | & ... | pointer_to_member.cpp:44:22:44:26 | f1 | Standard edge, only from QL | uninstantiated |
+| pointer_to_member__pmIsConstT | pointer_to_member.cpp:44:14:44:18 | x1 | pointer_to_member.cpp:44:13:44:18 | & ... | Standard edge, only from QL | uninstantiated |
+| pointer_to_member__pmIsConstT | pointer_to_member.cpp:44:21:44:26 | & ... | pointer_to_member.cpp:44:11:44:28 | {...} | Standard edge, only from QL | uninstantiated |
+| pointer_to_member__pmIsConstT | pointer_to_member.cpp:44:22:44:26 | f1 | pointer_to_member.cpp:44:21:44:26 | & ... | Standard edge, only from QL | uninstantiated |
| staticlocals__staticlocals_f2 | file://:0:0:0:0 | call to C | staticlocals.cpp:30:1:30:1 | return ... | Standard edge, only from QL | |
| staticlocals__staticlocals_f2 | file://:0:0:0:0 | initializer for c | file://:0:0:0:0 | call to C | Standard edge, only from QL | |
| staticlocals__staticlocals_f2 | staticlocals.cpp:29:5:29:17 | declaration | file://:0:0:0:0 | initializer for c | Standard edge, only from QL | |
+| staticlocals__staticlocals_f3 | staticlocals.cpp:39:3:39:34 | declaration | staticlocals.cpp:39:18:39:33 | initializer for i | Standard edge, only from QL | uninstantiated |
+| staticlocals__staticlocals_f3 | staticlocals.cpp:39:18:39:33 | initializer for i | staticlocals.cpp:39:18:39:33 | value | Standard edge, only from QL | uninstantiated |
+| staticlocals__staticlocals_f3 | staticlocals.cpp:39:18:39:33 | value | staticlocals.cpp:40:1:40:1 | return ... | Standard edge, only from QL | uninstantiated |
diff --git a/cpp/ql/test/library-tests/templates/CPP-202/template_args.expected b/cpp/ql/test/library-tests/templates/CPP-202/template_args.expected
index 0f20692d443..f38eef610e4 100644
--- a/cpp/ql/test/library-tests/templates/CPP-202/template_args.expected
+++ b/cpp/ql/test/library-tests/templates/CPP-202/template_args.expected
@@ -1,6 +1,6 @@
| file://:0:0:0:0 | __va_list_tag | |
-| test.cpp:3:8:3:9 | s1<> | |
-| test.cpp:3:8:3:9 | s1<> | |
+| test.cpp:3:8:3:9 | s1<> | {...} |
+| test.cpp:3:8:3:9 | s1<> | (null) |
| test.cpp:5:8:5:9 | s2 | T |
| test.cpp:5:8:5:9 | s2 | T |
| test.cpp:7:8:7:9 | s3> | (unnamed) |
diff --git a/cpp/ql/test/library-tests/templates/CPP-204/element.expected b/cpp/ql/test/library-tests/templates/CPP-204/element.expected
index 6cb84a117d5..44384471af9 100644
--- a/cpp/ql/test/library-tests/templates/CPP-204/element.expected
+++ b/cpp/ql/test/library-tests/templates/CPP-204/element.expected
@@ -1,6 +1,12 @@
| file://:0:0:0:0 | |
| file://:0:0:0:0 | 0 |
| file://:0:0:0:0 | (global namespace) |
+| file://:0:0:0:0 | B |
+| file://:0:0:0:0 | X |
+| file://:0:0:0:0 | X |
+| file://:0:0:0:0 | X |
+| file://:0:0:0:0 | X |
+| file://:0:0:0:0 | Y |
| file://:0:0:0:0 | __va_list_tag |
| file://:0:0:0:0 | __va_list_tag & |
| file://:0:0:0:0 | __va_list_tag && |
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.cpp b/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.cpp
new file mode 100644
index 00000000000..4f16f623daf
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.cpp
@@ -0,0 +1,4 @@
+template
+class Int { };
+
+Int<10> i;
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.expected b/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.expected
new file mode 100644
index 00000000000..ffa9bfb2cf4
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.expected
@@ -0,0 +1,2 @@
+| test.cpp:2:7:2:9 | Int<10> | file://:0:0:0:0 | int | test.cpp:4:5:4:6 | 10 |
+| test.cpp:2:7:2:9 | Int | file://:0:0:0:0 | int | file://:0:0:0:0 | i |
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.ql b/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.ql
new file mode 100644
index 00000000000..900424eb501
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/classes/test.ql
@@ -0,0 +1,4 @@
+import cpp
+
+from Class c
+select c, c.getATemplateArgumentKind(), c.getATemplateArgument()
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.cpp b/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.cpp
new file mode 100644
index 00000000000..625258906db
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.cpp
@@ -0,0 +1,5 @@
+// semmle-extractor-options: --edg --trap_container=folder --edg --trap-compression=none
+template
+int addToSelf() { return i + i; };
+
+int bar() { return addToSelf<10>(); }
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.expected b/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.expected
new file mode 100644
index 00000000000..493e9f03b20
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.expected
@@ -0,0 +1,2 @@
+| test.cpp:3:5:3:5 | addToSelf | file://:0:0:0:0 | int | test.cpp:5:30:5:31 | 10 |
+| test.cpp:3:5:3:13 | addToSelf | file://:0:0:0:0 | int | file://:0:0:0:0 | i |
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.ql b/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.ql
new file mode 100644
index 00000000000..98f8a4112d4
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/functions/test.ql
@@ -0,0 +1,4 @@
+import cpp
+
+from Function f
+select f, f.getATemplateArgumentKind(), f.getATemplateArgument()
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.cpp b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.cpp
new file mode 100644
index 00000000000..1baabe3ca30
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.cpp
@@ -0,0 +1,19 @@
+// semmle-extractor-options: --edg --trap_container=folder --edg --trap-compression=none
+template
+struct C { };
+
+static const int one1 = 1, one2 = 1;
+C c = C();
+C e;
+
+template
+struct D { };
+
+D a;
+D b;
+
+template
+struct E { };
+
+E z;
+
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.expected b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.expected
new file mode 100644
index 00000000000..fa5df86f68f
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.expected
@@ -0,0 +1,13 @@
+| test.cpp:3:8:3:8 | C<1> | 0 | int | test.cpp:5:25:5:25 | 1 |
+| test.cpp:3:8:3:8 | C<2> | 0 | int | file://:0:0:0:0 | 2 |
+| test.cpp:3:8:3:8 | C | 0 | int | file://:0:0:0:0 | x |
+| test.cpp:10:8:10:8 | D | 0 | | test.cpp:9:19:9:19 | T |
+| test.cpp:10:8:10:8 | D | 1 | T | file://:0:0:0:0 | X |
+| test.cpp:10:8:10:8 | D | 0 | | file://:0:0:0:0 | int |
+| test.cpp:10:8:10:8 | D | 1 | int | test.cpp:12:8:12:8 | 2 |
+| test.cpp:10:8:10:8 | D | 0 | | file://:0:0:0:0 | long |
+| test.cpp:10:8:10:8 | D | 1 | long | file://:0:0:0:0 | 2 |
+| test.cpp:16:8:16:8 | E | 0 | | test.cpp:15:19:15:19 | T |
+| test.cpp:16:8:16:8 | E | 1 | T * | file://:0:0:0:0 | X |
+| test.cpp:16:8:16:8 | E | 0 | | file://:0:0:0:0 | int |
+| test.cpp:16:8:16:8 | E | 1 | int * | file://:0:0:0:0 | 0 |
diff --git a/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.ql b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.ql
new file mode 100644
index 00000000000..68d597e0f98
--- /dev/null
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.ql
@@ -0,0 +1,14 @@
+import cpp
+
+string maybeGetTemplateArgumentKind(Declaration d, int i) {
+ (
+ if exists(d.getTemplateArgumentKind(i))
+ then result = d.getTemplateArgumentKind(i).toString()
+ else result = ""
+ ) and
+ i = [0 .. d.getNumberOfTemplateArguments()]
+}
+
+from Declaration d, int i
+where i >= 0 and i < d.getNumberOfTemplateArguments()
+select d, i, maybeGetTemplateArgumentKind(d, i), d.getTemplateArgument(i)
diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/ConditionallyUninitializedVariable.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/ConditionallyUninitializedVariable.expected
new file mode 100644
index 00000000000..60964c8f178
--- /dev/null
+++ b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/ConditionallyUninitializedVariable.expected
@@ -0,0 +1,3 @@
+| examples.cpp:38:3:38:18 | call to initDeviceConfig | The status of this call to $@ is not checked, potentially leaving $@ uninitialized. | examples.cpp:13:5:13:20 | initDeviceConfig | initDeviceConfig | examples.cpp:37:16:37:21 | config | config |
+| test.cpp:22:2:22:17 | call to maybeInitialize1 | The status of this call to $@ is not checked, potentially leaving $@ uninitialized. | test.cpp:4:5:4:20 | maybeInitialize1 | maybeInitialize1 | test.cpp:19:6:19:6 | a | a |
+| test.cpp:68:2:68:17 | call to maybeInitialize2 | The status of this call to $@ is not checked, potentially leaving $@ uninitialized. | test.cpp:51:6:51:21 | maybeInitialize2 | maybeInitialize2 | test.cpp:66:6:66:6 | a | a |
diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/ConditionallyUninitializedVariable.qlref b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/ConditionallyUninitializedVariable.qlref
new file mode 100644
index 00000000000..5150d627257
--- /dev/null
+++ b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/ConditionallyUninitializedVariable.qlref
@@ -0,0 +1 @@
+Security/CWE/CWE-457/ConditionallyUninitializedVariable.ql
diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/examples.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/examples.cpp
new file mode 100644
index 00000000000..ccb15904d02
--- /dev/null
+++ b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/examples.cpp
@@ -0,0 +1,43 @@
+// based on the qhelp
+
+int getMaxDevices();
+bool fetchIsDeviceEnabled(int deviceNumber);
+int fetchDeviceChannel(int deviceNumber);
+void notifyChannel(int channel);
+
+struct DeviceConfig {
+ bool isEnabled;
+ int channel;
+};
+
+int initDeviceConfig(DeviceConfig *ref, int deviceNumber) {
+ if (deviceNumber >= getMaxDevices()) {
+ // No device with that number, return -1 to indicate failure
+ return -1;
+ }
+ // Device with that number, fetch parameters and initialize struct
+ ref->isEnabled = fetchIsDeviceEnabled(deviceNumber);
+ ref->channel = fetchDeviceChannel(deviceNumber);
+ // Return 0 to indicate success
+ return 0;
+}
+
+void notifyGood(int deviceNumber) {
+ DeviceConfig config;
+ int statusCode = initDeviceConfig(&config, deviceNumber);
+ if (statusCode == 0) {
+ // GOOD: Status code returned by initialization function is checked, so this is safe
+ if (config.isEnabled) {
+ notifyChannel(config.channel);
+ }
+ }
+}
+
+int notifyBad(int deviceNumber) {
+ DeviceConfig config;
+ initDeviceConfig(&config, deviceNumber);
+ // BAD: Using config without checking the status code that is returned
+ if (config.isEnabled) {
+ notifyChannel(config.channel);
+ }
+}
\ No newline at end of file
diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/test.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/test.cpp
new file mode 100644
index 00000000000..a3c9b0a24aa
--- /dev/null
+++ b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/ConditionallyUninitializedVariable/test.cpp
@@ -0,0 +1,96 @@
+
+void use(int i);
+
+int maybeInitialize1(int *v)
+{
+ static int resources = 100;
+
+ if (resources == 0)
+ {
+ return 0; // FAIL
+ }
+
+ *v = resources--;
+ return 1; // SUCCESS
+}
+
+void test1()
+{
+ int a, b, c, d, e, f;
+ int result1, result2;
+
+ maybeInitialize1(&a); // BAD (initialization not checked)
+ use(a);
+
+ if (maybeInitialize1(&b) == 1) // GOOD
+ {
+ use(b);
+ }
+
+ if (maybeInitialize1(&c) == 0) // BAD (initialization check is wrong) [NOT DETECTED]
+ {
+ use(c);
+ }
+
+ result1 = maybeInitialize1(&d); // BAD (initialization stored but not checked) [NOT DETECTED]
+ use(d);
+
+ result2 = maybeInitialize1(&e); // GOOD
+ if (result2 == 1)
+ {
+ use(e);
+ }
+
+ if (maybeInitialize1(&f) == 0) // GOOD
+ {
+ return;
+ }
+ use(f);
+}
+
+bool maybeInitialize2(int *v)
+{
+ static int resources = 100;
+
+ if (resources > 0)
+ {
+ *v = resources--;
+ return true; // SUCCESS
+ }
+
+ return false; // FAIL
+}
+
+void test2()
+{
+ int a, b;
+
+ maybeInitialize2(&a); // BAD (initialization not checked)
+ use(a);
+
+ if (maybeInitialize2(&b)) // GOOD
+ {
+ use(b);
+ }
+}
+
+int alwaysInitialize(int *v)
+{
+ static int resources = 0;
+
+ *v = resources++;
+ return 1; // SUCCESS
+}
+
+void test3()
+{
+ int a, b;
+
+ alwaysInitialize(&a); // GOOD (initialization never fails)
+ use(a);
+
+ if (alwaysInitialize(&b) == 1) // GOOD
+ {
+ use(b);
+ }
+}
diff --git a/cpp/upgrades/98a075d5495d7be7ede26557708cf22cfa3964ef/old.dbscheme b/cpp/upgrades/98a075d5495d7be7ede26557708cf22cfa3964ef/old.dbscheme
new file mode 100644
index 00000000000..98a075d5495
--- /dev/null
+++ b/cpp/upgrades/98a075d5495d7be7ede26557708cf22cfa3964ef/old.dbscheme
@@ -0,0 +1,1918 @@
+
+/**
+ * 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);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function 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
+);
+
+// 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
+ ;
+*/
+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
+);
+
+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
+);
+
+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
+);
+
+/*
+ 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
+);
+
+/*
+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;
+
+/*
+ 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
+;
+
+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 ;
+
+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
+;
+
+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 ;
+successors(
+ int from: @cfgnode ref,
+ int to: @cfgnode ref
+);
+
+truecond(
+ unique int from: @cfgnode ref,
+ int to: @cfgnode ref
+);
+
+falsecond(
+ unique int from: @cfgnode ref,
+ int to: @cfgnode ref
+);
+
+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/98a075d5495d7be7ede26557708cf22cfa3964ef/semmlecode.cpp.dbscheme b/cpp/upgrades/98a075d5495d7be7ede26557708cf22cfa3964ef/semmlecode.cpp.dbscheme
new file mode 100644
index 00000000000..bd182f697bf
--- /dev/null
+++ b/cpp/upgrades/98a075d5495d7be7ede26557708cf22cfa3964ef/semmlecode.cpp.dbscheme
@@ -0,0 +1,1933 @@
+
+/**
+ * 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);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function 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
+);
+
+// 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
+ ;
+*/
+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
+);
+
+/*
+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;
+
+/*
+ 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
+;
+
+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 ;
+
+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
+;
+
+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 ;
+successors(
+ int from: @cfgnode ref,
+ int to: @cfgnode ref
+);
+
+truecond(
+ unique int from: @cfgnode ref,
+ int to: @cfgnode ref
+);
+
+falsecond(
+ unique int from: @cfgnode ref,
+ int to: @cfgnode ref
+);
+
+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/98a075d5495d7be7ede26557708cf22cfa3964ef/upgrade.properties b/cpp/upgrades/98a075d5495d7be7ede26557708cf22cfa3964ef/upgrade.properties
new file mode 100644
index 00000000000..495bdeebdac
--- /dev/null
+++ b/cpp/upgrades/98a075d5495d7be7ede26557708cf22cfa3964ef/upgrade.properties
@@ -0,0 +1,2 @@
+description: Add support for value template parameters.
+compatibility: partial
diff --git a/csharp/ql/src/Security Features/CWE-091/XMLInjection.qhelp b/csharp/ql/src/Security Features/CWE-091/XMLInjection.qhelp
index 4e70b06531a..3aff9901bfc 100644
--- a/csharp/ql/src/Security Features/CWE-091/XMLInjection.qhelp
+++ b/csharp/ql/src/Security Features/CWE-091/XMLInjection.qhelp
@@ -36,10 +36,10 @@ which ensures the content is appropriately escaped.
- XML Injection (The Web Application Security Consortium).
+ Web Application Security Consortium: XML Injection.
- WriteRaw (Microsoft documentation).
+ Microsoft Docs: WriteRaw.
diff --git a/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.qhelp b/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.qhelp
index 5f95181c092..e1dbe9c1bd0 100644
--- a/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.qhelp
+++ b/csharp/ql/src/Security Features/CWE-114/AssemblyPathInjection.qhelp
@@ -14,7 +14,7 @@ was not intended to be loaded, and executing arbitrary code.
Avoid loading assemblies based on user provided input. If this is not possible, ensure that the path
is validated before being used with Assembly. For example, compare the provided input
-against a whitelist of known safe assemblies, or confirm that path is restricted to a single
+against a whitelist of known safe assemblies, or confirm that the path is restricted to a single
directory which only contains safe assemblies.
@@ -30,8 +30,8 @@ is only loaded if the user input matches one of those options.
-
- System.Reflection.Assembly (Microsoft documentation).
+ Microsoft:
+ System.Reflection.Assembly.
diff --git a/csharp/ql/src/Security Features/CWE-321/HardcodedEncryptionKey.ql b/csharp/ql/src/Security Features/CWE-321/HardcodedEncryptionKey.ql
index c09a67d756c..cce122ffa62 100644
--- a/csharp/ql/src/Security Features/CWE-321/HardcodedEncryptionKey.ql
+++ b/csharp/ql/src/Security Features/CWE-321/HardcodedEncryptionKey.ql
@@ -1,6 +1,6 @@
/**
- * @name Do not use hard-coded encryption keys.
- * @description The .Key property or rgbKey parameter of a SymmetricAlgorithm should never be a hardcoded value.
+ * @name Hard-coded encryption key
+ * @description The .Key property or rgbKey parameter of a SymmetricAlgorithm should never be a hard-coded value.
* @kind problem
* @id cs/hardcoded-key
* @problem.severity error
diff --git a/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.qhelp b/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.qhelp
index ae69402eb7e..c59feeed61c 100644
--- a/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.qhelp
+++ b/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.qhelp
@@ -3,7 +3,6 @@
"qhelp.dtd">
-Finds uses of insecure SQL Connections string by not enabling the Encrypt option.
SQL Server connections where the client is not enforcing the encryption in transit are susceptible to multiple attacks, including a man-in-the-middle, that would potentially compromise the user credentials and/or the TDS session.
@@ -29,18 +28,17 @@
-
-
- Selectively using secure connection to SQL Server
+ Microsoft, SQL Protocols blog:
+ Selectively using secure connection to SQL Server.
-
- Net SqlClient (ADO .Net)
+ Microsoft:
+ SqlConnection.ConnectionString Property.
+
+ Microsoft:
+ Using Connection String Keywords with SQL Server Native Client.
+
+ Microsoft:
+ Setting the connection properties.
- SQL native driver (SNAC)
-
-
- JDBC driver
-
-
diff --git a/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql b/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql
index 0f855150aa9..78bcc1c19e5 100644
--- a/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql
+++ b/csharp/ql/src/Security Features/CWE-327/InsecureSQLConnection.ql
@@ -1,6 +1,6 @@
/**
* @name Insecure SQL connection
- * @description TODO.
+ * @description Using an SQL Server connection without enforcing encryption is a security vulnerability.
* @kind path-problem
* @id cs/insecure-sql-connection
* @problem.severity error
diff --git a/csharp/ql/src/Security Features/CWE-502/DeserializedDelegate.ql b/csharp/ql/src/Security Features/CWE-502/DeserializedDelegate.ql
index 1c68f01e78b..31d28311908 100644
--- a/csharp/ql/src/Security Features/CWE-502/DeserializedDelegate.ql
+++ b/csharp/ql/src/Security Features/CWE-502/DeserializedDelegate.ql
@@ -5,14 +5,11 @@
* @kind problem
* @id cs/deserialized-delegate
* @problem.severity warning
+ * @precision high
* @tags security
* external/cwe/cwe-502
*/
-/*
- * consider: @precision high
- */
-
import csharp
import semmle.code.csharp.frameworks.system.linq.Expressions
import semmle.code.csharp.serialization.Deserializers
diff --git a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
index d1ca7596f30..e69d5d93bf5 100644
--- a/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
+++ b/csharp/ql/src/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
@@ -86,6 +86,10 @@ module LocalFlow {
scope = e2 and
isSuccessor = true
or
+ e1 = e2.(NullCoalescingExpr).getAnOperand() and
+ scope = e2 and
+ isSuccessor = false
+ or
e1 = e2.(SuppressNullableWarningExpr).getExpr() and
scope = e2 and
isSuccessor = true
diff --git a/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected b/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected
index 65e04f8d48c..d82ff134b35 100644
--- a/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected
+++ b/csharp/ql/test/library-tests/cil/dataflow/DataFlow.expected
@@ -12,6 +12,8 @@
| dataflow.cs:46:35:46:39 | "t1b" | dataflow.cs:46:18:46:40 | call to method Taint1 |
| dataflow.cs:49:35:49:38 | "t6" | dataflow.cs:49:18:49:45 | call to method TaintIndirect |
| dataflow.cs:49:41:49:44 | "t6" | dataflow.cs:49:18:49:45 | call to method TaintIndirect |
+| dataflow.cs:102:30:102:33 | null | dataflow.cs:74:21:74:52 | ... ?? ... |
| dataflow.cs:102:30:102:33 | null | dataflow.cs:89:24:89:51 | ... ? ... : ... |
| dataflow.cs:102:30:102:33 | null | dataflow.cs:108:20:108:33 | call to method IndirectNull |
+| dataflow.cs:109:23:109:26 | null | dataflow.cs:74:21:74:52 | ... ?? ... |
| dataflow.cs:109:23:109:26 | null | dataflow.cs:89:24:89:51 | ... ? ... : ... |
diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlow.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlow.expected
index 63462bbad86..78c0204ed20 100644
--- a/csharp/ql/test/library-tests/dataflow/local/DataFlow.expected
+++ b/csharp/ql/test/library-tests/dataflow/local/DataFlow.expected
@@ -8,7 +8,9 @@
| LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 |
| LocalDataFlow.cs:420:19:420:24 | access to local variable sink71 |
| LocalDataFlow.cs:430:23:430:28 | access to local variable sink72 |
-| LocalDataFlow.cs:466:15:466:21 | access to parameter tainted |
+| LocalDataFlow.cs:445:15:445:20 | access to local variable sink73 |
+| LocalDataFlow.cs:446:15:446:20 | access to local variable sink74 |
+| LocalDataFlow.cs:472:15:472:21 | access to parameter tainted |
| SSA.cs:9:15:9:22 | access to local variable ssaSink0 |
| SSA.cs:25:15:25:22 | access to local variable ssaSink1 |
| SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
diff --git a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected
index d38e1f02215..1b93aded791 100644
--- a/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected
+++ b/csharp/ql/test/library-tests/dataflow/local/DataFlowStep.expected
@@ -545,7 +545,10 @@
| LocalDataFlow.cs:408:15:408:22 | access to local variable nonSink0 | LocalDataFlow.cs:415:31:415:38 | access to local variable nonSink0 |
| LocalDataFlow.cs:411:13:411:34 | SSA def(sink70) | LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 |
| LocalDataFlow.cs:411:22:411:34 | ... = ... | LocalDataFlow.cs:411:13:411:34 | SSA def(sink70) |
+| LocalDataFlow.cs:411:22:411:34 | SSA def(sink0) | LocalDataFlow.cs:443:34:443:38 | access to local variable sink0 |
+| LocalDataFlow.cs:411:22:411:34 | SSA def(sink0) | LocalDataFlow.cs:444:22:444:26 | access to local variable sink0 |
| LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | LocalDataFlow.cs:411:22:411:34 | ... = ... |
+| LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | LocalDataFlow.cs:411:22:411:34 | SSA def(sink0) |
| LocalDataFlow.cs:412:15:412:20 | [post] access to local variable sink70 | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 |
| LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 |
| LocalDataFlow.cs:415:9:415:38 | SSA def(nonSink0) | LocalDataFlow.cs:416:15:416:22 | access to local variable nonSink0 |
@@ -562,12 +565,23 @@
| LocalDataFlow.cs:427:17:427:22 | access to local variable sink70 | LocalDataFlow.cs:429:18:429:30 | SSA def(sink72) |
| LocalDataFlow.cs:429:18:429:30 | SSA def(sink72) | LocalDataFlow.cs:430:23:430:28 | access to local variable sink72 |
| LocalDataFlow.cs:435:17:435:24 | access to local variable nonSink0 | LocalDataFlow.cs:437:18:437:33 | SSA def(nonSink17) |
+| LocalDataFlow.cs:435:17:435:24 | access to local variable nonSink0 | LocalDataFlow.cs:443:22:443:29 | access to local variable nonSink0 |
| LocalDataFlow.cs:437:18:437:33 | SSA def(nonSink17) | LocalDataFlow.cs:438:23:438:31 | access to local variable nonSink17 |
-| LocalDataFlow.cs:458:28:458:30 | this | LocalDataFlow.cs:458:41:458:45 | this access |
-| LocalDataFlow.cs:458:50:458:52 | this | LocalDataFlow.cs:458:56:458:60 | this access |
-| LocalDataFlow.cs:458:50:458:52 | value | LocalDataFlow.cs:458:64:458:68 | access to parameter value |
-| LocalDataFlow.cs:464:41:464:47 | tainted | LocalDataFlow.cs:466:15:466:21 | access to parameter tainted |
-| LocalDataFlow.cs:469:44:469:53 | nonTainted | LocalDataFlow.cs:471:15:471:24 | access to parameter nonTainted |
+| LocalDataFlow.cs:443:13:443:38 | SSA def(sink73) | LocalDataFlow.cs:445:15:445:20 | access to local variable sink73 |
+| LocalDataFlow.cs:443:22:443:29 | access to local variable nonSink0 | LocalDataFlow.cs:443:22:443:38 | ... ?? ... |
+| LocalDataFlow.cs:443:22:443:29 | access to local variable nonSink0 | LocalDataFlow.cs:444:31:444:38 | access to local variable nonSink0 |
+| LocalDataFlow.cs:443:22:443:38 | ... ?? ... | LocalDataFlow.cs:443:13:443:38 | SSA def(sink73) |
+| LocalDataFlow.cs:443:34:443:38 | access to local variable sink0 | LocalDataFlow.cs:443:22:443:38 | ... ?? ... |
+| LocalDataFlow.cs:443:34:443:38 | access to local variable sink0 | LocalDataFlow.cs:444:22:444:26 | access to local variable sink0 |
+| LocalDataFlow.cs:444:13:444:38 | SSA def(sink74) | LocalDataFlow.cs:446:15:446:20 | access to local variable sink74 |
+| LocalDataFlow.cs:444:22:444:26 | access to local variable sink0 | LocalDataFlow.cs:444:22:444:38 | ... ?? ... |
+| LocalDataFlow.cs:444:22:444:38 | ... ?? ... | LocalDataFlow.cs:444:13:444:38 | SSA def(sink74) |
+| LocalDataFlow.cs:444:31:444:38 | access to local variable nonSink0 | LocalDataFlow.cs:444:22:444:38 | ... ?? ... |
+| LocalDataFlow.cs:464:28:464:30 | this | LocalDataFlow.cs:464:41:464:45 | this access |
+| LocalDataFlow.cs:464:50:464:52 | this | LocalDataFlow.cs:464:56:464:60 | this access |
+| LocalDataFlow.cs:464:50:464:52 | value | LocalDataFlow.cs:464:64:464:68 | access to parameter value |
+| LocalDataFlow.cs:470:41:470:47 | tainted | LocalDataFlow.cs:472:15:472:21 | access to parameter tainted |
+| LocalDataFlow.cs:475:44:475:53 | nonTainted | LocalDataFlow.cs:477:15:477:24 | access to parameter nonTainted |
| SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S |
| SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access |
| SSA.cs:5:26:5:32 | tainted | SSA.cs:8:24:8:30 | access to parameter tainted |
diff --git a/csharp/ql/test/library-tests/dataflow/local/LocalDataFlow.cs b/csharp/ql/test/library-tests/dataflow/local/LocalDataFlow.cs
index 154b4d5fcb9..65de9fc65fe 100644
--- a/csharp/ql/test/library-tests/dataflow/local/LocalDataFlow.cs
+++ b/csharp/ql/test/library-tests/dataflow/local/LocalDataFlow.cs
@@ -438,6 +438,12 @@ public class LocalDataFlow
Check(nonSink17);
break;
}
+
+ // Null-coalescing expressions
+ var sink73 = nonSink0 ?? sink0;
+ var sink74 = sink0 ?? nonSink0;
+ Check(sink73);
+ Check(sink74);
}
static void Check(T x) { }
diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTracking.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTracking.expected
index ba3d91130f2..756d79333c1 100644
--- a/csharp/ql/test/library-tests/dataflow/local/TaintTracking.expected
+++ b/csharp/ql/test/library-tests/dataflow/local/TaintTracking.expected
@@ -62,7 +62,9 @@
| LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 |
| LocalDataFlow.cs:420:19:420:24 | access to local variable sink71 |
| LocalDataFlow.cs:430:23:430:28 | access to local variable sink72 |
-| LocalDataFlow.cs:466:15:466:21 | access to parameter tainted |
+| LocalDataFlow.cs:445:15:445:20 | access to local variable sink73 |
+| LocalDataFlow.cs:446:15:446:20 | access to local variable sink74 |
+| LocalDataFlow.cs:472:15:472:21 | access to parameter tainted |
| SSA.cs:9:15:9:22 | access to local variable ssaSink0 |
| SSA.cs:25:15:25:22 | access to local variable ssaSink1 |
| SSA.cs:43:15:43:22 | access to local variable ssaSink2 |
diff --git a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected
index f9511969108..f320c87cb8b 100644
--- a/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected
+++ b/csharp/ql/test/library-tests/dataflow/local/TaintTrackingStep.expected
@@ -690,7 +690,10 @@
| LocalDataFlow.cs:408:15:408:22 | access to local variable nonSink0 | LocalDataFlow.cs:415:31:415:38 | access to local variable nonSink0 |
| LocalDataFlow.cs:411:13:411:34 | SSA def(sink70) | LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 |
| LocalDataFlow.cs:411:22:411:34 | ... = ... | LocalDataFlow.cs:411:13:411:34 | SSA def(sink70) |
+| LocalDataFlow.cs:411:22:411:34 | SSA def(sink0) | LocalDataFlow.cs:443:34:443:38 | access to local variable sink0 |
+| LocalDataFlow.cs:411:22:411:34 | SSA def(sink0) | LocalDataFlow.cs:444:22:444:26 | access to local variable sink0 |
| LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | LocalDataFlow.cs:411:22:411:34 | ... = ... |
+| LocalDataFlow.cs:411:30:411:34 | access to local variable sink0 | LocalDataFlow.cs:411:22:411:34 | SSA def(sink0) |
| LocalDataFlow.cs:412:15:412:20 | [post] access to local variable sink70 | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 |
| LocalDataFlow.cs:412:15:412:20 | access to local variable sink70 | LocalDataFlow.cs:419:13:419:18 | access to local variable sink70 |
| LocalDataFlow.cs:415:9:415:38 | SSA def(nonSink0) | LocalDataFlow.cs:416:15:416:22 | access to local variable nonSink0 |
@@ -707,15 +710,26 @@
| LocalDataFlow.cs:427:17:427:22 | access to local variable sink70 | LocalDataFlow.cs:429:18:429:30 | SSA def(sink72) |
| LocalDataFlow.cs:429:18:429:30 | SSA def(sink72) | LocalDataFlow.cs:430:23:430:28 | access to local variable sink72 |
| LocalDataFlow.cs:435:17:435:24 | access to local variable nonSink0 | LocalDataFlow.cs:437:18:437:33 | SSA def(nonSink17) |
+| LocalDataFlow.cs:435:17:435:24 | access to local variable nonSink0 | LocalDataFlow.cs:443:22:443:29 | access to local variable nonSink0 |
| LocalDataFlow.cs:437:18:437:33 | SSA def(nonSink17) | LocalDataFlow.cs:438:23:438:31 | access to local variable nonSink17 |
-| LocalDataFlow.cs:458:28:458:30 | this | LocalDataFlow.cs:458:41:458:45 | this access |
-| LocalDataFlow.cs:458:50:458:52 | this | LocalDataFlow.cs:458:56:458:60 | this access |
-| LocalDataFlow.cs:458:50:458:52 | value | LocalDataFlow.cs:458:50:458:52 | value |
-| LocalDataFlow.cs:458:50:458:52 | value | LocalDataFlow.cs:458:64:458:68 | access to parameter value |
-| LocalDataFlow.cs:464:41:464:47 | tainted | LocalDataFlow.cs:464:41:464:47 | tainted |
-| LocalDataFlow.cs:464:41:464:47 | tainted | LocalDataFlow.cs:466:15:466:21 | access to parameter tainted |
-| LocalDataFlow.cs:469:44:469:53 | nonTainted | LocalDataFlow.cs:469:44:469:53 | nonTainted |
-| LocalDataFlow.cs:469:44:469:53 | nonTainted | LocalDataFlow.cs:471:15:471:24 | access to parameter nonTainted |
+| LocalDataFlow.cs:443:13:443:38 | SSA def(sink73) | LocalDataFlow.cs:445:15:445:20 | access to local variable sink73 |
+| LocalDataFlow.cs:443:22:443:29 | access to local variable nonSink0 | LocalDataFlow.cs:443:22:443:38 | ... ?? ... |
+| LocalDataFlow.cs:443:22:443:29 | access to local variable nonSink0 | LocalDataFlow.cs:444:31:444:38 | access to local variable nonSink0 |
+| LocalDataFlow.cs:443:22:443:38 | ... ?? ... | LocalDataFlow.cs:443:13:443:38 | SSA def(sink73) |
+| LocalDataFlow.cs:443:34:443:38 | access to local variable sink0 | LocalDataFlow.cs:443:22:443:38 | ... ?? ... |
+| LocalDataFlow.cs:443:34:443:38 | access to local variable sink0 | LocalDataFlow.cs:444:22:444:26 | access to local variable sink0 |
+| LocalDataFlow.cs:444:13:444:38 | SSA def(sink74) | LocalDataFlow.cs:446:15:446:20 | access to local variable sink74 |
+| LocalDataFlow.cs:444:22:444:26 | access to local variable sink0 | LocalDataFlow.cs:444:22:444:38 | ... ?? ... |
+| LocalDataFlow.cs:444:22:444:38 | ... ?? ... | LocalDataFlow.cs:444:13:444:38 | SSA def(sink74) |
+| LocalDataFlow.cs:444:31:444:38 | access to local variable nonSink0 | LocalDataFlow.cs:444:22:444:38 | ... ?? ... |
+| LocalDataFlow.cs:464:28:464:30 | this | LocalDataFlow.cs:464:41:464:45 | this access |
+| LocalDataFlow.cs:464:50:464:52 | this | LocalDataFlow.cs:464:56:464:60 | this access |
+| LocalDataFlow.cs:464:50:464:52 | value | LocalDataFlow.cs:464:50:464:52 | value |
+| LocalDataFlow.cs:464:50:464:52 | value | LocalDataFlow.cs:464:64:464:68 | access to parameter value |
+| LocalDataFlow.cs:470:41:470:47 | tainted | LocalDataFlow.cs:470:41:470:47 | tainted |
+| LocalDataFlow.cs:470:41:470:47 | tainted | LocalDataFlow.cs:472:15:472:21 | access to parameter tainted |
+| LocalDataFlow.cs:475:44:475:53 | nonTainted | LocalDataFlow.cs:475:44:475:53 | nonTainted |
+| LocalDataFlow.cs:475:44:475:53 | nonTainted | LocalDataFlow.cs:477:15:477:24 | access to parameter nonTainted |
| SSA.cs:5:17:5:17 | SSA entry def(this.S) | SSA.cs:67:9:67:14 | access to field S |
| SSA.cs:5:17:5:17 | this | SSA.cs:67:9:67:12 | this access |
| SSA.cs:5:26:5:32 | tainted | SSA.cs:5:26:5:32 | tainted |
diff --git a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.cs b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.cs
index 45caec0022d..82a33086144 100644
--- a/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.cs
+++ b/csharp/ql/test/query-tests/API Abuse/NoDisposeCallOnLocalIDisposable/NoDisposeCallOnLocalIDisposable.cs
@@ -83,6 +83,11 @@ class Test
// GOOD: Disposed automatically.
using var c2 = new Timer(TimerProc);
+ // GOOD: ownership taken via ??
+ StringReader source = null;
+ using(XmlReader.Create(source ?? new StringReader("xml"), null))
+ ;
+
return null;
}
diff --git a/docs/language/global-sphinx-files/_templates/layout.html b/docs/language/global-sphinx-files/_templates/layout.html
index 6aa09b5fb38..de3b189e1ee 100644
--- a/docs/language/global-sphinx-files/_templates/layout.html
+++ b/docs/language/global-sphinx-files/_templates/layout.html
@@ -61,7 +61,7 @@
-
Learn QL
+
Learn CodeQL
QL for variant analysis
QL tools
Queries
diff --git a/docs/language/learn-ql/about-ql.rst b/docs/language/learn-ql/about-ql.rst
index 145f98ad600..8f2f26018a4 100644
--- a/docs/language/learn-ql/about-ql.rst
+++ b/docs/language/learn-ql/about-ql.rst
@@ -1,11 +1,11 @@
About QL
========
-This section is aimed at users with a background in general purpose programming as well as in databases. For a basic introduction and information on how to get started, see :doc:`Introduction to the QL language
` and :doc:`Learning QL <../index>`.
+This section is aimed at users with a background in general purpose programming as well as in databases. For a basic introduction and information on how to get started, see :doc:`Introduction to QL ` and :doc:`Learning CodeQL <../index>`.
QL is a declarative, object-oriented query language that is optimized to enable efficient analysis of hierarchical data structures, in particular, databases representing software artifacts.
-The queries and metrics used in LGTM are implemented using QL. This ensures that they can be extended or revised easily to keep up with changes in definitions of best coding practice. We continually improve existing queries as we work towards the ultimate goal of 100% precision.
+The queries and metrics used in LGTM are implemented using CodeQL, which uses QL to analyze code. This ensures that they can be extended or revised easily to keep up with changes in definitions of best coding practice. We continually improve existing queries as we work towards the ultimate goal of 100% precision.
You can write queries to identify security vulnerabilities, find coding errors and bugs, or find code that breaks your team's guidelines for best practice. You can also create customized versions of the default queries to accommodate a new framework.
diff --git a/docs/language/learn-ql/advanced/abstract-classes.rst b/docs/language/learn-ql/advanced/abstract-classes.rst
index d616a31395b..32441b35996 100644
--- a/docs/language/learn-ql/advanced/abstract-classes.rst
+++ b/docs/language/learn-ql/advanced/abstract-classes.rst
@@ -4,7 +4,7 @@ Semantics of abstract classes
Concrete classes
----------------
-Concrete QL classes, as described in the QL language handbook topic on `Classes `__, lend themselves well to top-down modeling. We start from general superclasses representing large sets of values, and carve out individual subclasses representing more restricted sets of values.
+Concrete classes, as described in the QL language handbook topic on `Classes `__, lend themselves well to top-down modeling. We start from general superclasses representing large sets of values, and carve out individual subclasses representing more restricted sets of values.
A classic example where this approach is useful is when modeling ASTs (Abstract Syntax Trees): the node types of an AST form a natural inheritance hierarchy, where, for example, there is a class ``Expr`` representing all expression nodes, with many different subclasses for different categories of expressions. There might be a class ``ArithmeticExpr`` representing arithmetic expressions, which in turn could have subclasses ``AddExpr`` and ``SubExpr``.
@@ -57,7 +57,7 @@ Like a concrete class, an abstract class has one or more superclasses and a char
Example
~~~~~~~
-The following example is taken from the standard QL library for Java:
+The following example is taken from the CodeQL library for Java:
.. code-block:: ql
diff --git a/docs/language/learn-ql/advanced/advanced-ql.rst b/docs/language/learn-ql/advanced/advanced-ql.rst
index e9397bd5ab2..67af5a6fb26 100644
--- a/docs/language/learn-ql/advanced/advanced-ql.rst
+++ b/docs/language/learn-ql/advanced/advanced-ql.rst
@@ -8,7 +8,7 @@ Advanced QL
./*
-Topics on advanced uses of QL. These topics assume that you are familiar with the QL language and the basics of query writing.
+Topics on advanced uses of QL. These topics assume that you are familiar with QL and the basics of query writing.
- :doc:`Semantics of abstract classes `
- :doc:`Choosing appropriate ways to constrain types `
diff --git a/docs/language/learn-ql/advanced/constraining-types.rst b/docs/language/learn-ql/advanced/constraining-types.rst
index e150c8ba380..3a8d2e76637 100644
--- a/docs/language/learn-ql/advanced/constraining-types.rst
+++ b/docs/language/learn-ql/advanced/constraining-types.rst
@@ -8,7 +8,7 @@ Type constraint methods
Note
- The examples below use the Java QL library. All QL libraries support using these methods to constrain variables, the only difference is in the names of the classes used.
+ The examples below use the CodeQL library for Java. All libraries support using these methods to constrain variables, the only difference is in the names of the classes used.
There are several ways of imposing type constraints on variables:
diff --git a/docs/language/learn-ql/advanced/determining-specific-types-variables.rst b/docs/language/learn-ql/advanced/determining-specific-types-variables.rst
index ce3c5a9e211..7deadde39c9 100644
--- a/docs/language/learn-ql/advanced/determining-specific-types-variables.rst
+++ b/docs/language/learn-ql/advanced/determining-specific-types-variables.rst
@@ -1,14 +1,14 @@
Determining the most specific types of a variable
=================================================
-It is sometimes useful to be able to determine what QL types an entity has -- especially when you are unfamiliar with the QL library used by a query. To help with this, QL provides a predicate called ``getAQlClass()``, which returns the most specific QL types of the entity that it is called on.
+It is sometimes useful to be able to determine what types an entity has -- especially when you are unfamiliar with the library used by a query. To help with this, there is a predicate called ``getAQlClass()``, which returns the most specific QL types of the entity that it is called on.
This can be useful when you are not sure of the most precise class of a value. Discovering a more precise class can allow you to cast to it and use predicates that are not available on the more general class.
Example
-------
-If you were working with a Java snapshot database, you might use ``getAQlClass()`` on every ``Expr`` in a callable called ``c``:
+If you were working with a Java database, you might use ``getAQlClass()`` on every ``Expr`` in a callable called ``c``:
**Java example**
@@ -23,6 +23,6 @@ If you were working with a Java snapshot database, you might use ``getAQlClass()
and e.getEnclosingCallable() = c
select e, e.getAQlClass()
-The result of this query is a list of the most specific types of every ``Expr`` in that function. You will see multiple results for some expressions because that expression is represented by more than one QL type.
+The result of this query is a list of the most specific types of every ``Expr`` in that function. You will see multiple results for some expressions because that expression is represented by more than one type.
-For example, ``StringLiteral``\ s like ``"Hello"`` in Java belong to both the ``StringLiteral`` QL class (a specialization of the ``Literal`` QL class) and the ``CompileTimeConstantExpr`` QL class. So any instances of ``StringLiteral``\ s in the results will produce more than one result, one for each of the QL classes to which they belong.
+For example, ``StringLiteral``\ s like ``"Hello"`` in Java belong to both the ``StringLiteral`` class (a specialization of the ``Literal`` class) and the ``CompileTimeConstantExpr`` class. So any instances of ``StringLiteral``\ s in the results will produce more than one result, one for each of the classes to which they belong.
diff --git a/docs/language/learn-ql/advanced/equivalence.rst b/docs/language/learn-ql/advanced/equivalence.rst
index 40f00cde00f..bf5efb595d0 100644
--- a/docs/language/learn-ql/advanced/equivalence.rst
+++ b/docs/language/learn-ql/advanced/equivalence.rst
@@ -6,7 +6,7 @@ The two expressions:
#. ``a() != b()``
#. ``not(a() = b())``
-look equivalent - so much so that inexperienced (and even experienced) QL programmers have been known to rewrite one as the other. However, they are not equivalent due to the quantifiers involved.
+look equivalent - so much so that inexperienced (and even experienced) programmers have been known to rewrite one as the other. However, they are not equivalent due to the quantifiers involved.
Thinking of ``a()`` and ``b()`` as sets of values, the first expression says that there is a pair of values (one from each side of the inequality) which are different.
diff --git a/docs/language/learn-ql/advanced/monotonic-aggregates.rst b/docs/language/learn-ql/advanced/monotonic-aggregates.rst
index 515dec6dff0..161776dbcf6 100644
--- a/docs/language/learn-ql/advanced/monotonic-aggregates.rst
+++ b/docs/language/learn-ql/advanced/monotonic-aggregates.rst
@@ -1,7 +1,7 @@
Monotonic aggregates in QL
==========================
-In addition to standard QL aggregates, QL also supports *monotonic* aggregates. These are a slightly different way of computing aggregates which have some advantages, notably the ability to be used recursively, which normal aggregates do not have. You can enable them in a scope by adding the \ ``language[monotonicAggregates]`` pragma on a predicate, class, or module.
+In addition to standard aggregates, QL also supports *monotonic* aggregates. These are a slightly different way of computing aggregates which have some advantages, notably the ability to be used recursively, which normal aggregates do not have. You can enable them in a scope by adding the \ ``language[monotonicAggregates]`` pragma on a predicate, class, or module.
Syntax
------
diff --git a/docs/language/learn-ql/beginner/find-thief-3.rst b/docs/language/learn-ql/beginner/find-thief-3.rst
index 03f7c866230..f8323147cf1 100644
--- a/docs/language/learn-ql/beginner/find-thief-3.rst
+++ b/docs/language/learn-ql/beginner/find-thief-3.rst
@@ -77,4 +77,4 @@ What next?
- Help the villagers track down another criminal in the :doc:`next tutorial `.
- Find out more about the concepts you discovered in this tutorial in the `QL language handbook `__.
-- Explore the libraries that help you get data about code in :doc:`Learning QL <../../index>`.
+- Explore the libraries that help you get data about code in :doc:`Learning CodeQL <../../index>`.
diff --git a/docs/language/learn-ql/beginner/fire-2.rst b/docs/language/learn-ql/beginner/fire-2.rst
index c5380fb0b6b..0c7e4852ae7 100644
--- a/docs/language/learn-ql/beginner/fire-2.rst
+++ b/docs/language/learn-ql/beginner/fire-2.rst
@@ -40,4 +40,4 @@ What next?
- Find out who will be the new ruler of the village in the :doc:`next tutorial `.
- Learn more about predicates and classes in the `QL language handbook `__.
-- Explore the libraries that help you get data about code in :doc:`Learning QL <../../index>`.
+- Explore the libraries that help you get data about code in :doc:`Learning CodeQL <../../index>`.
diff --git a/docs/language/learn-ql/beginner/heir.rst b/docs/language/learn-ql/beginner/heir.rst
index b5efd73fc40..f0f0c315025 100644
--- a/docs/language/learn-ql/beginner/heir.rst
+++ b/docs/language/learn-ql/beginner/heir.rst
@@ -161,4 +161,4 @@ What next?
- Learn more about recursion in the `QL language handbook `__.
- Put your QL skills to the test and solve the :doc:`River crossing puzzle <../ql-etudes/river-crossing>`.
-- Start using QL to analyze projects. See :doc:`Learning QL <../../index>` for a summary of the available languages and resources.
+- Start using QL to analyze projects. See :doc:`Learning CodeQL <../../index>` for a summary of the available languages and resources.
diff --git a/docs/language/learn-ql/beginner/ql-tutorials.rst b/docs/language/learn-ql/beginner/ql-tutorials.rst
index 2ba6e449b86..d97c4d6688e 100644
--- a/docs/language/learn-ql/beginner/ql-tutorials.rst
+++ b/docs/language/learn-ql/beginner/ql-tutorials.rst
@@ -7,18 +7,21 @@ QL detective tutorials
./*
-Welcome to QL! These tutorials are aimed at complete beginners. They teach you how to write QL queries and introduce you to key logic concepts along the way.
+Welcome to the detective tutorials! These are aimed at complete beginners who would like to learn the basics of QL,
+before analyzing code with CodeQL.
+The tutorials teach you how to write queries and introduce you to key logic concepts along the way.
-We recommend you first read the :doc:`Introduction to the QL language <../introduction-to-ql>` page for a basic description of QL.
+We recommend you first read the :doc:`Introduction to QL <../introduction-to-ql>` page for a description of the language and
+some simple examples.
-Currently the following tutorials are available:
+Currently the following detective tutorials are available:
-- :doc:`Find the thief ` - a three part mystery that introduces logical connectives, quantifiers and aggregates
+- :doc:`Find the thief ` - a three part mystery that introduces logical connectives, quantifiers, and aggregates
- :doc:`Catch the fire starter ` - an intriguing search that introduces predicates and classes
- :doc:`Crown the rightful heir ` - a detective puzzle that introduces recursion
Further resources
-----------------
-- For a summary of available learning resources, see :doc:`Learning QL <../../index>`.
+- For a summary of available learning resources, see :doc:`Learning CodeQL <../../index>`.
- For an overview of the important concepts in QL, see the `QL language handbook `__.
diff --git a/docs/language/learn-ql/cobol/introduce-libraries-cobol.rst b/docs/language/learn-ql/cobol/introduce-libraries-cobol.rst
index 8ab24df1edd..2d01200484d 100644
--- a/docs/language/learn-ql/cobol/introduce-libraries-cobol.rst
+++ b/docs/language/learn-ql/cobol/introduce-libraries-cobol.rst
@@ -1,10 +1,10 @@
-Introducing the QL libraries for COBOL
-======================================
+Introducing the CodeQL libraries for COBOL
+==========================================
Overview
--------
-There is an extensive QL library for analyzing COBOL code. The classes in this library present the data from a snapshot database in an object-oriented form and provide abstractions and predicates to help you with common analysis tasks.
+There is an extensive library for analyzing COBOL code. The classes in this library present the data from a CodeQL database in an object-oriented form and provide abstractions and predicates to help you with common analysis tasks.
The library is implemented as a set of QL modules–that is, files with the extension ``.qll``. The module ``cobol.qll`` imports most other standard library modules, so you can include the complete library by beginning your query with:
@@ -12,12 +12,12 @@ The library is implemented as a set of QL modules–that is, files with the exte
import cobol
-The rest of this tutorial briefly summarizes the most important QL classes and predicates provided by this library, including references to the `detailed API documentation `__ where applicable.
+The rest of this tutorial briefly summarizes the most important classes and predicates provided by this library, including references to the `detailed API documentation `__ where applicable.
Introducing the library
-----------------------
-The QL COBOL library presents information about COBOL source code at different levels:
+The CodeQL library for COBOL presents information about COBOL source code at different levels:
- **Textual** — classes that represent source code as unstructured text files
- **Lexical** — classes that represent comments and other tokens of interest
@@ -36,7 +36,7 @@ At its most basic level, a COBOL code base can simply be viewed as a collection
Files and folders
^^^^^^^^^^^^^^^^^
-In QL, files are represented as entities of class `File `__, and folders as entities of class `Folder `__, both of which are subclasses of class `Container `__.
+Files are represented as entities of class `File `__, and folders as entities of class `Folder `__, both of which are subclasses of class `Container `__.
Class `Container `__ provides the following member predicates:
@@ -48,7 +48,7 @@ Note that while ``getAFile`` and ``getAFolder`` are declared on class `Container
Both files and folders have paths, which can be accessed by the predicate ``Container.getAbsolutePath()``. For example, if ``f`` represents a file with the path ``/home/user/project/src/main.cbl``, then ``f.getAbsolutePath()`` evaluates to the string ``"/home/user/project/src/main.cbl"``, while ``f.getParentContainer().getAbsolutePath()`` returns ``"/home/user/project/src"``.
-These paths are absolute file system paths. If you want to obtain the path of a file relative to the snapshot source location, use ``Container.getRelativePath()`` instead. Note, however, that a snapshot may contain files that are not located underneath the snapshot source location; for such files, ``getRelativePath()`` will not return anything.
+These paths are absolute file system paths. If you want to obtain the path of a file relative to the source location in the CodeQL database, use ``Container.getRelativePath()`` instead. Note, however, that a database may contain files that are not located underneath the source location; for such files, ``getRelativePath()`` will not return anything.
The following member predicates of class `Container `__ provide more information about the name of a file or folder:
@@ -68,9 +68,9 @@ For example, the following query computes, for each folder, the number of COBOL
Locations
^^^^^^^^^
-Most entities in a snapshot database have an associated source location. Locations are identified by four pieces of information: a file, a start line, a start column, an end line, and an end column. Line and column counts are 1-based (so the first character of a file is at line 1, column 1), and the end position is inclusive.
+Most entities in a CodeQL database have an associated source location. Locations are identified by four pieces of information: a file, a start line, a start column, an end line, and an end column. Line and column counts are 1-based (so the first character of a file is at line 1, column 1), and the end position is inclusive.
-All entities associated with a source location belong to the QL class `Locatable `__. The location itself is modeled by the QL class `Location `__ and can be accessed through the member predicate ``Locatable.getLocation()``. The `Location `__ class provides the following member predicates:
+All entities associated with a source location belong to the class `Locatable `__. The location itself is modeled by the class `Location `__ and can be accessed through the member predicate ``Locatable.getLocation()``. The `Location `__ class provides the following member predicates:
- ``Location.getFile()``, ``Location.getStartLine()``, ``Location.getStartColumn()``, ``Location.getEndLine()``, ``Location.getEndColumn()`` return detailed information about the location.
- ``Location.getNumLines()`` returns the number of (whole or partial) lines covered by the location.
@@ -104,13 +104,13 @@ The most important member predicates are as follows:
Syntactic level
~~~~~~~~~~~~~~~
-The majority of classes in the QL COBOL library is concerned with representing a COBOL program as a collection of `abstract syntax trees `__ (ASTs).
+The majority of classes in the CodeQL library for COBOL are concerned with representing a COBOL program as a collection of `abstract syntax trees `__ (ASTs).
-The QL class `ASTNode `__ contains all entities representing nodes in the abstract syntax trees and defines generic tree traversal predicates:
+The class `ASTNode `__ contains all entities representing nodes in the abstract syntax trees and defines generic tree traversal predicates:
- ``ASTNode.getParent()``: returns the parent node of this AST node, if any.
-Please note that the QL libraries for COBOL do not currently represent all possible parts of a COBOL program. Due to the complexity of the language, and its many dialects, this is an ongoing task. We prioritize elements that are of interest to queries, and expand this selection over time. Please check the `detailed API documentation `__ to see what is currently available.
+Please note that the libraries for COBOL do not currently represent all possible parts of a COBOL program. Due to the complexity of the language, and its many dialects, this is an ongoing task. We prioritize elements that are of interest to queries, and expand this selection over time. Please check the `detailed API documentation `__ to see what is currently available.
The main structure of any COBOL program is represented by the `Unit `__ class and its subclasses. For example, each program definition has a `ProgramDefinition `__ counterpart. For each ``PROCEDURE DIVISION`` in the program, there will be a `ProcedureDivision `__ class.
diff --git a/docs/language/learn-ql/cobol/ql-for-cobol.rst b/docs/language/learn-ql/cobol/ql-for-cobol.rst
index 12ba25e69f4..f85ff62649e 100644
--- a/docs/language/learn-ql/cobol/ql-for-cobol.rst
+++ b/docs/language/learn-ql/cobol/ql-for-cobol.rst
@@ -1,5 +1,5 @@
-QL for COBOL
-============
+CodeQL for COBOL
+================
.. toctree::
:glob:
@@ -7,14 +7,14 @@ QL for COBOL
introduce-libraries-cobol
-This page provides an overview of the QL for COBOL documentation that is currently available.
+This page provides an overview of the CodeQL for COBOL documentation that is currently available.
- `Basic COBOL query `__ describes how to write and run queries using LGTM.
-- :doc:`Introducing the QL libraries for COBOL ` introduces the standard libraries used to write queries for COBOL code.
+- :doc:`Introducing the CodeQL libraries for COBOL ` introduces the standard libraries used to write queries for COBOL code.
Other resources
---------------
-- For the queries used in LGTM, display a `COBOL query `__ and click **Open in query console** to see the QL code used to find alerts.
-- For more information about the COBOL QL library see the `QL library for COBOL `__.
+- For the queries used in LGTM, display a `COBOL query `__ and click **Open in query console** to see the code used to find alerts.
+- For more information about the library for COBOL see the `CodeQL library for COBOL `__.
diff --git a/docs/language/learn-ql/conf.py b/docs/language/learn-ql/conf.py
index d9b1de5e9fc..94d3bf2205f 100644
--- a/docs/language/learn-ql/conf.py
+++ b/docs/language/learn-ql/conf.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
#
-# Learn QL documentation build configuration file, created by
+# Learn CodeQL documentation build configuration file, created by
# on Tuesday Nov 13 2018.
#
# This file is execfile()d with the current directory set to its
@@ -41,16 +41,16 @@ highlight_language = 'ql'
master_doc = 'index'
# General information about the project.
-project = u'Learning QL'
+project = u'Learning CodeQL'
# -- Project-specifc options for HTML output ----------------------------------------------
# The name for this set of Sphinx documents. If None, it defaults to
# " v documentation".
-html_title = 'Learn QL'
+html_title = 'Learn CodeQL'
# Output file base name for HTML help builder.
-htmlhelp_basename = 'Learn QL'
+htmlhelp_basename = 'Learn CodeQL'
# The version info for this project, if different from version and release in main conf.py file.
# The short X.Y version.
diff --git a/docs/language/learn-ql/cpp/conversions-classes.rst b/docs/language/learn-ql/cpp/conversions-classes.rst
index 716991f96b2..016efa50d67 100644
--- a/docs/language/learn-ql/cpp/conversions-classes.rst
+++ b/docs/language/learn-ql/cpp/conversions-classes.rst
@@ -4,12 +4,12 @@ Tutorial: Conversions and classes
Overview
--------
-This topic contains worked examples of how to write queries using the standard QL library classes for C/C++ conversions and classes.
+This topic contains worked examples of how to write queries using the CodeQL library classes for C/C++ conversions and classes.
Conversions
-----------
-Let us take a look at the QL ``Conversion`` class in the standard library:
+Let us take a look at the ``Conversion`` class in the standard library:
- ``Expr``
@@ -128,26 +128,26 @@ Unlike the earlier versions of the query, this query would return each side of t
Note
- In general, QL predicates named ``getAXxx`` exploit the ability to return multiple results (multiple instances of ``Xxx``) whereas plain ``getXxx`` predicates usually return at most one specific instance of ``Xxx``.
+ In general, predicates named ``getAXxx`` exploit the ability to return multiple results (multiple instances of ``Xxx``) whereas plain ``getXxx`` predicates usually return at most one specific instance of ``Xxx``.
Classes
-------
-Next we're going to look at C++ classes, using the following QL classes:
+Next we're going to look at C++ classes, using the following CodeQL classes:
- ``Type``
- - ``UserType``—includes classes, typedefs and enums
+ - ``UserType``—includes classes, typedefs, and enums
- ``Class``—a class or struct
- - ``Struct``—a struct, which is treated as a subtype of Class in QL.
+ - ``Struct``—a struct, which is treated as a subtype of ``Class``
- ``TemplateClass``—a C++ class template
Finding derived classes
~~~~~~~~~~~~~~~~~~~~~~~
-We want to create a query that checks for destructors that should be ``virtual``. Specifically, when a class and a class derived from it both have destructors, the base class destructor should generally be virtual. This ensures that the derived class destructor is always invoked. A ``Destructor`` in QL is a subtype of ``MemberFunction``:
+We want to create a query that checks for destructors that should be ``virtual``. Specifically, when a class and a class derived from it both have destructors, the base class destructor should generally be virtual. This ensures that the derived class destructor is always invoked. In the CodeQL library, ``Destructor`` is a subtype of ``MemberFunction``:
- ``Function``
@@ -221,13 +221,13 @@ Our last change is to use ``Function.isVirtual()`` to find cases where the base
That completes the query.
-There is a similar built-in LGTM `query `__ that finds classes in a C/C++ project with virtual functions but no virtual destructor. You can take a look at the QL code for this query by clicking **Open in query console** at the top of that page.
+There is a similar built-in LGTM `query `__ that finds classes in a C/C++ project with virtual functions but no virtual destructor. You can take a look at the code for this query by clicking **Open in query console** at the top of that page.
What next?
----------
- Explore other ways of querying classes using examples from the `C/C++ cookbook `__.
- Take a look at the :doc:`Analyzing data flow in C/C++ ` tutorial.
-- Try the worked examples in the following topics: :doc:`Example: Checking that constructors initialize all private fields ` and :doc:`Example: Checking for allocations equal to 'strlen(string)' without space for a null terminator `.
+- Try the worked examples in the following topics: :doc:`Example: Checking that constructors initialize all private fields `, and :doc:`Example: Checking for allocations equal to 'strlen(string)' without space for a null terminator `.
- Find out more about QL in the `QL language handbook `__ and `QL language specification `__.
- Learn more about the query console in `Using the query console `__.
diff --git a/docs/language/learn-ql/cpp/dataflow.rst b/docs/language/learn-ql/cpp/dataflow.rst
index 4867f3daf47..89f25913fbc 100644
--- a/docs/language/learn-ql/cpp/dataflow.rst
+++ b/docs/language/learn-ql/cpp/dataflow.rst
@@ -4,10 +4,10 @@ Analyzing data flow in C/C++
Overview
--------
-This topic describes how data flow analysis is implemented in the QL for C/C++ library and includes examples to help you write your own data flow queries.
-The following sections describe how to utilize the QL libraries for local data flow, global data flow and taint tracking.
+This topic describes how data flow analysis is implemented in the CodeQL libraries for C/C++ and includes examples to help you write your own data flow queries.
+The following sections describe how to utilize the libraries for local data flow, global data flow, and taint tracking.
-For a more general introduction to modeling data flow in QL, see :doc:`Introduction to data flow analysis in QL <../intro-to-data-flow>`.
+For a more general introduction to modeling data flow, see :doc:`Introduction to data flow analysis with CodeQL <../intro-to-data-flow>`.
Local data flow
---------------
@@ -166,6 +166,7 @@ The following predicates are defined in the configuration:
- ``isSource``—defines where data may flow from
- ``isSink``—defines where data may flow to
- ``isBarrier``—optional, restricts the data flow
+- ``isBarrierGuard``—optional, restricts the data flow
- ``isAdditionalFlowStep``—optional, adds additional flow steps
The characteristic predicate ``MyDataFlowConfiguration()`` defines the name of the configuration, so ``"MyDataFlowConfiguration"`` should be replaced by the name of your class.
@@ -204,6 +205,7 @@ The following predicates are defined in the configuration:
- ``isSource``—defines where taint may flow from
- ``isSink``—defines where taint may flow to
- ``isSanitizer``—optional, restricts the taint flow
+- ``isSanitizerGuard``—optional, restricts the taint flow
- ``isAdditionalTaintStep``—optional, adds additional taint steps
Similar to global data flow, the characteristic predicate ``MyTaintTrackingConfiguration()`` defines the unique name of the configuration, so ``"MyTaintTrackingConfiguration"`` should be replaced by the name of your class.
diff --git a/docs/language/learn-ql/cpp/expressions-types.rst b/docs/language/learn-ql/cpp/expressions-types.rst
index d6bd0b2c740..1595d594683 100644
--- a/docs/language/learn-ql/cpp/expressions-types.rst
+++ b/docs/language/learn-ql/cpp/expressions-types.rst
@@ -4,12 +4,12 @@ Tutorial: Expressions, types and statements
Overview
--------
-This topic contains worked examples of how to write queries using the standard QL library classes for C/C++ expressions, types, and statements.
+This topic contains worked examples of how to write queries using the standard CodeQL library classes for C/C++ expressions, types, and statements.
Expressions and types
---------------------
-Each part of an expression in C becomes an instance of the QL ``Expr`` class. For example, the C code ``x = x + 1`` becomes an ``AssignExpr``, an ``AddExpr``, two instances of ``VariableAccess`` and a ``Literal``. All of these QL classes extend ``Expr``.
+Each part of an expression in C becomes an instance of the ``Expr`` class. For example, the C code ``x = x + 1`` becomes an ``AssignExpr``, an ``AddExpr``, two instances of ``VariableAccess`` and a ``Literal``. All of these CodeQL classes extend ``Expr``.
Finding assignments to zero
~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -26,7 +26,7 @@ In the following example we find instances of ``AssignExpr`` which assign the co
➤ `See this in the query console `__
-The ``where`` clause in this example gets the expression on the right side of the assignment, ``getRValue()``, and compares it with zero. Notice that there are no checks to make sure that the right side of the assignment is an integer or that it has a value (that is, it is compile-time constant, rather than a variable). For expressions where either of these assumptions is wrong, the associated QL predicate simply does not return anything and the ``where`` clause will not produce a result. You could think of it as if there is an implicit ``exists(e.getRValue().getValue().toInt())`` at the beginning of this line.
+The ``where`` clause in this example gets the expression on the right side of the assignment, ``getRValue()``, and compares it with zero. Notice that there are no checks to make sure that the right side of the assignment is an integer or that it has a value (that is, it is compile-time constant, rather than a variable). For expressions where either of these assumptions is wrong, the associated predicate simply does not return anything and the ``where`` clause will not produce a result. You could think of it as if there is an implicit ``exists(e.getRValue().getValue().toInt())`` at the beginning of this line.
It is also worth noting that the query above would find this C code:
@@ -34,7 +34,7 @@ It is also worth noting that the query above would find this C code:
yPtr = NULL;
-This is because the snapshot contains a representation of the code base after the preprocessor transforms have run (for more information, see `Database generation `__). This means that any macro invocations, such as the ``NULL`` define used here, are expanded during the creation of the snapshot. If you want to write queries about macros then there are some special library classes that have been designed specifically for this purpose (for example, the ``Macro``, ``MacroInvocation`` classes and predicates like ``Element.isInMacroExpansion()``). In this case, it is good that macros are expanded, but we do not want to find assignments to pointers.
+This is because the database contains a representation of the code base after the preprocessor transforms have run (for more information, see `Database generation `__). This means that any macro invocations, such as the ``NULL`` define used here, are expanded during the creation of the database. If you want to write queries about macros then there are some special library classes that have been designed specifically for this purpose (for example, the ``Macro``, ``MacroInvocation`` classes and predicates like ``Element.isInMacroExpansion()``). In this case, it is good that macros are expanded, but we do not want to find assignments to pointers.
Finding assignments of 0 to an integer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/docs/language/learn-ql/cpp/function-classes.rst b/docs/language/learn-ql/cpp/function-classes.rst
index e8f0f743722..51f07a8d0f0 100644
--- a/docs/language/learn-ql/cpp/function-classes.rst
+++ b/docs/language/learn-ql/cpp/function-classes.rst
@@ -4,14 +4,14 @@ Tutorial: Function classes
Overview
--------
-The standard QL library for C and C++ represents functions using the ``Function`` class (see :doc:`Introducing the C/C++ libraries `).
+The standard CodeQL library for C and C++ represents functions using the ``Function`` class (see :doc:`Introducing the C/C++ libraries `).
The example queries in this topic explore some of the most useful library predicates for querying functions.
Finding all static functions
----------------------------
-Using the member predicate ``Function.isStatic()`` we can list all of the static functions in a snapshot:
+Using the member predicate ``Function.isStatic()`` we can list all the static functions in a database:
.. code-block:: ql
@@ -26,7 +26,7 @@ This query is very general, so there are probably too many results to be interes
Finding functions that are not called
-------------------------------------
-It might be more interesting to find functions that are not called, using the standard QL ``FunctionCall`` class from the **abstract syntax tree** category (see :doc:`Introducing the C/C++ libraries `). The ``FunctionCall`` class can be used to identify places where a function is actually used, and it is related to ``Function`` through the ``FunctionCall.getTarget()`` predicate.
+It might be more interesting to find functions that are not called, using the standard CodeQL ``FunctionCall`` class from the **abstract syntax tree** category (see :doc:`Introducing the C/C++ libraries `). The ``FunctionCall`` class can be used to identify places where a function is actually used, and it is related to ``Function`` through the ``FunctionCall.getTarget()`` predicate.
.. code-block:: ql
@@ -58,9 +58,9 @@ You can modify the query to remove functions where a function pointer is used to
This query returns fewer results. However, if you examine the results then you can probably still find potential refinements.
-For example, there is a more complicated LGTM `query `__ that finds unused static functions. To see the QL code for this query, click **Open in query console** at the top of the page.
+For example, there is a more complicated LGTM `query `__ that finds unused static functions. To see the code for this query, click **Open in query console** at the top of the page.
- You can explore the definition of an element in the standard QL libraries and see what predicates are available. Use the keyboard **F3** button to open the definition of any element. Alternatively, hover over the element and click **Jump to definition** in the tooltip displayed. The library file is opened in a new tab with the definition highlighted.
+ You can explore the definition of an element in the standard libraries and see what predicates are available. Use the keyboard **F3** button to open the definition of any element. Alternatively, hover over the element and click **Jump to definition** in the tooltip displayed. The library file is opened in a new tab with the definition highlighted.
Finding a specific function
---------------------------
diff --git a/docs/language/learn-ql/cpp/introduce-libraries-cpp.rst b/docs/language/learn-ql/cpp/introduce-libraries-cpp.rst
index 1ab7cdd1498..6bea8d40c2c 100644
--- a/docs/language/learn-ql/cpp/introduce-libraries-cpp.rst
+++ b/docs/language/learn-ql/cpp/introduce-libraries-cpp.rst
@@ -1,23 +1,23 @@
-Introducing the C/C++ libraries
-===============================
+Introducing the CodeQL libraries for C/C++
+==========================================
Overview
--------
-There is an extensive QL library for analyzing snapshots extracted from C/C++ projects. The QL classes in this library present the data from a snapshot database in an object-oriented form and provide abstractions and predicates to help you with common analysis tasks. The library is implemented as a set of QL modules, that is, files with the extension ``.qll``. The module ``cpp.qll`` imports all of the core C/C++ library modules, so you can include the complete library by beginning your query with:
+There is an extensive library for analyzing CodeQL databases extracted from C/C++ projects. The classes in this library present the data from a database in an object-oriented form and provide abstractions and predicates to help you with common analysis tasks. The library is implemented as a set of QL modules, that is, files with the extension ``.qll``. The module ``cpp.qll`` imports all the core C/C++ library modules, so you can include the complete library by beginning your query with:
.. code-block:: ql
import cpp
-The rest of this topic summarizes available QL classes and corresponding C/C++ constructs.
+The rest of this topic summarizes the available CodeQL classes and corresponding C/C++ constructs.
-NOTE: You can find related classes and features using the query console's auto-complete feature. You can also press *F3* to jump to the definition of any element; QL library files are opened in new tabs in the console.
+NOTE: You can find related classes and features using the query console's auto-complete feature. You can also press *F3* to jump to the definition of any element; library files are opened in new tabs in the console.
Summary of the library classes
------------------------------
-The most commonly used standard QL library classes are listed below. The listing is broken down by functionality. Each QL library class is annotated with a C/C++ construct it corresponds to.
+The most commonly used standard library classes are listed below. The listing is broken down by functionality. Each library class is annotated with a C/C++ construct it corresponds to.
Declaration classes
~~~~~~~~~~~~~~~~~~~
@@ -25,7 +25,7 @@ Declaration classes
This table lists `Declaration `__ classes representing C/C++ declarations.
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Example syntax | QL class | Remarks |
+| Example syntax | CodeQL class | Remarks |
+=================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+=======================================================================================================================================================================+====================================================================================================================================================================================================+
| ``int`` *var* ``;`` | `GlobalVariable `__ | |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -154,7 +154,7 @@ Statement classes
This table lists subclasses of `Stmt `__ representing C/C++ statements.
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Example syntax | QL class | Remarks |
+| Example syntax | CodeQL class | Remarks |
+===============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+==================================================================================================================================================================+===================================================================================================================================================================================================================================================================================================+
| ``__asm__ ("`` *movb %bh, (%eax)* ``");`` | `AsmStmt `__ | Specific to a given CPU instruction set |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -215,7 +215,7 @@ Expression classes
This table lists subclasses of `Expr `__ representing C/C++ expressions.
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Example syntax | QL class(es) | Remarks |
+| Example syntax | CodeQL class(es) | Remarks |
+========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================+==========================================================================================================================================================================================================+=============================================================================================================================================================================================================================================================================================================+
| ``{`` `Expr `__... ``}`` | | `ArrayAggregateLiteral `__ | |
| | | `ClassAggregateLiteral `__ | |
@@ -417,7 +417,7 @@ Type classes
This table lists subclasses of `Type `__ representing C/C++ types.
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Example syntax | QL class | Remarks |
+| Example syntax | CodeQL class | Remarks |
+=============================================================================================================================================================================================================================================================================================================================================================================================================================================+==================================================================================================================================================================+==================================================================================================================================================================================================================================================================================+
| ``void`` | `VoidType `__ | |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -485,7 +485,7 @@ Preprocessor classes
This table lists `Preprocessor `__ classes representing C/C++ preprocessing directives.
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Example syntax | QL class | Remarks |
+| Example syntax | CodeQL class | Remarks |
+=============================================================================================================================================================================================================================================================================================================================================================================================================================================+==================================================================================================================================================================+===================================================================================================================================================================================================================================================================================+
| ``#elif`` *condition* | `PreprocessorElif `__ | |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -522,6 +522,6 @@ This table lists `Preprocessor `, :doc:`Expressions, types and statements `, :doc:`Conversions and classes `, and :doc:`Analyzing data flow in C/C++ `.
+- Experiment with the worked examples in the CodeQL for C/C++ topics: :doc:`Function classes `, :doc:`Expressions, types and statements `, :doc:`Conversions and classes `, and :doc:`Analyzing data flow in C/C++ `.
- Find out more about QL in the `QL language handbook `__ and `QL language specification `__.
- Learn more about the query console in `Using the query console `__.
diff --git a/docs/language/learn-ql/cpp/private-field-initialization.rst b/docs/language/learn-ql/cpp/private-field-initialization.rst
index 4aa155adeb0..26b57660142 100644
--- a/docs/language/learn-ql/cpp/private-field-initialization.rst
+++ b/docs/language/learn-ql/cpp/private-field-initialization.rst
@@ -4,7 +4,7 @@ Example: Checking that constructors initialize all private fields
Overview
--------
-This topic describes how a C++ query was developed. The example introduces recursive predicates and demonstrates the typical workflow used to refine a query. For a full overview of the topics available for learning to write QL queries for C/C++ code, see :doc:`QL for C/C++ `.
+This topic describes how a C++ query was developed. The example introduces recursive predicates and demonstrates the typical workflow used to refine a query. For a full overview of the topics available for learning to write queries for C/C++ code, see :doc:`CodeQL for C/C++ `.
Problem—finding every private field and checking for initialization
-------------------------------------------------------------------
@@ -29,7 +29,7 @@ We can start by looking at every private field in a class and checking that ever
#. ``f.isPrivate()`` checks if the field is private.
#. ``not exists(Assignment a | a = f.getAnAssignment() and a.getEnclosingFunction() = c)`` checks that there is no assignment to the field in the constructor.
-This QL code looks fairly complete, but when you test it on a project, there are several results that contain examples that we have overlooked.
+This code looks fairly complete, but when you test it on a project, there are several results that contain examples that we have overlooked.
Refinement 1—excluding fields initialized by lists
--------------------------------------------------
@@ -62,7 +62,7 @@ These can be excluded by adding an extra condition to check for this special con
Refinement 2—excluding fields initialized by external libraries
---------------------------------------------------------------
-When you test the revised query, you may discover that fields from classes in external libraries are over-reported. This is often because a header file declares a constructor that is defined in a source file that is not analyzed (external libraries are often excluded from analysis). When the source code is analyzed, the snapshot is populated with a ``Constructor`` entry with no body. This ``constructor`` therefore contains no assignments and consequently the query reports that any fields initialized by the constructor are "uninitialized." There is no particular reason to be suspicious of these cases, and we can exclude them from the results by defining a condition to exclude constructors that have no body:
+When you test the revised query, you may discover that fields from classes in external libraries are over-reported. This is often because a header file declares a constructor that is defined in a source file that is not analyzed (external libraries are often excluded from analysis). When the source code is analyzed, the CodeQL database is populated with a ``Constructor`` entry with no body. This ``constructor`` therefore contains no assignments and consequently the query reports that any fields initialized by the constructor are "uninitialized." There is no particular reason to be suspicious of these cases, and we can exclude them from the results by defining a condition to exclude constructors that have no body:
.. code-block:: ql
diff --git a/docs/language/learn-ql/cpp/ql-for-cpp.rst b/docs/language/learn-ql/cpp/ql-for-cpp.rst
index 909d0e2e323..b1596c7de92 100644
--- a/docs/language/learn-ql/cpp/ql-for-cpp.rst
+++ b/docs/language/learn-ql/cpp/ql-for-cpp.rst
@@ -1,5 +1,5 @@
-QL for C/C++
-============
+CodeQL for C/C++
+================
.. toctree::
:glob:
@@ -13,19 +13,19 @@ QL for C/C++
private-field-initialization
zero-space-terminator
-These topics provide an overview of the QL C/C++ standard libraries and show examples of how to write queries that use them.
+These topics provide an overview of the CodeQL libraries for C/C++ and show examples of how to write queries that use them.
-- `Basic C/C++ QL query `__ describes how to write and run queries using LGTM.
+- `Basic C/C++ query `__ describes how to write and run queries using LGTM.
-- :doc:`Introducing the QL libraries for C/C++ ` introduces the standard libraries used to write queries for C and C++ code.
+- :doc:`Introducing the CodeQL libraries for C/C++ ` introduces the standard libraries used to write queries for C and C++ code.
-- :doc:`Tutorial: Function classes ` demonstrates how to write queries using the standard QL library classes for C/C++ functions.
+- :doc:`Tutorial: Function classes ` demonstrates how to write queries using the standard CodeQL library classes for C/C++ functions.
-- :doc:`Tutorial: Expressions, types and statements ` demonstrates how to write queries using the standard QL library classes for C/C++ expressions, types and statements.
+- :doc:`Tutorial: Expressions, types and statements ` demonstrates how to write queries using the standard CodeQL library classes for C/C++ expressions, types and statements.
-- :doc:`Tutorial: Conversions and classes ` demonstrates how to write queries using the standard QL library classes for C/C++ conversions and classes.
+- :doc:`Tutorial: Conversions and classes ` demonstrates how to write queries using the standard CodeQL library classes for C/C++ conversions and classes.
-- :doc:`Tutorial: Analyzing data flow in C/C++ ` demonstrates how to write queries using the standard QL for C/C++ data flow and taint tracking libraries.
+- :doc:`Tutorial: Analyzing data flow in C/C++ ` demonstrates how to write queries using the standard data flow and taint tracking libraries for C/C++.
- :doc:`Example: Checking that constructors initialize all private fields ` works through the development of a query. It introduces recursive predicates and shows the typical workflow used to refine a query.
@@ -51,6 +51,8 @@ Advanced libraries
Other resources
---------------
-- For examples of how to query common C/C++ elements, see the `C/C++ QL cookbook `__.
-- For the queries used in LGTM, display a `C/C++ query `__ and click **Open in query console** to see the QL code used to find alerts.
-- For more information about the C/C++ QL library see the `QL library for C/C++ `__.
+.. TODO: Rename the cookbooks: C/C++ cookbook, or C/C++ CodeQL cookbook, or CodeQL cookbook for C/C++, or...?
+
+- For examples of how to query common C/C++ elements, see the `C/C++ cookbook `__.
+- For the queries used in LGTM, display a `C/C++ query `__ and click **Open in query console** to see the code used to find alerts.
+- For more information about the library for C/C++ see the `CodeQL library for C/C++ `__.
diff --git a/docs/language/learn-ql/cpp/value-numbering-hash-cons.rst b/docs/language/learn-ql/cpp/value-numbering-hash-cons.rst
index 7a1bbd2888b..e05f93dbae1 100644
--- a/docs/language/learn-ql/cpp/value-numbering-hash-cons.rst
+++ b/docs/language/learn-ql/cpp/value-numbering-hash-cons.rst
@@ -4,7 +4,7 @@ Hash consing and value numbering
Overview
--------
-In C and C++ QL databases, each node in the abstract syntax tree is represented by a separate object. This allows both analysis and results display to refer to specific appearances of a piece of syntax. However, it is frequently useful to determine whether two expressions are equivalent, either syntactically or semantically.
+In C and C++ databases, each node in the abstract syntax tree is represented by a separate object. This allows both analysis and results display to refer to specific appearances of a piece of syntax. However, it is frequently useful to determine whether two expressions are equivalent, either syntactically or semantically.
The `hash consing `__ library (defined in ``semmle.code.cpp.valuenumbering.HashCons``) provides a mechanism for identifying expressions that have the same syntactic structure. The `global value numbering `__ library (defined in ``semmle.code.cpp.valuenumbering.GlobalValueNumbering``) provides a mechanism for identifying expressions that compute the same value at runtime.
diff --git a/docs/language/learn-ql/cpp/zero-space-terminator.rst b/docs/language/learn-ql/cpp/zero-space-terminator.rst
index e977470ea6f..7026d9fa9ae 100644
--- a/docs/language/learn-ql/cpp/zero-space-terminator.rst
+++ b/docs/language/learn-ql/cpp/zero-space-terminator.rst
@@ -4,7 +4,7 @@ Example: Checking for allocations equal to ``strlen(string)`` without space for
Overview
--------
-This topic describes how a C/C++ query for detecting a potential buffer overflow was developed. For a full overview of the topics available for learning to write QL queries for C/C++ code, see :doc:`QL for C/C++ `.
+This topic describes how a C/C++ query for detecting a potential buffer overflow was developed. For a full overview of the topics available for learning to write queries for C/C++ code, see :doc:`CodeQL for C/C++ `.
Problem—detecting memory allocation that omits space for a null termination character
-------------------------------------------------------------------------------------
@@ -32,7 +32,7 @@ Defining the entities of interest
You could approach this problem either by searching for code similar to the call to ``malloc`` in line 3 or the call to ``strcpy`` in line 5 (see example above). For our basic query, we start with a simple assumption: any call to ``malloc`` with only a ``strlen`` to define the memory size is likely to cause an error when the memory is populated.
-Calls to ``strlen`` can be identified using the library `StrlenCall `__ class, but we need to define a new class to identify calls to ``malloc``. Both the library class and the new class need to extend the standard QL class ``FunctionCall``, with the added restriction of the function name that they apply to:
+Calls to ``strlen`` can be identified using the library `StrlenCall `__ class, but we need to define a new class to identify calls to ``malloc``. Both the library class and the new class need to extend the standard class ``FunctionCall``, with the added restriction of the function name that they apply to:
.. code-block:: ql
@@ -52,7 +52,7 @@ Calls to ``strlen`` can be identified using the library `StrlenCall `.
+For a more general introduction to modeling data flow, see :doc:`Introduction to data flow analysis with CodeQL <../intro-to-data-flow>`.
Local data flow
---------------
@@ -548,6 +548,6 @@ This can be adapted from the ``SystemUriFlow`` class:
What next?
----------
-- Learn about the QL standard libraries used to write queries for C# in :doc:`Introducing the C# libraries `.
+- Learn about the standard libraries used to write queries for C# in :doc:`Introducing the C# libraries `.
- Find out more about QL in the `QL language handbook `__ and `QL language specification `__.
- Learn more about the query console in `Using the query console `__.
diff --git a/docs/language/learn-ql/csharp/introduce-libraries-csharp.rst b/docs/language/learn-ql/csharp/introduce-libraries-csharp.rst
index 43e6c11327c..32a782d5034 100644
--- a/docs/language/learn-ql/csharp/introduce-libraries-csharp.rst
+++ b/docs/language/learn-ql/csharp/introduce-libraries-csharp.rst
@@ -1,25 +1,23 @@
-Introducing the C# libraries
-============================
+Introducing the CodeQL libraries for C#
+=======================================
Overview
--------
-The C# QL libraries are a data model for analysis of C# code. QL is an object-oriented language, so the data model is represented as *QL classes*, which are organized into *QL libraries*. The QL classes are a layer of logic built on top of an underlying database.
-
-The core library is imported at the top of each query using:
+There is an extensive library for analyzing CodeQL databases extracted from C# projects. The classes in this library present the data from a database in an object-oriented form and provide abstractions and predicates to help you with common analysis tasks. The library is implemented as a set of QL modules, that is, files with the extension ``.qll``. The module ``csharp.qll`` imports all the core C# library modules, so you can include the complete library by beginning your query with:
.. code-block:: ql
import csharp
-Since this is required for all C# queries, it is omitted from QL snippets below.
+Since this is required for all C# queries, it is omitted from code snippets below.
-The core library contains all the program elements, including `files <#files>`__, `types <#types>`__, methods, `variables <#variables>`__, `statements <#statements>`__, and `expressions <#expressions>`__. This is sufficient for most queries, however additional libraries can be imported for bespoke functionality such as control flow and data flow. See :doc:`QL for C# ` for information about these additional libraries.
+The core library contains all the program elements, including `files <#files>`__, `types <#types>`__, methods, `variables <#variables>`__, `statements <#statements>`__, and `expressions <#expressions>`__. This is sufficient for most queries, however additional libraries can be imported for bespoke functionality such as control flow and data flow. See :doc:`CodeQL for C# ` for information about these additional libraries.
Class hierarchies
~~~~~~~~~~~~~~~~~
-Each section contains a QL class hierarchy, showing the inheritance structure between QL classes. For example:
+Each section contains a class hierarchy, showing the inheritance structure between CodeQL classes. For example:
- ``Expr``
@@ -46,13 +44,13 @@ Each section contains a QL class hierarchy, showing the inheritance structure be
This means that the class ``AddExpr`` extends class ``BinaryArithmeticOperation``, which in turn extends class ``ArithmeticOperation`` and so on. If you want to query any arithmetic operation, then use the class ``ArithmeticOperation``, but if you specifically want to limit the query to addition operations, then use the class ``AddExpr``.
-QL classes can also be considered to be *sets*, and the ``extends`` relation between classes defines a subset. Every member of class ``AddExpr`` is also in the class ``BinaryArithmeticOperation``. In general, QL classes overlap and an entity can be a member of several classes.
+Classes can also be considered to be *sets*, and the ``extends`` relation between classes defines a subset. Every member of class ``AddExpr`` is also in the class ``BinaryArithmeticOperation``. In general, classes overlap and an entity can be a member of several classes.
This overview omits some of the less important or intermediate classes from the class hierarchy.
Each class has predicates, which are logical propositions about that class. They also define navigable relationships between classes. Predicates are inherited, so for example the ``AddExpr`` class inherits the predicates ``getLeftOperand()`` and ``getRightOperand()`` from ``BinaryArithmeticOperation``, and ``getType()`` from class ``Expr``. This is similar to how methods are inherited in object-oriented programming languages.
-In this overview, we present the most common and useful predicates. Consult the reference, QL source code, and autocomplete in the editor for the complete list of predicates available on each class.
+In this overview, we present the most common and useful predicates. Consult the `reference `__, the CodeQL source code, and autocomplete in the editor for the complete list of predicates available on each class.
Exercises
~~~~~~~~~
@@ -72,7 +70,7 @@ Exercise 1: Simplify the following query:
Files
-----
-Files are represented by the QL class `File `__, and directories by the QL class `Folder `__. The database contains all of the source files and assemblies used during the compilation.
+Files are represented by the class `File `__, and directories by the class `Folder `__. The database contains all of the source files and assemblies used during the compilation.
Class hierarchy
~~~~~~~~~~~~~~~
@@ -143,7 +141,7 @@ To list all elements in ``Main.cs``, their QL class and location:
where e.getFile().getShortName() = "Main"
select e, e.getAQlClass(), e.getLocation()
-Note that ``getAQlClass()`` is available on all QL classes and is a useful way to figure out the QL class of something. Often the same element will have several QL classes which are all returned by ``getAQlClass()``.
+Note that ``getAQlClass()`` is available on all entities and is a useful way to figure out the QL class of something. Often the same element will have several classes which are all returned by ``getAQlClass()``.
Locations
---------
@@ -234,7 +232,7 @@ Find declarations containing a username:
Variables
---------
-The QL class `Variable `__ represents C# variables, such as fields, parameters and local variables. The database contains all variables from the source code, as well as all fields and parameters from assemblies referenced by the program.
+The class `Variable `__ represents C# variables, such as fields, parameters and local variables. The database contains all variables from the source code, as well as all fields and parameters from assemblies referenced by the program.
Class hierarchy
~~~~~~~~~~~~~~~
@@ -283,7 +281,7 @@ Find all unused local variables:
Types
-----
-Types are represented by the QL class `Type