diff --git a/.bazelrc b/.bazelrc
index 54a510f05dc6..679eeec77a32 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -33,10 +33,6 @@ common --@rules_dotnet//dotnet/settings:strict_deps=false
# we only configure a nightly toolchain
common --@rules_rust//rust/toolchain/channel=nightly
-# rust does not like the gold linker, while bazel does by default, so let's avoid using it
-common:linux --linkopt=-fuse-ld=lld
-common:macos --linkopt=-fuse-ld=lld
-
# Reduce this eventually to empty, once we've fixed all our usages of java, and https://github.com/bazel-contrib/rules_go/issues/4193 is fixed
common --incompatible_autoload_externally="+@rules_java,+@rules_shell"
diff --git a/.github/workflows/build-ripunzip.yml b/.github/workflows/build-ripunzip.yml
index 3e32b868985d..6f1f95ddf8c6 100644
--- a/.github/workflows/build-ripunzip.yml
+++ b/.github/workflows/build-ripunzip.yml
@@ -20,7 +20,7 @@ jobs:
os: [ubuntu-22.04, macos-13, windows-2022]
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
with:
repository: google/ripunzip
ref: ${{ inputs.ripunzip-version }}
@@ -28,7 +28,7 @@ jobs:
# see https://github.com/sfackler/rust-openssl/issues/183
- if: runner.os == 'Linux'
name: checkout openssl
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
repository: openssl/openssl
path: openssl
diff --git a/.github/workflows/buildifier.yml b/.github/workflows/buildifier.yml
index f3fbf97854ce..ac344df588ed 100644
--- a/.github/workflows/buildifier.yml
+++ b/.github/workflows/buildifier.yml
@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Check bazel formatting
uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507
with:
diff --git a/.github/workflows/check-implicit-this.yml b/.github/workflows/check-implicit-this.yml
index f58db399ccb9..a109f4bfe55c 100644
--- a/.github/workflows/check-implicit-this.yml
+++ b/.github/workflows/check-implicit-this.yml
@@ -16,7 +16,7 @@ jobs:
check:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Check that implicit this warnings is enabled for all packs
shell: bash
run: |
diff --git a/.github/workflows/check-overlay-annotations.yml b/.github/workflows/check-overlay-annotations.yml
index 5369dfd49d00..849cad113c40 100644
--- a/.github/workflows/check-overlay-annotations.yml
+++ b/.github/workflows/check-overlay-annotations.yml
@@ -17,7 +17,7 @@ jobs:
sync:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Check overlay annotations
run: python config/add-overlay-annotations.py --check java
diff --git a/.github/workflows/check-qldoc.yml b/.github/workflows/check-qldoc.yml
index f10e0dc90b99..8fe47bf50f76 100644
--- a/.github/workflows/check-qldoc.yml
+++ b/.github/workflows/check-qldoc.yml
@@ -18,7 +18,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
with:
fetch-depth: 2
diff --git a/.github/workflows/check-query-ids.yml b/.github/workflows/check-query-ids.yml
index 8ae19cc3e5f8..14d597d44cbd 100644
--- a/.github/workflows/check-query-ids.yml
+++ b/.github/workflows/check-query-ids.yml
@@ -19,6 +19,6 @@ jobs:
name: Check query IDs
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Check for duplicate query IDs
run: python3 misc/scripts/check-query-ids.py
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index ba384245e0eb..a32732ab6e6e 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -37,7 +37,7 @@ jobs:
dotnet-version: 9.0.100
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
diff --git a/.github/workflows/compile-queries.yml b/.github/workflows/compile-queries.yml
index 945515c0c532..36171543cac4 100644
--- a/.github/workflows/compile-queries.yml
+++ b/.github/workflows/compile-queries.yml
@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest-xl
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
with:
diff --git a/.github/workflows/cpp-swift-analysis.yml b/.github/workflows/cpp-swift-analysis.yml
index 18c2708d7b4f..f72c13cdd708 100644
--- a/.github/workflows/cpp-swift-analysis.yml
+++ b/.github/workflows/cpp-swift-analysis.yml
@@ -28,7 +28,7 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
diff --git a/.github/workflows/csharp-qltest.yml b/.github/workflows/csharp-qltest.yml
index ef0b93c50c81..580861af17bb 100644
--- a/.github/workflows/csharp-qltest.yml
+++ b/.github/workflows/csharp-qltest.yml
@@ -39,7 +39,7 @@ jobs:
os: [ubuntu-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Setup dotnet
uses: actions/setup-dotnet@v4
with:
@@ -55,7 +55,7 @@ jobs:
stubgentest:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: ./csharp/actions/create-extractor-pack
- name: Run stub generator tests
run: |
diff --git a/.github/workflows/csv-coverage-metrics.yml b/.github/workflows/csv-coverage-metrics.yml
index 08f0e9883efc..c9ec9e602d2b 100644
--- a/.github/workflows/csv-coverage-metrics.yml
+++ b/.github/workflows/csv-coverage-metrics.yml
@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
- name: Create empty database
@@ -51,7 +51,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
- name: Create empty database
diff --git a/.github/workflows/csv-coverage-pr-artifacts.yml b/.github/workflows/csv-coverage-pr-artifacts.yml
index cbd92dd47d75..c62de00535e2 100644
--- a/.github/workflows/csv-coverage-pr-artifacts.yml
+++ b/.github/workflows/csv-coverage-pr-artifacts.yml
@@ -35,11 +35,11 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql) - MERGE
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: merge
- name: Clone self (github/codeql) - BASE
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
fetch-depth: 2
path: base
diff --git a/.github/workflows/csv-coverage-pr-comment.yml b/.github/workflows/csv-coverage-pr-comment.yml
index cf01ef063acf..534725815b4b 100644
--- a/.github/workflows/csv-coverage-pr-comment.yml
+++ b/.github/workflows/csv-coverage-pr-comment.yml
@@ -24,7 +24,7 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql)
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Set up Python 3.8
uses: actions/setup-python@v4
with:
diff --git a/.github/workflows/csv-coverage-timeseries.yml b/.github/workflows/csv-coverage-timeseries.yml
index 13dc99b162cc..11bc06bee602 100644
--- a/.github/workflows/csv-coverage-timeseries.yml
+++ b/.github/workflows/csv-coverage-timeseries.yml
@@ -12,11 +12,11 @@ jobs:
steps:
- name: Clone self (github/codeql)
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: script
- name: Clone self (github/codeql) for analysis
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: codeqlModels
fetch-depth: 0
diff --git a/.github/workflows/csv-coverage-update.yml b/.github/workflows/csv-coverage-update.yml
index 6b73bff820d2..9f7a0b778dab 100644
--- a/.github/workflows/csv-coverage-update.yml
+++ b/.github/workflows/csv-coverage-update.yml
@@ -21,7 +21,7 @@ jobs:
GITHUB_CONTEXT: ${{ toJSON(github.event) }}
run: echo "$GITHUB_CONTEXT"
- name: Clone self (github/codeql)
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: ql
fetch-depth: 0
diff --git a/.github/workflows/csv-coverage.yml b/.github/workflows/csv-coverage.yml
index 525f4bfb64cf..a1224456410a 100644
--- a/.github/workflows/csv-coverage.yml
+++ b/.github/workflows/csv-coverage.yml
@@ -16,11 +16,11 @@ jobs:
steps:
- name: Clone self (github/codeql)
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: script
- name: Clone self (github/codeql) for analysis
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: codeqlModels
ref: ${{ github.event.inputs.qlModelShaOverride || github.ref }}
diff --git a/.github/workflows/fast-forward.yml b/.github/workflows/fast-forward.yml
index dd8fefbc529f..d71f8be20f99 100644
--- a/.github/workflows/fast-forward.yml
+++ b/.github/workflows/fast-forward.yml
@@ -26,7 +26,7 @@ jobs:
exit 1
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Git config
shell: bash
diff --git a/.github/workflows/go-tests.yml b/.github/workflows/go-tests.yml
index c30abdd9e5d7..6578f09b8dfc 100644
--- a/.github/workflows/go-tests.yml
+++ b/.github/workflows/go-tests.yml
@@ -22,7 +22,7 @@ jobs:
runs-on: ubuntu-latest-xl
steps:
- name: Check out code
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Run tests
uses: ./go/actions/test
with:
diff --git a/.github/workflows/kotlin-build.yml b/.github/workflows/kotlin-build.yml
index 565c3d3a8ba4..71a9f8b525ce 100644
--- a/.github/workflows/kotlin-build.yml
+++ b/.github/workflows/kotlin-build.yml
@@ -20,7 +20,7 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- run: |
bazel query //java/kotlin-extractor/...
# only build the default version as a quick check that we can build from `codeql`
diff --git a/.github/workflows/mad_modelDiff.yml b/.github/workflows/mad_modelDiff.yml
index b0e4a20f2b84..3b96d903e232 100644
--- a/.github/workflows/mad_modelDiff.yml
+++ b/.github/workflows/mad_modelDiff.yml
@@ -28,12 +28,12 @@ jobs:
slug: ${{fromJson(github.event.inputs.projects || '["apache/commons-codec", "apache/commons-io", "apache/commons-beanutils", "apache/commons-logging", "apache/commons-fileupload", "apache/commons-lang", "apache/commons-validator", "apache/commons-csv", "apache/dubbo"]' )}}
steps:
- name: Clone github/codeql from PR
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
if: github.event.pull_request
with:
path: codeql-pr
- name: Clone github/codeql from main
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: codeql-main
ref: main
diff --git a/.github/workflows/mad_regenerate-models.yml b/.github/workflows/mad_regenerate-models.yml
index 61e4f9862433..402dd9573318 100644
--- a/.github/workflows/mad_regenerate-models.yml
+++ b/.github/workflows/mad_regenerate-models.yml
@@ -30,11 +30,11 @@ jobs:
ref: "placeholder"
steps:
- name: Clone self (github/codeql)
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Setup CodeQL binaries
uses: ./.github/actions/fetch-codeql
- name: Clone repositories
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: repos/${{ matrix.ref }}
ref: ${{ matrix.ref }}
diff --git a/.github/workflows/python-tooling.yml b/.github/workflows/python-tooling.yml
index 19059070878f..bab1277dd03d 100644
--- a/.github/workflows/python-tooling.yml
+++ b/.github/workflows/python-tooling.yml
@@ -21,7 +21,7 @@ jobs:
check-python-tooling:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: '3.12'
diff --git a/.github/workflows/qhelp-pr-preview.yml b/.github/workflows/qhelp-pr-preview.yml
index be5a42096bba..a152eb7cc097 100644
--- a/.github/workflows/qhelp-pr-preview.yml
+++ b/.github/workflows/qhelp-pr-preview.yml
@@ -43,7 +43,7 @@ jobs:
if-no-files-found: error
retention-days: 1
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
with:
fetch-depth: 2
persist-credentials: false
diff --git a/.github/workflows/ql-for-ql-build.yml b/.github/workflows/ql-for-ql-build.yml
index 73833da05491..9c568a9b5729 100644
--- a/.github/workflows/ql-for-ql-build.yml
+++ b/.github/workflows/ql-for-ql-build.yml
@@ -19,7 +19,7 @@ jobs:
runs-on: ubuntu-latest-xl
steps:
### Build the queries ###
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Find codeql
diff --git a/.github/workflows/ql-for-ql-dataset_measure.yml b/.github/workflows/ql-for-ql-dataset_measure.yml
index c3441ffa4074..b4561c04a965 100644
--- a/.github/workflows/ql-for-ql-dataset_measure.yml
+++ b/.github/workflows/ql-for-ql-dataset_measure.yml
@@ -25,7 +25,7 @@ jobs:
- github/codeql
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Find codeql
id: find-codeql
@@ -46,7 +46,7 @@ jobs:
env:
CODEQL: ${{ steps.find-codeql.outputs.codeql-path }}
- name: Checkout ${{ matrix.repo }}
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
repository: ${{ matrix.repo }}
path: ${{ github.workspace }}/repo
@@ -75,7 +75,7 @@ jobs:
runs-on: ubuntu-latest
needs: measure
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/download-artifact@v4
with:
name: measurements
diff --git a/.github/workflows/ql-for-ql-tests.yml b/.github/workflows/ql-for-ql-tests.yml
index 4502dded53f4..fdb9da284cef 100644
--- a/.github/workflows/ql-for-ql-tests.yml
+++ b/.github/workflows/ql-for-ql-tests.yml
@@ -24,7 +24,7 @@ jobs:
qltest:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Find codeql
id: find-codeql
uses: github/codeql-action/init@main
@@ -64,7 +64,7 @@ jobs:
needs: [qltest]
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Install GNU tar
if: runner.os == 'macOS'
run: |
diff --git a/.github/workflows/query-list.yml b/.github/workflows/query-list.yml
index a286b9b846bf..a383e381d90f 100644
--- a/.github/workflows/query-list.yml
+++ b/.github/workflows/query-list.yml
@@ -23,7 +23,7 @@ jobs:
steps:
- name: Clone self (github/codeql)
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
path: codeql
- name: Set up Python 3.8
diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml
index 343e896151c2..39aadef09138 100644
--- a/.github/workflows/ruby-build.yml
+++ b/.github/workflows/ruby-build.yml
@@ -47,7 +47,7 @@ jobs:
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Install GNU tar
if: runner.os == 'macOS'
run: |
@@ -113,7 +113,7 @@ jobs:
if: github.repository_owner == 'github'
runs-on: ubuntu-latest-xl
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Fetch CodeQL
uses: ./.github/actions/fetch-codeql
- name: Cache compilation cache
@@ -146,7 +146,7 @@ jobs:
runs-on: ubuntu-latest
needs: [build, compile-queries]
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/download-artifact@v4
with:
name: ruby.dbscheme
@@ -209,7 +209,7 @@ jobs:
runs-on: ${{ matrix.os }}
needs: [package]
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Fetch CodeQL
uses: ./.github/actions/fetch-codeql
diff --git a/.github/workflows/ruby-dataset-measure.yml b/.github/workflows/ruby-dataset-measure.yml
index e3229b158063..a88b23bf3a10 100644
--- a/.github/workflows/ruby-dataset-measure.yml
+++ b/.github/workflows/ruby-dataset-measure.yml
@@ -30,14 +30,14 @@ jobs:
repo: [rails/rails, discourse/discourse, spree/spree, ruby/ruby]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- uses: ./ruby/actions/create-extractor-pack
- name: Checkout ${{ matrix.repo }}
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
with:
repository: ${{ matrix.repo }}
path: ${{ github.workspace }}/repo
@@ -62,7 +62,7 @@ jobs:
runs-on: ubuntu-latest
needs: measure
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: actions/download-artifact@v4
with:
path: stats
diff --git a/.github/workflows/ruby-qltest-rtjo.yml b/.github/workflows/ruby-qltest-rtjo.yml
index c2ae9c0cef19..1d57c465538e 100644
--- a/.github/workflows/ruby-qltest-rtjo.yml
+++ b/.github/workflows/ruby-qltest-rtjo.yml
@@ -25,7 +25,7 @@ jobs:
strategy:
fail-fast: false
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- uses: ./ruby/actions/create-extractor-pack
- name: Cache compilation cache
diff --git a/.github/workflows/ruby-qltest.yml b/.github/workflows/ruby-qltest.yml
index d1518205dab9..e178a5dfb6e0 100644
--- a/.github/workflows/ruby-qltest.yml
+++ b/.github/workflows/ruby-qltest.yml
@@ -36,7 +36,7 @@ jobs:
qlupgrade:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- name: Check DB upgrade scripts
run: |
@@ -58,7 +58,7 @@ jobs:
strategy:
fail-fast: false
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- uses: ./ruby/actions/create-extractor-pack
- name: Cache compilation cache
diff --git a/.github/workflows/rust-analysis.yml b/.github/workflows/rust-analysis.yml
index 04028ad594bc..397aa2fba512 100644
--- a/.github/workflows/rust-analysis.yml
+++ b/.github/workflows/rust-analysis.yml
@@ -35,7 +35,7 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Query latest nightly CodeQL bundle
shell: bash
diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml
index cc880072555e..34f5efb74ba6 100644
--- a/.github/workflows/rust.yml
+++ b/.github/workflows/rust.yml
@@ -30,7 +30,7 @@ jobs:
working-directory: rust/ast-generator
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Inject sources
shell: bash
run: |
@@ -53,7 +53,7 @@ jobs:
working-directory: rust/extractor
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Format
shell: bash
run: |
@@ -69,7 +69,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Install CodeQL
uses: ./.github/actions/fetch-codeql
- name: Code generation
diff --git a/.github/workflows/swift.yml b/.github/workflows/swift.yml
index df610a967025..4a5613f988e5 100644
--- a/.github/workflows/swift.yml
+++ b/.github/workflows/swift.yml
@@ -36,7 +36,7 @@ jobs:
fail-fast: false
runs-on: ${{ matrix.runner }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Setup (Linux)
if: runner.os == 'Linux'
run: |
@@ -53,7 +53,7 @@ jobs:
clang-format:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507
name: Check that python code is properly formatted
with:
@@ -61,7 +61,7 @@ jobs:
codegen:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- uses: ./.github/actions/fetch-codeql
- uses: pre-commit/action@646c83fcd040023954eafda54b4db0192ce70507
name: Check that QL generated code was checked in
@@ -77,6 +77,6 @@ jobs:
check-no-override:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Check that no override is present in load.bzl
run: bazel test ... --test_tag_filters=override --test_output=errors
diff --git a/.github/workflows/sync-files.yml b/.github/workflows/sync-files.yml
index 1ed49ac3ecf6..f7f42f2e5aff 100644
--- a/.github/workflows/sync-files.yml
+++ b/.github/workflows/sync-files.yml
@@ -17,7 +17,7 @@ jobs:
sync:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Check synchronized files
run: python config/sync-files.py
- name: Check dbscheme fragments
diff --git a/.github/workflows/tree-sitter-extractor-test.yml b/.github/workflows/tree-sitter-extractor-test.yml
index 9a71e1fc7c54..da5834a7f9f3 100644
--- a/.github/workflows/tree-sitter-extractor-test.yml
+++ b/.github/workflows/tree-sitter-extractor-test.yml
@@ -30,7 +30,7 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Check formatting
run: cargo fmt -- --check
- name: Run tests
@@ -38,12 +38,12 @@ jobs:
fmt:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Check formatting
run: cargo fmt --check
clippy:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- name: Run clippy
run: cargo clippy -- --no-deps -D warnings -A clippy::new_without_default -A clippy::too_many_arguments
diff --git a/.github/workflows/validate-change-notes.yml b/.github/workflows/validate-change-notes.yml
index 42784b661fcc..6812d8ff0f6d 100644
--- a/.github/workflows/validate-change-notes.yml
+++ b/.github/workflows/validate-change-notes.yml
@@ -23,7 +23,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
- uses: actions/checkout@v4
+ uses: actions/checkout@v5
- name: Setup CodeQL
uses: ./.github/actions/fetch-codeql
diff --git a/.github/workflows/zipmerge-test.yml b/.github/workflows/zipmerge-test.yml
index edae93a90a00..1e7ac195b5a7 100644
--- a/.github/workflows/zipmerge-test.yml
+++ b/.github/workflows/zipmerge-test.yml
@@ -18,6 +18,6 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v5
- run: |
bazel test //misc/bazel/internal/zipmerge:test --test_output=all
diff --git a/Cargo.lock b/Cargo.lock
index 263b16482a98..b712c4f8d24b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -40,9 +40,9 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.18"
+version = "0.6.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
+checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -55,44 +55,44 @@ dependencies = [
[[package]]
name = "anstyle"
-version = "1.0.10"
+version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
+checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
[[package]]
name = "anstyle-parse"
-version = "0.2.6"
+version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
+checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.1.2"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
+checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "anstyle-wincon"
-version = "3.0.7"
+version = "3.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e"
+checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
dependencies = [
"anstyle",
- "once_cell",
+ "once_cell_polyfill",
"windows-sys 0.59.0",
]
[[package]]
name = "anyhow"
-version = "1.0.98"
+version = "1.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
+checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
[[package]]
name = "argfile"
@@ -136,9 +136,9 @@ dependencies = [
[[package]]
name = "autocfg"
-version = "1.4.0"
+version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
@@ -160,9 +160,9 @@ checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967"
[[package]]
name = "borsh"
-version = "1.5.5"
+version = "1.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc"
+checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce"
dependencies = [
"cfg_aliases",
]
@@ -185,9 +185,9 @@ dependencies = [
[[package]]
name = "bumpalo"
-version = "3.16.0"
+version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
+checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
[[package]]
name = "bytemuck"
@@ -195,12 +195,6 @@ version = "1.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3"
-[[package]]
-name = "byteorder"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
-
[[package]]
name = "camino"
version = "1.1.10"
@@ -221,25 +215,25 @@ dependencies = [
[[package]]
name = "cargo-util-schemas"
-version = "0.2.0"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e63d2780ac94487eb9f1fea7b0d56300abc9eb488800854ca217f102f5caccca"
+checksum = "7dc1a6f7b5651af85774ae5a34b4e8be397d9cf4bc063b7e6dbd99a841837830"
dependencies = [
"semver",
"serde",
"serde-untagged",
"serde-value",
- "thiserror 1.0.69",
- "toml",
+ "thiserror",
+ "toml 0.8.23",
"unicode-xid",
"url",
]
[[package]]
name = "cargo_metadata"
-version = "0.20.0"
+version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4f7835cfc6135093070e95eb2b53e5d9b5c403dc3a6be6040ee026270aa82502"
+checksum = "5cfca2aaa699835ba88faf58a06342a314a950d2b9686165e038286c30316868"
dependencies = [
"camino",
"cargo-platform",
@@ -247,14 +241,14 @@ dependencies = [
"semver",
"serde",
"serde_json",
- "thiserror 2.0.12",
+ "thiserror",
]
[[package]]
name = "cc"
-version = "1.2.7"
+version = "1.2.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a012a0df96dd6d06ba9a1b29d6402d1a5d77c6befd2566afdc26e10603dc93d7"
+checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362"
dependencies = [
"jobserver",
"libc",
@@ -285,6 +279,18 @@ dependencies = [
"synstructure",
]
+[[package]]
+name = "chalk-derive"
+version = "0.104.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ea9b1e80910f66ae87c772247591432032ef3f6a67367ff17f8343db05beafa"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
+
[[package]]
name = "chalk-ir"
version = "0.103.0"
@@ -292,7 +298,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90a37d2ab99352b4caca135061e7b4ac67024b648c28ed0b787feec4bea4caed"
dependencies = [
"bitflags 2.9.1",
- "chalk-derive",
+ "chalk-derive 0.103.0",
+]
+
+[[package]]
+name = "chalk-ir"
+version = "0.104.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7047a516de16226cd17344d41a319d0ea1064bf9e60bd612ab341ab4a34bbfa8"
+dependencies = [
+ "bitflags 2.9.1",
+ "chalk-derive 0.104.0",
]
[[package]]
@@ -301,8 +317,8 @@ version = "0.103.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c855be60e646664bc37c2496d3dc81ca5ef60520930e5e0f0057a0575aff6c19"
dependencies = [
- "chalk-derive",
- "chalk-ir",
+ "chalk-derive 0.103.0",
+ "chalk-ir 0.103.0",
"chalk-solve",
"rustc-hash 1.1.0",
"tracing",
@@ -314,10 +330,10 @@ version = "0.103.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "477ac6cdfd2013e9f93b09b036c2b607a67b2e728f4777b8422d55a79e9e3a34"
dependencies = [
- "chalk-derive",
- "chalk-ir",
+ "chalk-derive 0.103.0",
+ "chalk-ir 0.103.0",
"ena",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"itertools 0.12.1",
"petgraph",
"rustc-hash 1.1.0",
@@ -341,9 +357,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.40"
+version = "4.5.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
+checksum = "1c1f056bae57e3e54c3375c41ff79619ddd13460a17d7438712bd0d83fda4ff8"
dependencies = [
"clap_builder",
"clap_derive",
@@ -351,9 +367,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.40"
+version = "4.5.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
+checksum = "b3e7f4214277f3c7aa526a59dd3fbe306a370daee1f8b7b8c987069cd8e888a8"
dependencies = [
"anstream",
"anstyle",
@@ -363,9 +379,9 @@ dependencies = [
[[package]]
name = "clap_derive"
-version = "4.5.40"
+version = "4.5.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce"
+checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491"
dependencies = [
"heck",
"proc-macro2",
@@ -375,9 +391,9 @@ dependencies = [
[[package]]
name = "clap_lex"
-version = "0.7.4"
+version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
+checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
[[package]]
name = "codeql-autobuilder-rust"
@@ -433,7 +449,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"argfile",
- "chalk-ir",
+ "chalk-ir 0.104.0",
"chrono",
"clap",
"codeql-extractor",
@@ -462,7 +478,7 @@ dependencies = [
"serde",
"serde_json",
"serde_with",
- "toml",
+ "toml 0.9.5",
"tracing",
"tracing-flame",
"tracing-subscriber",
@@ -471,9 +487,9 @@ dependencies = [
[[package]]
name = "colorchoice"
-version = "1.0.3"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
+checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]]
name = "core-foundation-sys"
@@ -547,9 +563,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]]
name = "darling"
-version = "0.20.10"
+version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
+checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
dependencies = [
"darling_core",
"darling_macro",
@@ -557,9 +573,9 @@ dependencies = [
[[package]]
name = "darling_core"
-version = "0.20.10"
+version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
+checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
dependencies = [
"fnv",
"ident_case",
@@ -571,9 +587,9 @@ dependencies = [
[[package]]
name = "darling_macro"
-version = "0.20.10"
+version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
+checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
"darling_core",
"quote",
@@ -596,9 +612,9 @@ dependencies = [
[[package]]
name = "deranged"
-version = "0.3.11"
+version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e"
dependencies = [
"powerfmt",
"serde",
@@ -817,21 +833,21 @@ checksum = "7ab85b9b05e3978cc9a9cf8fea7f01b494e1a09ed3037e16ba39edc7a29eb61a"
[[package]]
name = "getrandom"
-version = "0.3.1"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8"
+checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4"
dependencies = [
"cfg-if",
"libc",
- "wasi 0.13.3+wasi-0.2.2",
- "windows-targets 0.52.6",
+ "r-efi",
+ "wasi 0.14.2+wasi-0.2.4",
]
[[package]]
name = "glob"
-version = "0.3.2"
+version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
+checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
[[package]]
name = "globset"
@@ -860,9 +876,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]]
name = "hashbrown"
-version = "0.15.2"
+version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
dependencies = [
"allocator-api2",
"equivalent",
@@ -875,7 +891,7 @@ version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
dependencies = [
- "hashbrown 0.15.2",
+ "hashbrown 0.15.4",
]
[[package]]
@@ -907,14 +923,15 @@ dependencies = [
[[package]]
name = "iana-time-zone"
-version = "0.1.61"
+version = "0.1.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
+checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
+ "log 0.4.27",
"wasm-bindgen",
"windows-core",
]
@@ -1054,12 +1071,12 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.9.0"
+version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
+checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
dependencies = [
"equivalent",
- "hashbrown 0.15.2",
+ "hashbrown 0.15.4",
"serde",
]
@@ -1089,6 +1106,15 @@ dependencies = [
"libc",
]
+[[package]]
+name = "intrusive-collections"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86"
+dependencies = [
+ "memoffset",
+]
+
[[package]]
name = "is_terminal_polyfill"
version = "1.70.1"
@@ -1136,9 +1162,9 @@ checksum = "a037eddb7d28de1d0fc42411f501b53b75838d313908078d6698d064f3029b24"
[[package]]
name = "js-sys"
-version = "0.3.76"
+version = "0.3.77"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7"
+checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -1146,9 +1172,9 @@ dependencies = [
[[package]]
name = "kqueue"
-version = "1.0.8"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c"
+checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a"
dependencies = [
"kqueue-sys",
"libc",
@@ -1184,9 +1210,9 @@ checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "libredox"
-version = "0.1.3"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d"
+checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638"
dependencies = [
"bitflags 2.9.1",
"libc",
@@ -1211,9 +1237,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
[[package]]
name = "lock_api"
-version = "0.4.12"
+version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -1269,14 +1295,14 @@ dependencies = [
[[package]]
name = "mio"
-version = "1.0.3"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
+checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
dependencies = [
"libc",
"log 0.4.27",
- "wasi 0.11.0+wasi-snapshot-preview1",
- "windows-sys 0.52.0",
+ "wasi 0.11.1+wasi-snapshot-preview1",
+ "windows-sys 0.59.0",
]
[[package]]
@@ -1366,9 +1392,15 @@ dependencies = [
[[package]]
name = "once_cell"
-version = "1.20.3"
+version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
+[[package]]
+name = "once_cell_polyfill"
+version = "1.70.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
[[package]]
name = "oorandom"
@@ -1400,11 +1432,21 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+[[package]]
+name = "papaya"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f92dd0b07c53a0a0c764db2ace8c541dc47320dad97c2200c2a637ab9dd2328f"
+dependencies = [
+ "equivalent",
+ "seize",
+]
+
[[package]]
name = "parking_lot"
-version = "0.12.3"
+version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -1412,9 +1454,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.10"
+version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
@@ -1478,7 +1520,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
dependencies = [
"fixedbitset",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
]
[[package]]
@@ -1495,9 +1537,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c"
[[package]]
name = "portable-atomic"
-version = "1.11.0"
+version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
+checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
[[package]]
name = "potential_utf"
@@ -1516,18 +1558,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
[[package]]
name = "ppv-lite86"
-version = "0.2.20"
+version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04"
+checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9"
dependencies = [
- "zerocopy 0.7.35",
+ "zerocopy",
]
[[package]]
name = "proc-macro2"
-version = "1.0.95"
+version = "1.0.97"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1"
dependencies = [
"unicode-ident",
]
@@ -1554,11 +1596,17 @@ dependencies = [
"proc-macro2",
]
+[[package]]
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
[[package]]
name = "ra-ap-rustc_abi"
-version = "0.116.0"
+version = "0.123.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a967e3a9cd3e38b543f503978e0eccee461e3aea3f7b10e944959bff41dbe612"
+checksum = "f18c877575c259d127072e9bfc41d985202262fb4d6bfdae3d1252147c2562c2"
dependencies = [
"bitflags 2.9.1",
"ra-ap-rustc_hashes",
@@ -1568,18 +1616,18 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_hashes"
-version = "0.116.0"
+version = "0.123.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ea4c755ecbbffa5743c251344f484ebe571ec7bc5b36d80b2a8ae775d1a7a40"
+checksum = "2439ed1df3472443133b66949f81080dff88089b42f825761455463709ee1cad"
dependencies = [
"rustc-stable-hash",
]
[[package]]
name = "ra-ap-rustc_index"
-version = "0.116.0"
+version = "0.123.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aca7ad7cf911538c619caa2162339fe98637e9e46f11bb0484ef96735df4d64a"
+checksum = "57a24fe0be21be1f8ebc21dcb40129214fb4cefb0f2753f3d46b6dbe656a1a45"
dependencies = [
"ra-ap-rustc_index_macros",
"smallvec",
@@ -1587,9 +1635,9 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_index_macros"
-version = "0.116.0"
+version = "0.123.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8767ba551c9355bc3031be072cc4bb0381106e5e7cd275e72b7a8c76051c4070"
+checksum = "844a27ddcad0116facae2df8e741fd788662cf93dc13029cd864f2b8013b81f9"
dependencies = [
"proc-macro2",
"quote",
@@ -1598,9 +1646,20 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_lexer"
-version = "0.116.0"
+version = "0.121.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6101374afb267e6c27e4e2eb0b1352e9f3504c1a8f716f619cd39244e2ed92ab"
+checksum = "22944e31fb91e9b3e75bcbc91e37d958b8c0825a6160927f2856831d2ce83b36"
+dependencies = [
+ "memchr",
+ "unicode-properties",
+ "unicode-xid",
+]
+
+[[package]]
+name = "ra-ap-rustc_lexer"
+version = "0.123.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b734cfcb577d09877799a22742f1bd398be6c00bc428d9de56d48d11ece5771"
dependencies = [
"memchr",
"unicode-properties",
@@ -1609,19 +1668,19 @@ dependencies = [
[[package]]
name = "ra-ap-rustc_parse_format"
-version = "0.116.0"
+version = "0.121.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecd88a19f00da4f43e6727d5013444cbc399804b5046dfa2bbcd28ebed3970ce"
+checksum = "81057891bc2063ad9e353f29462fbc47a0f5072560af34428ae9313aaa5e9d97"
dependencies = [
- "ra-ap-rustc_lexer",
- "rustc-literal-escaper 0.0.2",
+ "ra-ap-rustc_lexer 0.121.0",
+ "rustc-literal-escaper",
]
[[package]]
name = "ra-ap-rustc_pattern_analysis"
-version = "0.116.0"
+version = "0.123.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb332dd32d7850a799862533b1c021e6062558861a4ad57817bf522499fbb892"
+checksum = "75b0ee1f059b9dea0818c6c7267478926eee95ba4c7dcf89c8db32fa165d3904"
dependencies = [
"ra-ap-rustc_index",
"rustc-hash 2.1.1",
@@ -1632,12 +1691,12 @@ dependencies = [
[[package]]
name = "ra_ap_base_db"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edf27fccb119fe85faf51f51847df9695d3cca30c2427fed9b4d71e6adebb54f"
+checksum = "47cac371778785196064f1a347fbbac0aafb1053786f17378bb138be59e57fc2"
dependencies = [
"dashmap",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"la-arena",
"ra_ap_cfg",
"ra_ap_intern",
@@ -1655,9 +1714,9 @@ dependencies = [
[[package]]
name = "ra_ap_cfg"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cea86a5d6e84fd73824c26f52442807af911db038db821124b2ac65fac24209"
+checksum = "6789ed14467e6625bef45b29555844d0168d8af1bea9edb0f1d44f0a9b69f398"
dependencies = [
"ra_ap_intern",
"ra_ap_tt",
@@ -1667,19 +1726,19 @@ dependencies = [
[[package]]
name = "ra_ap_edition"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5538d534eeb8526071610664dc64b71ca336b78f6933ff7241d10c1f37e91b"
+checksum = "637b74c692dc9d9b44394f8c0f91c063e1b6223c6e54f4ee89c943db2f2ee26e"
[[package]]
name = "ra_ap_hir"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44796828650900565917ddcc944fecdf6c7d5c3a8a31141f17268ea8c1d2e6f0"
+checksum = "a94c69a3830f0b6fbc36c1d098fcc9430f63c8d47ee6f93e3d6810c3bf440296"
dependencies = [
"arrayvec",
"either",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"itertools 0.14.0",
"ra_ap_base_db",
"ra_ap_cfg",
@@ -1699,9 +1758,9 @@ dependencies = [
[[package]]
name = "ra_ap_hir_def"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8949b2fb362a1e4eab4d90c7299f0fad3f2c887d9f7d9c286ac6530da4141f85"
+checksum = "7d94fcf7743db2f4f7e2c2911563847eb8efe2b7fb9fa430c107f0ac05962254"
dependencies = [
"arrayvec",
"bitflags 2.9.1",
@@ -1709,7 +1768,7 @@ dependencies = [
"drop_bomb",
"either",
"fst",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"itertools 0.14.0",
"la-arena",
"ra-ap-rustc_abi",
@@ -1737,9 +1796,9 @@ dependencies = [
[[package]]
name = "ra_ap_hir_expand"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22457a431b5eeb67517e03266fddefe48839b060a674a6b18bd84269012ede1e"
+checksum = "67ea3f6a0ba0c1e8b63f4a41bc596c07aeb2db2f99b67fa077820cfb5fce58bd"
dependencies = [
"cov-mark",
"either",
@@ -1765,20 +1824,20 @@ dependencies = [
[[package]]
name = "ra_ap_hir_ty"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a4b7a7531414203e11ae447627e2909250eff392c06278ab53ae2a022ecc9fc"
+checksum = "eccf6c291a88892e59e7591e081da8b9158f8c0b1ed9cb9b73d02d29a0d3d6d9"
dependencies = [
"arrayvec",
"bitflags 2.9.1",
- "chalk-derive",
- "chalk-ir",
+ "chalk-derive 0.103.0",
+ "chalk-ir 0.103.0",
"chalk-recursive",
"chalk-solve",
"cov-mark",
"either",
"ena",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"itertools 0.14.0",
"la-arena",
"oorandom",
@@ -1806,9 +1865,9 @@ dependencies = [
[[package]]
name = "ra_ap_ide_db"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77741ceb096d4f5ecf5384210ea5a2b46878125047c6b0df2bdcfac08a20ea0c"
+checksum = "0bbbc97cc9837f91100711b65fb0d8ce9d7ed8da0dc418e08678d973d53da6a3"
dependencies = [
"arrayvec",
"bitflags 2.9.1",
@@ -1816,7 +1875,7 @@ dependencies = [
"crossbeam-channel",
"either",
"fst",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"itertools 0.14.0",
"line-index",
"memchr",
@@ -1840,9 +1899,9 @@ dependencies = [
[[package]]
name = "ra_ap_intern"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a1872cd5a425db6d5247a7deca11526e3104757f6732447ac6ee93c3e795725"
+checksum = "10f4785a674a41f9f52414fb7f19ab9a1d6886cad572e68721a883b0b85c256b"
dependencies = [
"dashmap",
"hashbrown 0.14.5",
@@ -1852,9 +1911,9 @@ dependencies = [
[[package]]
name = "ra_ap_load-cargo"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f30f5433f056594b02f1879c5c2ce76ea9fd395f21e2a55df6ce3229db993caa"
+checksum = "f3be9990782fd2c2d90b67e2e0b4a86e7412ec8a0719950d9a68292924e85691"
dependencies = [
"anyhow",
"crossbeam-channel",
@@ -1873,13 +1932,13 @@ dependencies = [
[[package]]
name = "ra_ap_mbe"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "222a993acaec35e90c08357aecd530b7170cc3a7f13b3ddfd15a200029ccd555"
+checksum = "5b713f4d927f9d86391f66237019b8e5dbcad4ddbbe37c91c2e21adca258b9aa"
dependencies = [
"arrayvec",
"cov-mark",
- "ra-ap-rustc_lexer",
+ "ra-ap-rustc_lexer 0.123.0",
"ra_ap_intern",
"ra_ap_parser",
"ra_ap_span",
@@ -1892,33 +1951,33 @@ dependencies = [
[[package]]
name = "ra_ap_parser"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c5693f5efd27832e1ac572ea756a1a4a3f7eba07f1287268ca111710971c2e5"
+checksum = "0d3fb8a5891c1c1d6fba5e58caa86b88f831990c878e361c54c1c1ff44ca8401"
dependencies = [
"drop_bomb",
- "ra-ap-rustc_lexer",
+ "ra-ap-rustc_lexer 0.123.0",
"ra_ap_edition",
- "rustc-literal-escaper 0.0.3",
+ "rustc-literal-escaper",
"tracing",
]
[[package]]
name = "ra_ap_paths"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39418eff64e59d4bf90dd825ac7d242576e9554669824ebc55a6628bde0aaf10"
+checksum = "9ccd5cfd0dae89ab2c70c4e5aa646f64bb8b5591622477342863c23a5f32dabc"
dependencies = [
"camino",
]
[[package]]
name = "ra_ap_proc_macro_api"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14a315af8c4a9379c26abe7baa143d62e3975ff26f27c65332f9a5edccc56d38"
+checksum = "dae43c707bfb78f1b841ffb3731cc7876550463306c3b3986c20abd31033e7a2"
dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"ra_ap_intern",
"ra_ap_paths",
"ra_ap_span",
@@ -1933,9 +1992,9 @@ dependencies = [
[[package]]
name = "ra_ap_profile"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08274a0adbf8255f8b2672302452e31bbb2ed4d38324da9c72a7bf9cf1428483"
+checksum = "95a7b93ca94cf0821e8bcac6bf8464cc94d7b3cbe63ffb74946a58ad03991fae"
dependencies = [
"cfg-if",
"libc",
@@ -1945,9 +2004,9 @@ dependencies = [
[[package]]
name = "ra_ap_project_model"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33deecb3724faf91f13b0f1b5115af7c4f5c9dc1dfbbf45f55261aa28f874838"
+checksum = "0751b9433a0dd49c6ae58c9572faf9557d2b53818370d72112b3adeaae5eabc4"
dependencies = [
"anyhow",
"cargo_metadata",
@@ -1965,15 +2024,16 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
+ "temp-dir",
"tracing",
"triomphe",
]
[[package]]
name = "ra_ap_query-group-macro"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5fdefdc9c8d6fd7d85ac572649378e83266262e09400bfdb7c8a7407d3cc2a3e"
+checksum = "5a82732eb8f5dc592d1d8d9bee23c1d66532e39293f02e23c7a546b60b35072b"
dependencies = [
"proc-macro2",
"quote",
@@ -1982,9 +2042,9 @@ dependencies = [
[[package]]
name = "ra_ap_span"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c20071c89e1f7dd63c803130634f4bb6ce7783dc0e7ff90839d1d0f4e625b7a8"
+checksum = "c498ddf2d71705dcef9fb142269c0027c959a5eb17c435eea5466af7c3b9c47c"
dependencies = [
"hashbrown 0.14.5",
"la-arena",
@@ -1998,9 +2058,9 @@ dependencies = [
[[package]]
name = "ra_ap_stdx"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "552df390b26624eca7936aea1dbbb3786d7a12477e26ef917ffabba19f75ad44"
+checksum = "26ade567b0d692c7efd4ceb921cdbe182beca0b5af9a5cf05c07cf0e14db512a"
dependencies = [
"crossbeam-channel",
"crossbeam-utils",
@@ -2014,9 +2074,9 @@ dependencies = [
[[package]]
name = "ra_ap_syntax"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a78db1a9966c0fa05446b8185da35a325680741119366c6246e4a9800f29143a"
+checksum = "dba62d25b0296eb095d9db77e56d096417a89db4f4de1956add0d472ebcaf922"
dependencies = [
"either",
"itertools 0.14.0",
@@ -2024,7 +2084,7 @@ dependencies = [
"ra_ap_stdx",
"rowan",
"rustc-hash 2.1.1",
- "rustc-literal-escaper 0.0.3",
+ "rustc-literal-escaper",
"smol_str",
"tracing",
"triomphe",
@@ -2032,9 +2092,9 @@ dependencies = [
[[package]]
name = "ra_ap_syntax-bridge"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e69ef7fad8598d5c9f14a375d56ec12200fa927bc805b600af419611f4642fdb"
+checksum = "664466f2e824e285b671366f81128aa4a91b501fedbf7956a6bfb1f13d8b0b39"
dependencies = [
"ra_ap_intern",
"ra_ap_parser",
@@ -2047,9 +2107,9 @@ dependencies = [
[[package]]
name = "ra_ap_toolchain"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "628f3f190def67b1116d8bdd6ec4f6f206fada2c93b84ba71086d60c63429282"
+checksum = "2ef82cfc5eb8f9d4a3be9876ce019b78fbfdb8ff4f7e4dee9e384d65122096ab"
dependencies = [
"camino",
"home",
@@ -2057,12 +2117,12 @@ dependencies = [
[[package]]
name = "ra_ap_tt"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e050f4ad13df59e90e38332860304a3e85ff2fa8d4585b8cc44fc982923c82b1"
+checksum = "cbc858f5208f0d00f8638d14ab5ffab5d1bc79ad7fe1db5c5e0d478b9a02155c"
dependencies = [
"arrayvec",
- "ra-ap-rustc_lexer",
+ "ra-ap-rustc_lexer 0.123.0",
"ra_ap_intern",
"ra_ap_stdx",
"text-size",
@@ -2070,13 +2130,13 @@ dependencies = [
[[package]]
name = "ra_ap_vfs"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62082190f0b3551e4d941bcaaac51a7c39c85b2e193bcc50d0807e1701da4083"
+checksum = "e065b27829f5281d2ffc41de72551a0e4c4f49a9989ba7721676f414100c8af2"
dependencies = [
"crossbeam-channel",
"fst",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"nohash-hasher",
"ra_ap_paths",
"ra_ap_stdx",
@@ -2086,9 +2146,9 @@ dependencies = [
[[package]]
name = "ra_ap_vfs-notify"
-version = "0.0.288"
+version = "0.0.300"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efd7cfa1095b81bd1994ab70e5543c97a8733987eb0ddf390cf3ad58d4e2dc57"
+checksum = "5a3c795e86c9b5fcdbb99145e401a0d6348ed471ac96f1b7de151c0abe07a5af"
dependencies = [
"crossbeam-channel",
"notify",
@@ -2103,9 +2163,9 @@ dependencies = [
[[package]]
name = "rand"
-version = "0.9.1"
+version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
+checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha",
"rand_core",
@@ -2123,12 +2183,11 @@ dependencies = [
[[package]]
name = "rand_core"
-version = "0.9.2"
+version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a509b1a2ffbe92afab0e55c8fd99dea1c280e8171bd2d88682bb20bc41cbc2c"
+checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
dependencies = [
"getrandom",
- "zerocopy 0.8.20",
]
[[package]]
@@ -2153,9 +2212,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
-version = "0.5.8"
+version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834"
+checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags 2.9.1",
]
@@ -2259,21 +2318,15 @@ checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
[[package]]
name = "rustc-literal-escaper"
-version = "0.0.2"
+version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0041b6238913c41fe704213a4a9329e2f685a156d1781998128b4149c230ad04"
-
-[[package]]
-name = "rustc-literal-escaper"
-version = "0.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78744cd17f5d01c75b709e49807d1363e02a940ccee2e9e72435843fdb0d076e"
+checksum = "ab03008eb631b703dd16978282ae36c73282e7922fe101a4bd072a40ecea7b8b"
[[package]]
name = "rustc-stable-hash"
-version = "0.1.1"
+version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2febf9acc5ee5e99d1ad0afcdbccc02d87aa3f857a1f01f825b80eacf8edfcd1"
+checksum = "781442f29170c5c93b7185ad559492601acdc71d5bb0706f5868094f45cfcd08"
[[package]]
name = "rustc_apfloat"
@@ -2285,24 +2338,32 @@ dependencies = [
"smallvec",
]
+[[package]]
+name = "rustversion"
+version = "1.0.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d"
+
[[package]]
name = "ryu"
-version = "1.0.19"
+version = "1.0.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
+checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
[[package]]
name = "salsa"
-version = "0.22.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8fff508e3d6ef42a32607f7538e17171a877a12015e32036f46e99d00c95781"
+checksum = "2e235afdb8e510f38a07138fbe5a0b64691894358a9c0cbd813b1aade110efc9"
dependencies = [
"boxcar",
"crossbeam-queue",
- "dashmap",
- "hashbrown 0.15.2",
+ "crossbeam-utils",
+ "hashbrown 0.15.4",
"hashlink",
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
+ "intrusive-collections",
+ "papaya",
"parking_lot",
"portable-atomic",
"rayon",
@@ -2316,17 +2377,16 @@ dependencies = [
[[package]]
name = "salsa-macro-rules"
-version = "0.22.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ea72b3c06f2ce6350fe3a0eeb7aaaf842d1d8352b706973c19c4f02e298a87c"
+checksum = "2edb86a7e9c91f6d30c9ce054312721dbe773a162db27bbfae834d16177b30ce"
[[package]]
name = "salsa-macros"
-version = "0.22.0"
+version = "0.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ce92025bc160b27814a207cb78d680973af17f863c7f4fc56cf3a535e22f378"
+checksum = "d0778d6e209051bc4e75acfe83bcd7848601ec3dbe9c3dbb982829020e9128af"
dependencies = [
- "heck",
"proc-macro2",
"quote",
"syn",
@@ -2354,6 +2414,18 @@ dependencies = [
"serde_json",
]
+[[package]]
+name = "schemars"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
+]
+
[[package]]
name = "scoped-tls"
version = "1.0.1"
@@ -2366,6 +2438,16 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+[[package]]
+name = "seize"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4b8d813387d566f627f3ea1b914c068aac94c40ae27ec43f5f33bde65abefe7"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
[[package]]
name = "semver"
version = "1.0.26"
@@ -2418,9 +2500,9 @@ dependencies = [
[[package]]
name = "serde_json"
-version = "1.0.140"
+version = "1.0.142"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7"
dependencies = [
"itoa",
"memchr",
@@ -2437,18 +2519,28 @@ dependencies = [
"serde",
]
+[[package]]
+name = "serde_spanned"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
+dependencies = [
+ "serde",
+]
+
[[package]]
name = "serde_with"
-version = "3.13.0"
+version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf65a400f8f66fb7b0552869ad70157166676db75ed8181f8104ea91cf9d0b42"
+checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5"
dependencies = [
"base64",
"chrono",
"hex",
"indexmap 1.9.3",
- "indexmap 2.9.0",
- "schemars",
+ "indexmap 2.10.0",
+ "schemars 0.9.0",
+ "schemars 1.0.4",
"serde",
"serde_derive",
"serde_json",
@@ -2458,9 +2550,9 @@ dependencies = [
[[package]]
name = "serde_with_macros"
-version = "3.13.0"
+version = "3.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81679d9ed988d5e9a5e6531dc3f2c28efbd639cbd1dfb628df08edea6004da77"
+checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f"
dependencies = [
"darling",
"proc-macro2",
@@ -2474,7 +2566,7 @@ version = "0.9.34+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"itoa",
"ryu",
"serde",
@@ -2532,9 +2624,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
-version = "2.0.103"
+version = "2.0.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
+checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40"
dependencies = [
"proc-macro2",
"quote",
@@ -2543,15 +2635,21 @@ dependencies = [
[[package]]
name = "synstructure"
-version = "0.13.1"
+version = "0.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
+[[package]]
+name = "temp-dir"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964"
+
[[package]]
name = "text-size"
version = "1.1.1"
@@ -2564,33 +2662,13 @@ version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d"
-[[package]]
-name = "thiserror"
-version = "1.0.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
-dependencies = [
- "thiserror-impl 1.0.69",
-]
-
[[package]]
name = "thiserror"
version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708"
dependencies = [
- "thiserror-impl 2.0.12",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "thiserror-impl",
]
[[package]]
@@ -2616,9 +2694,9 @@ dependencies = [
[[package]]
name = "time"
-version = "0.3.37"
+version = "0.3.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21"
+checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40"
dependencies = [
"deranged",
"itoa",
@@ -2631,15 +2709,15 @@ dependencies = [
[[package]]
name = "time-core"
-version = "0.1.2"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c"
[[package]]
name = "time-macros"
-version = "0.2.19"
+version = "0.2.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de"
+checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49"
dependencies = [
"num-conv",
"time-core",
@@ -2662,11 +2740,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
dependencies = [
"serde",
- "serde_spanned",
- "toml_datetime",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.11",
"toml_edit",
]
+[[package]]
+name = "toml"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8"
+dependencies = [
+ "indexmap 2.10.0",
+ "serde",
+ "serde_spanned 1.0.0",
+ "toml_datetime 0.7.0",
+ "toml_parser",
+ "toml_writer",
+ "winnow",
+]
+
[[package]]
name = "toml_datetime"
version = "0.6.11"
@@ -2676,26 +2769,50 @@ dependencies = [
"serde",
]
+[[package]]
+name = "toml_datetime"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3"
+dependencies = [
+ "serde",
+]
+
[[package]]
name = "toml_edit"
version = "0.22.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
dependencies = [
- "indexmap 2.9.0",
+ "indexmap 2.10.0",
"serde",
- "serde_spanned",
- "toml_datetime",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.11",
"toml_write",
"winnow",
]
+[[package]]
+name = "toml_parser"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10"
+dependencies = [
+ "winnow",
+]
+
[[package]]
name = "toml_write"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
+[[package]]
+name = "toml_writer"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64"
+
[[package]]
name = "tracing"
version = "0.1.41"
@@ -2709,9 +2826,9 @@ dependencies = [
[[package]]
name = "tracing-attributes"
-version = "0.1.28"
+version = "0.1.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
+checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
@@ -2720,9 +2837,9 @@ dependencies = [
[[package]]
name = "tracing-core"
-version = "0.1.33"
+version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
+checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
dependencies = [
"once_cell",
"valuable",
@@ -2866,9 +2983,9 @@ checksum = "a3e5df347f0bf3ec1d670aad6ca5c6a1859cd9ea61d2113125794654ccced68f"
[[package]]
name = "unicode-ident"
-version = "1.0.17"
+version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00e2473a93778eb0bad35909dff6a10d28e63f792f16ed15e404fca9d5eeedbe"
+checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]]
name = "unicode-properties"
@@ -2913,9 +3030,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "valuable"
-version = "0.1.0"
+version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
[[package]]
name = "version_check"
@@ -2935,35 +3052,36 @@ dependencies = [
[[package]]
name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
+version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasi"
-version = "0.13.3+wasi-0.2.2"
+version = "0.14.2+wasi-0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2"
+checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
dependencies = [
"wit-bindgen-rt",
]
[[package]]
name = "wasm-bindgen"
-version = "0.2.99"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396"
+checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
dependencies = [
"cfg-if",
"once_cell",
+ "rustversion",
"wasm-bindgen-macro",
]
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.99"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79"
+checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6"
dependencies = [
"bumpalo",
"log 0.4.27",
@@ -2975,9 +3093,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.99"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe"
+checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -2985,9 +3103,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.99"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2"
+checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2",
"quote",
@@ -2998,9 +3116,12 @@ dependencies = [
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.99"
+version = "0.2.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6"
+checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d"
+dependencies = [
+ "unicode-ident",
+]
[[package]]
name = "winapi"
@@ -3035,18 +3156,62 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-core"
-version = "0.52.0"
+version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
dependencies = [
- "windows-targets 0.52.6",
+ "windows-implement",
+ "windows-interface",
+ "windows-link",
+ "windows-result",
+ "windows-strings",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.60.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.59.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
]
[[package]]
name = "windows-link"
-version = "0.1.1"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
+
+[[package]]
+name = "windows-result"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
+checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57"
+dependencies = [
+ "windows-link",
+]
[[package]]
name = "windows-sys"
@@ -3280,9 +3445,9 @@ dependencies = [
[[package]]
name = "wit-bindgen-rt"
-version = "0.33.0"
+version = "0.39.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c"
+checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
dependencies = [
"bitflags 2.9.1",
]
@@ -3325,39 +3490,18 @@ dependencies = [
[[package]]
name = "zerocopy"
-version = "0.7.35"
+version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0"
+checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
- "byteorder",
- "zerocopy-derive 0.7.35",
-]
-
-[[package]]
-name = "zerocopy"
-version = "0.8.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dde3bb8c68a8f3f1ed4ac9221aad6b10cece3e60a8e2ea54a6a2dec806d0084c"
-dependencies = [
- "zerocopy-derive 0.8.20",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.7.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
+ "zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.8.20"
+version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eea57037071898bf96a6da35fd626f4f27e9cee3ead2a6c703cf09d472b2e700"
+checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",
diff --git a/MODULE.bazel b/MODULE.bazel
index 52c07a395b5e..2f7a18b35fa1 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -14,7 +14,7 @@ local_path_override(
# see https://registry.bazel.build/ for a list of available packages
-bazel_dep(name = "platforms", version = "0.0.11")
+bazel_dep(name = "platforms", version = "1.0.0")
bazel_dep(name = "rules_go", version = "0.56.1")
bazel_dep(name = "rules_pkg", version = "1.0.1")
bazel_dep(name = "rules_nodejs", version = "6.2.0-codeql.1")
@@ -98,49 +98,49 @@ use_repo(
tree_sitter_extractors_deps = use_extension("//misc/bazel/3rdparty:tree_sitter_extractors_extension.bzl", "r")
use_repo(
tree_sitter_extractors_deps,
- "vendor_ts__anyhow-1.0.98",
+ "vendor_ts__anyhow-1.0.99",
"vendor_ts__argfile-0.2.1",
- "vendor_ts__chalk-ir-0.103.0",
+ "vendor_ts__chalk-ir-0.104.0",
"vendor_ts__chrono-0.4.41",
- "vendor_ts__clap-4.5.40",
+ "vendor_ts__clap-4.5.44",
"vendor_ts__dunce-1.0.5",
"vendor_ts__either-1.15.0",
"vendor_ts__encoding-0.2.33",
"vendor_ts__figment-0.10.19",
"vendor_ts__flate2-1.1.0",
- "vendor_ts__glob-0.3.2",
+ "vendor_ts__glob-0.3.3",
"vendor_ts__globset-0.4.15",
"vendor_ts__itertools-0.14.0",
"vendor_ts__lazy_static-1.5.0",
"vendor_ts__mustache-0.9.0",
"vendor_ts__num-traits-0.2.19",
"vendor_ts__num_cpus-1.17.0",
- "vendor_ts__proc-macro2-1.0.95",
+ "vendor_ts__proc-macro2-1.0.97",
"vendor_ts__quote-1.0.40",
- "vendor_ts__ra_ap_base_db-0.0.288",
- "vendor_ts__ra_ap_cfg-0.0.288",
- "vendor_ts__ra_ap_hir-0.0.288",
- "vendor_ts__ra_ap_hir_def-0.0.288",
- "vendor_ts__ra_ap_hir_expand-0.0.288",
- "vendor_ts__ra_ap_hir_ty-0.0.288",
- "vendor_ts__ra_ap_ide_db-0.0.288",
- "vendor_ts__ra_ap_intern-0.0.288",
- "vendor_ts__ra_ap_load-cargo-0.0.288",
- "vendor_ts__ra_ap_parser-0.0.288",
- "vendor_ts__ra_ap_paths-0.0.288",
- "vendor_ts__ra_ap_project_model-0.0.288",
- "vendor_ts__ra_ap_span-0.0.288",
- "vendor_ts__ra_ap_stdx-0.0.288",
- "vendor_ts__ra_ap_syntax-0.0.288",
- "vendor_ts__ra_ap_vfs-0.0.288",
- "vendor_ts__rand-0.9.1",
+ "vendor_ts__ra_ap_base_db-0.0.300",
+ "vendor_ts__ra_ap_cfg-0.0.300",
+ "vendor_ts__ra_ap_hir-0.0.300",
+ "vendor_ts__ra_ap_hir_def-0.0.300",
+ "vendor_ts__ra_ap_hir_expand-0.0.300",
+ "vendor_ts__ra_ap_hir_ty-0.0.300",
+ "vendor_ts__ra_ap_ide_db-0.0.300",
+ "vendor_ts__ra_ap_intern-0.0.300",
+ "vendor_ts__ra_ap_load-cargo-0.0.300",
+ "vendor_ts__ra_ap_parser-0.0.300",
+ "vendor_ts__ra_ap_paths-0.0.300",
+ "vendor_ts__ra_ap_project_model-0.0.300",
+ "vendor_ts__ra_ap_span-0.0.300",
+ "vendor_ts__ra_ap_stdx-0.0.300",
+ "vendor_ts__ra_ap_syntax-0.0.300",
+ "vendor_ts__ra_ap_vfs-0.0.300",
+ "vendor_ts__rand-0.9.2",
"vendor_ts__rayon-1.10.0",
"vendor_ts__regex-1.11.1",
"vendor_ts__serde-1.0.219",
- "vendor_ts__serde_json-1.0.140",
- "vendor_ts__serde_with-3.13.0",
- "vendor_ts__syn-2.0.103",
- "vendor_ts__toml-0.8.23",
+ "vendor_ts__serde_json-1.0.142",
+ "vendor_ts__serde_with-3.14.0",
+ "vendor_ts__syn-2.0.104",
+ "vendor_ts__toml-0.9.5",
"vendor_ts__tracing-0.1.41",
"vendor_ts__tracing-flame-0.2.0",
"vendor_ts__tracing-subscriber-0.3.19",
diff --git a/actions/extractor/codeql-extractor.yml b/actions/extractor/codeql-extractor.yml
index ab7374910054..a1b08602f32b 100644
--- a/actions/extractor/codeql-extractor.yml
+++ b/actions/extractor/codeql-extractor.yml
@@ -6,6 +6,8 @@ column_kind: "utf16"
unicode_newlines: true
build_modes:
- none
+default_queries:
+ - codeql/actions-queries
file_coverage_languages: []
github_api_languages: []
scc_languages: []
diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md
index bd6b24ef4871..5009104e9af3 100644
--- a/actions/ql/lib/CHANGELOG.md
+++ b/actions/ql/lib/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.4.16
+
+No user-facing changes.
+
## 0.4.15
No user-facing changes.
diff --git a/actions/ql/lib/change-notes/released/0.4.16.md b/actions/ql/lib/change-notes/released/0.4.16.md
new file mode 100644
index 000000000000..d2472bd981f4
--- /dev/null
+++ b/actions/ql/lib/change-notes/released/0.4.16.md
@@ -0,0 +1,3 @@
+## 0.4.16
+
+No user-facing changes.
diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml
index 613c98e4872c..0664e01a1ddb 100644
--- a/actions/ql/lib/codeql-pack.release.yml
+++ b/actions/ql/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 0.4.15
+lastReleaseVersion: 0.4.16
diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml
index 6ab370e2e979..5bc126007a27 100644
--- a/actions/ql/lib/qlpack.yml
+++ b/actions/ql/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/actions-all
-version: 0.4.15
+version: 0.4.16
library: true
warnOnImplicitThis: true
dependencies:
diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md
index 769ce155451d..265e67e6a89b 100644
--- a/actions/ql/src/CHANGELOG.md
+++ b/actions/ql/src/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.6.8
+
+No user-facing changes.
+
## 0.6.7
No user-facing changes.
diff --git a/actions/ql/src/change-notes/released/0.6.8.md b/actions/ql/src/change-notes/released/0.6.8.md
new file mode 100644
index 000000000000..9984c422a379
--- /dev/null
+++ b/actions/ql/src/change-notes/released/0.6.8.md
@@ -0,0 +1,3 @@
+## 0.6.8
+
+No user-facing changes.
diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml
index a6d2952e5fb0..cad7cba6ce36 100644
--- a/actions/ql/src/codeql-pack.release.yml
+++ b/actions/ql/src/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 0.6.7
+lastReleaseVersion: 0.6.8
diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml
index 416cd0e5c45a..27bfe21bcc3c 100644
--- a/actions/ql/src/qlpack.yml
+++ b/actions/ql/src/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/actions-queries
-version: 0.6.7
+version: 0.6.8
library: false
warnOnImplicitThis: true
groups: [actions, queries]
diff --git a/cpp/downgrades/c16b29b27f71247023321cc0d0360998b318837c/old.dbscheme b/cpp/downgrades/c16b29b27f71247023321cc0d0360998b318837c/old.dbscheme
new file mode 100644
index 000000000000..c16b29b27f71
--- /dev/null
+++ b/cpp/downgrades/c16b29b27f71247023321cc0d0360998b318837c/old.dbscheme
@@ -0,0 +1,2436 @@
+/*- 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
+ *
+ * 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 -*/
+
+/**
+ * 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
+);
+
+/*- Source location prefix -*/
+
+/**
+ * The source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string ref);
+
+/*- Files and folders -*/
+
+/**
+ * The location of an element.
+ * 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(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref
+);
+
+@container = @file | @folder
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*- Lines of code -*/
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+/*- Diagnostic messages -*/
+
+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
+);
+
+/*- C++ dbscheme -*/
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+pch_uses(
+ int pch: @pch ref,
+ int compilation: @compilation ref,
+ int id: @file ref
+)
+
+#keyset[pch, compilation]
+pch_creations(
+ int pch: @pch,
+ int compilation: @compilation ref,
+ int from: @file ref
+)
+
+/** An element for which line-count information is available. */
+@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable;
+
+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_default 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
+ 0 = @unknown_function
+| 1 = @normal_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+// ... 6 = @builtin_function deprecated // 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
+);
+
+builtin_functions(
+ int id: @function 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
+| 63 = @scalable_vector_count // __SVCount_t
+| 64 = @complex_fp16 // _Complex __fp16
+| 65 = @complex_std_bfloat16 // _Complex __bf16
+| 66 = @complex_std_float16 // _Complex std::float16_t
+;
+
+builtintypes(
+ unique int id: @builtintype,
+ string name: string ref,
+ int kind: int ref,
+ int size: int ref,
+ int sign: int ref,
+ int alignment: int ref
+);
+
+/**
+ * Derived types are types that are directly derived from existing types and
+ * point to, refer to, transform type data to return a new type.
+ */
+case @derivedtype.kind of
+ 1 = @pointer
+| 2 = @reference
+| 3 = @type_with_specifiers
+| 4 = @array
+| 5 = @gnu_vector
+| 6 = @routineptr
+| 7 = @routinereference
+| 8 = @rvalue_reference // C++11
+// ... 9 type_conforming_to_protocols deprecated
+| 10 = @block
+| 11 = @scalable_vector // Arm SVE
+;
+
+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
+);
+
+tupleelements(
+ unique int id: @derivedtype ref,
+ int num_elements: 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_default 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
+);
+
+namespaceattributes(
+ int namespace_id: @namespace 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_default 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_default 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_default 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
+| 40 = @stmt_leave
+;
+
+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 | @stmt_leave;
+
+@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/c16b29b27f71247023321cc0d0360998b318837c/semmlecode.cpp.dbscheme b/cpp/downgrades/c16b29b27f71247023321cc0d0360998b318837c/semmlecode.cpp.dbscheme
new file mode 100644
index 000000000000..5340d6d5f428
--- /dev/null
+++ b/cpp/downgrades/c16b29b27f71247023321cc0d0360998b318837c/semmlecode.cpp.dbscheme
@@ -0,0 +1,2423 @@
+/*- 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
+ *
+ * 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 -*/
+
+/**
+ * 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
+);
+
+/*- Source location prefix -*/
+
+/**
+ * The source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string ref);
+
+/*- Files and folders -*/
+
+/**
+ * The location of an element.
+ * 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(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref
+);
+
+@container = @file | @folder
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*- Lines of code -*/
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+/*- Diagnostic messages -*/
+
+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
+);
+
+/*- C++ dbscheme -*/
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+/** An element for which line-count information is available. */
+@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable;
+
+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_default 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
+ 0 = @unknown_function
+| 1 = @normal_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+// ... 6 = @builtin_function deprecated // 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
+);
+
+builtin_functions(
+ int id: @function 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
+| 63 = @scalable_vector_count // __SVCount_t
+| 64 = @complex_fp16 // _Complex __fp16
+| 65 = @complex_std_bfloat16 // _Complex __bf16
+| 66 = @complex_std_float16 // _Complex std::float16_t
+;
+
+builtintypes(
+ unique int id: @builtintype,
+ string name: string ref,
+ int kind: int ref,
+ int size: int ref,
+ int sign: int ref,
+ int alignment: int ref
+);
+
+/**
+ * Derived types are types that are directly derived from existing types and
+ * point to, refer to, transform type data to return a new type.
+ */
+case @derivedtype.kind of
+ 1 = @pointer
+| 2 = @reference
+| 3 = @type_with_specifiers
+| 4 = @array
+| 5 = @gnu_vector
+| 6 = @routineptr
+| 7 = @routinereference
+| 8 = @rvalue_reference // C++11
+// ... 9 type_conforming_to_protocols deprecated
+| 10 = @block
+| 11 = @scalable_vector // Arm SVE
+;
+
+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
+);
+
+tupleelements(
+ unique int id: @derivedtype ref,
+ int num_elements: 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_default 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
+);
+
+namespaceattributes(
+ int namespace_id: @namespace 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_default 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_default 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_default 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
+| 40 = @stmt_leave
+;
+
+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 | @stmt_leave;
+
+@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/c16b29b27f71247023321cc0d0360998b318837c/upgrade.properties b/cpp/downgrades/c16b29b27f71247023321cc0d0360998b318837c/upgrade.properties
new file mode 100644
index 000000000000..c0351e51e293
--- /dev/null
+++ b/cpp/downgrades/c16b29b27f71247023321cc0d0360998b318837c/upgrade.properties
@@ -0,0 +1,4 @@
+description: Link PCH creations and uses
+compatibility: full
+pch_uses.rel: delete
+pch_creations.rel: delete
diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md
index 7abedf38ee1c..705432b565de 100644
--- a/cpp/ql/lib/CHANGELOG.md
+++ b/cpp/ql/lib/CHANGELOG.md
@@ -1,3 +1,14 @@
+## 5.5.0
+
+### New Features
+
+* Added a new class `PchFile` representing precompiled header (PCH) files used during project compilation.
+
+### Minor Analysis Improvements
+
+* Added flow summaries for the `Microsoft::WRL::ComPtr` member functions.
+* The new dataflow/taint-tracking library (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`) now resolves virtual function calls more precisely. This results in fewer false positives when running dataflow/taint-tracking queries on C++ projects.
+
## 5.4.1
### Minor Analysis Improvements
diff --git a/cpp/ql/lib/Customizations.qll b/cpp/ql/lib/Customizations.qll
new file mode 100644
index 000000000000..c9d899e07e01
--- /dev/null
+++ b/cpp/ql/lib/Customizations.qll
@@ -0,0 +1,11 @@
+/**
+ * Contains customizations to the standard library.
+ *
+ * This module is imported by `cpp.qll`, so any customizations defined here automatically
+ * apply to all queries.
+ *
+ * Typical examples of customizations include adding new subclasses of abstract classes such as
+ * the `RemoteFlowSource` class to model frameworks that are not covered by the standard library.
+ */
+
+import cpp
diff --git a/cpp/ql/lib/change-notes/released/5.5.0.md b/cpp/ql/lib/change-notes/released/5.5.0.md
new file mode 100644
index 000000000000..aad060fdd59e
--- /dev/null
+++ b/cpp/ql/lib/change-notes/released/5.5.0.md
@@ -0,0 +1,10 @@
+## 5.5.0
+
+### New Features
+
+* Added a new class `PchFile` representing precompiled header (PCH) files used during project compilation.
+
+### Minor Analysis Improvements
+
+* Added flow summaries for the `Microsoft::WRL::ComPtr` member functions.
+* The new dataflow/taint-tracking library (`semmle.code.cpp.dataflow.new.DataFlow` and `semmle.code.cpp.dataflow.new.TaintTracking`) now resolves virtual function calls more precisely. This results in fewer false positives when running dataflow/taint-tracking queries on C++ projects.
diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml
index 7adcb16ea286..4b8cf9533c17 100644
--- a/cpp/ql/lib/codeql-pack.release.yml
+++ b/cpp/ql/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 5.4.1
+lastReleaseVersion: 5.5.0
diff --git a/cpp/ql/lib/cpp.qll b/cpp/ql/lib/cpp.qll
index ccd32c368e4b..46c651daf579 100644
--- a/cpp/ql/lib/cpp.qll
+++ b/cpp/ql/lib/cpp.qll
@@ -13,7 +13,9 @@
* https://github.com/cplusplus/draft/raw/master/papers/n4140.pdf
*/
+import Customizations
import semmle.code.cpp.File
+import semmle.code.cpp.PchFile
import semmle.code.cpp.Linkage
import semmle.code.cpp.Location
import semmle.code.cpp.Compilation
diff --git a/cpp/ql/lib/ext/ComPtr.model.yml b/cpp/ql/lib/ext/ComPtr.model.yml
new file mode 100644
index 000000000000..49be2c49a4bf
--- /dev/null
+++ b/cpp/ql/lib/ext/ComPtr.model.yml
@@ -0,0 +1,31 @@
+extensions:
+ - addsTo:
+ pack: codeql/cpp-all
+ extensible: summaryModel
+ data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance
+ - ["Microsoft::WRL", "ComPtr", True, "ComPtr", "(T *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "ComPtr", "(const ComPtr &)", "", "Argument[*0].Element[@]", "Argument[-1].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "ComPtr", "(ComPtr &&)", "", "Argument[*0].Element[@]", "Argument[-1].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "As", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "AsIID", "", "", "Argument[-1]", "Argument[*1]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "AsWeak", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "Attach", "", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "CopyTo", "(T **)", "", "Argument[-1].Element[@]", "Argument[**@0]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "CopyTo", "(T **)", "", "Argument[-1].Element[@]", "Argument[**@0]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "CopyTo", "(REFIID,void **)", "", "Argument[-1].Element[@]", "Argument[**@1]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "Detach", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "Get", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "GetAddressOf", "", "", "Argument[-1].Element[@]", "ReturnValue[**@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "ReleaseAndGetAddressOf", "", "", "Argument[-1].Element[@]", "ReturnValue[**@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "Swap", "", "", "Argument[-1]", "Argument[*0]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "Swap", "", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator&", "", "", "Argument[-1]", "ReturnValue.Element", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator->", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator=", "(T *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator=", "(T *)", "", "Argument[*@0]", "ReturnValue[*].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator=", "(U *)", "", "Argument[*@0]", "Argument[-1].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator=", "(U *)", "", "Argument[*@0]", "ReturnValue[*].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator=", "(const ComPtr &)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator=", "(const ComPtr &)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator=", "(ComPtr &&)", "", "Argument[*0]", "Argument[-1]", "value", "manual"]
+ - ["Microsoft::WRL", "ComPtr", True, "operator=", "(ComPtr &&)", "", "Argument[*0]", "ReturnValue[*]", "value", "manual"]
diff --git a/cpp/ql/lib/ext/ComPtrRef.model.yml b/cpp/ql/lib/ext/ComPtrRef.model.yml
new file mode 100644
index 000000000000..710d9e6def35
--- /dev/null
+++ b/cpp/ql/lib/ext/ComPtrRef.model.yml
@@ -0,0 +1,12 @@
+extensions:
+ - addsTo:
+ pack: codeql/cpp-all
+ extensible: summaryModel
+ data: # namespace, type, subtypes, name, signature, ext, input, output, kind, provenance
+ - ["Microsoft::WRL::Details", "ComPtrRef", True, "ComPtrRef", "", "", "Argument[*0]", "Argument[-1].Element[@]", "value", "manual"]
+ - ["Microsoft::WRL::Details", "ComPtrRef", True, "GetAddressOf", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
+ # TODO: We cannot yet model https://learn.microsoft.com/en-us/cpp/cppcx/wrl/comptrref-class?view=msvc-170#operator-interfacetype-star-star
+ - ["Microsoft::WRL::Details", "ComPtrRef", True, "operator*", "", "", "Argument[-1].Element[@]", "ReturnValue[*@]", "value", "manual"]
+ # TODO: We cannot yet model https://learn.microsoft.com/en-us/cpp/cppcx/wrl/comptrref-class?view=msvc-170#operator-t-star
+ - ["Microsoft::WRL::Details", "ComPtrRef", True, "operator void**", "", "", "Argument[-1].Element[@]", "ReturnValue[**@]", "value", "manual"]
+ - ["Microsoft::WRL::Details", "ComPtrRef", True, "ReleaseAndGetAddressOf", "", "", "Argument[-1].Element[@]", "ReturnValue[**@]", "value", "manual"]
\ No newline at end of file
diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml
index c2892f44fcc2..dacf9f622134 100644
--- a/cpp/ql/lib/qlpack.yml
+++ b/cpp/ql/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/cpp-all
-version: 5.4.1
+version: 5.5.0
groups: cpp
dbscheme: semmlecode.cpp.dbscheme
extractor: cpp
diff --git a/cpp/ql/lib/semmle/code/cpp/PchFile.qll b/cpp/ql/lib/semmle/code/cpp/PchFile.qll
new file mode 100644
index 000000000000..6522edf6593c
--- /dev/null
+++ b/cpp/ql/lib/semmle/code/cpp/PchFile.qll
@@ -0,0 +1,26 @@
+/**
+ * Provides the `PchFile` class representing precompiled header (PCH) files created and
+ * used during the build process.
+ */
+
+import semmle.code.cpp.File
+
+/**
+ * A precompiled header (PCH) file created during the build process.
+ */
+class PchFile extends @pch {
+ /**
+ * Gets a textual representation of this element.
+ */
+ string toString() { result = "PCH for " + this.getHeaderFile() }
+
+ /**
+ * Gets the header file from which the PCH file was created.
+ */
+ File getHeaderFile() { pch_creations(this, _, result) }
+
+ /**
+ * Gets a source file that includes the PCH.
+ */
+ File getAUse() { pch_uses(this, _, result) }
+}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll
index b5e899bf0aac..0d63558c956e 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowDispatch.qll
@@ -1,8 +1,44 @@
private import cpp
private import semmle.code.cpp.ir.IR
-private import DataFlowPrivate
+private import semmle.code.cpp.ir.dataflow.DataFlow
+private import DataFlowPrivate as DataFlowPrivate
private import DataFlowUtil
private import DataFlowImplCommon as DataFlowImplCommon
+private import codeql.typetracking.TypeTracking
+private import SsaImpl as SsaImpl
+
+/**
+ * Holds if `f` has name `qualifiedName` and `nparams` parameter count. This is
+ * an approximation of its signature for the purpose of matching functions that
+ * might be the same across link targets.
+ */
+private predicate functionSignature(Function f, string qualifiedName, int nparams) {
+ qualifiedName = f.getQualifiedName() and
+ nparams = f.getNumberOfParameters() and
+ not f.isStatic()
+}
+
+/**
+ * Holds if `f` is a function with a body that has name `qualifiedName` and
+ * `nparams` parameter count. See `functionSignature`.
+ */
+private predicate functionSignatureWithBody(string qualifiedName, int nparams, Function f) {
+ functionSignature(f, qualifiedName, nparams) and
+ exists(f.getBlock())
+}
+
+/**
+ * Holds if the target of `call` is a function _with no definition_ that has
+ * name `qualifiedName` and `nparams` parameter count. See `functionSignature`.
+ */
+pragma[noinline]
+private predicate callSignatureWithoutBody(string qualifiedName, int nparams, CallInstruction call) {
+ exists(Function target |
+ target = call.getStaticCallTarget() and
+ not exists(target.getBlock()) and
+ functionSignature(target, qualifiedName, nparams)
+ )
+}
/**
* Gets a function that might be called by `call`.
@@ -11,7 +47,15 @@ private import DataFlowImplCommon as DataFlowImplCommon
* from `AdditionalCallTarget` into account.
*/
cached
-DataFlowCallable defaultViableCallable(DataFlowCall call) {
+DataFlowPrivate::DataFlowCallable defaultViableCallable(DataFlowPrivate::DataFlowCall call) {
+ result = defaultViableCallableWithoutLambda(call)
+ or
+ result = DataFlowImplCommon::viableCallableLambda(call, _)
+}
+
+private DataFlowPrivate::DataFlowCallable defaultViableCallableWithoutLambda(
+ DataFlowPrivate::DataFlowCall call
+) {
DataFlowImplCommon::forceCachingInSameStage() and
result = call.getStaticCallTarget()
or
@@ -26,17 +70,13 @@ DataFlowCallable defaultViableCallable(DataFlowCall call) {
functionSignatureWithBody(qualifiedName, nparams, result.getUnderlyingCallable()) and
strictcount(Function other | functionSignatureWithBody(qualifiedName, nparams, other)) = 1
)
- or
- // Virtual dispatch
- result.asSourceCallable() = call.(VirtualDispatch::DataSensitiveCall).resolve()
}
/**
* Gets a function that might be called by `call`.
*/
-cached
-DataFlowCallable viableCallable(DataFlowCall call) {
- result = defaultViableCallable(call)
+private DataFlowPrivate::DataFlowCallable nonVirtualDispatch(DataFlowPrivate::DataFlowCall call) {
+ result = defaultViableCallableWithoutLambda(call)
or
// Additional call targets
result.getUnderlyingCallable() =
@@ -44,228 +84,276 @@ DataFlowCallable viableCallable(DataFlowCall call) {
.viableTarget(call.asCallInstruction().getUnconvertedResultExpression())
}
+private class RelevantNode extends Node {
+ RelevantNode() { this.getType().stripType() instanceof Class }
+}
+
+private signature DataFlowPrivate::DataFlowCallable methodDispatchSig(
+ DataFlowPrivate::DataFlowCall c
+);
+
+private predicate ignoreConstructor(Expr e) {
+ e instanceof ConstructorDirectInit or
+ e instanceof ConstructorVirtualInit or
+ e instanceof ConstructorDelegationInit or
+ exists(ConstructorFieldInit init | init.getExpr() = e)
+}
+
/**
- * Provides virtual dispatch support compatible with the original
- * implementation of `semmle.code.cpp.security.TaintTracking`.
+ * Holds if `n` is either:
+ * - the post-update node of a qualifier after a call to a constructor which
+ * constructs an object containing at least one virtual function.
+ * - a node which represents a derived-to-base instruction that converts from `c`.
*/
-private module VirtualDispatch {
- /** A call that may dispatch differently depending on the qualifier value. */
- abstract class DataSensitiveCall extends DataFlowCall {
- /**
- * Gets the node whose value determines the target of this call. This node
- * could be the qualifier of a virtual dispatch or the function-pointer
- * expression in a call to a function pointer. What they have in common is
- * that we need to find out which data flows there, and then it's up to the
- * `resolve` predicate to stitch that information together and resolve the
- * call.
- */
- abstract Node getDispatchValue();
-
- /** Gets a candidate target for this call. */
- abstract Function resolve();
-
- /**
- * Whether `src` can flow to this call.
- *
- * Searches backwards from `getDispatchValue()` to `src`. The `allowFromArg`
- * parameter is true when the search is allowed to continue backwards into
- * a parameter; non-recursive callers should pass `_` for `allowFromArg`.
- */
- predicate flowsFrom(Node src, boolean allowFromArg) {
- src = this.getDispatchValue() and allowFromArg = true
- or
- exists(Node other, boolean allowOtherFromArg | this.flowsFrom(other, allowOtherFromArg) |
- // Call argument
- exists(DataFlowCall call, Position i |
- other.(ParameterNode).isParameterOf(pragma[only_bind_into](call).getStaticCallTarget(), i) and
- src.(ArgumentNode).argumentOf(call, pragma[only_bind_into](pragma[only_bind_out](i)))
- ) and
- allowOtherFromArg = true and
- allowFromArg = true
+private predicate qualifierSourceImpl(RelevantNode n, Class c) {
+ // Object construction
+ exists(CallInstruction call, ThisArgumentOperand qualifier, Call e |
+ qualifier = call.getThisArgumentOperand() and
+ n.(PostUpdateNode).getPreUpdateNode().asOperand() = qualifier and
+ call.getStaticCallTarget() instanceof Constructor and
+ qualifier.getType().stripType() = c and
+ c.getABaseClass*().getAMemberFunction().isVirtual() and
+ e = call.getUnconvertedResultExpression() and
+ not ignoreConstructor(e)
+ |
+ exists(c.getABaseClass())
+ or
+ exists(c.getADerivedClass())
+ )
+ or
+ // Conversion to a base class
+ exists(ConvertToBaseInstruction convert |
+ // Only keep the most specific cast
+ not convert.getUnary() instanceof ConvertToBaseInstruction and
+ n.asInstruction() = convert and
+ convert.getDerivedClass() = c and
+ c.getABaseClass*().getAMemberFunction().isVirtual()
+ )
+}
+
+private module TrackVirtualDispatch {
+ /**
+ * Gets a possible runtime target of `c` using both static call-target
+ * information, and call-target resolution from `virtualDispatch0`.
+ */
+ private DataFlowPrivate::DataFlowCallable dispatch(DataFlowPrivate::DataFlowCall c) {
+ result = nonVirtualDispatch(c) or
+ result = virtualDispatch0(c)
+ }
+
+ private module TtInput implements TypeTrackingInput {
+ final class Node = RelevantNode;
+
+ class LocalSourceNode extends Node {
+ LocalSourceNode() {
+ this instanceof ParameterNode
or
- // Call return
- exists(DataFlowCall call, ReturnKind returnKind |
- other = getAnOutNode(call, returnKind) and
- returnNodeWithKindAndEnclosingCallable(src, returnKind, call.getStaticCallTarget())
- ) and
- allowFromArg = false
+ this instanceof DataFlowPrivate::OutNode
or
- // Local flow
- localFlowStep(src, other) and
- allowFromArg = allowOtherFromArg
+ DataFlowPrivate::readStep(_, _, this)
or
- // Flow from global variable to load.
- exists(LoadInstruction load, GlobalOrNamespaceVariable var |
- var = src.asVariable() and
- other.asInstruction() = load and
- addressOfGlobal(load.getSourceAddress(), var) and
- // The `allowFromArg` concept doesn't play a role when `src` is a
- // global variable, so we just set it to a single arbitrary value for
- // performance.
- allowFromArg = true
- )
+ DataFlowPrivate::storeStep(_, _, this)
+ or
+ DataFlowPrivate::jumpStep(_, this)
or
- // Flow from store to global variable.
- exists(StoreInstruction store, GlobalOrNamespaceVariable var |
- var = other.asVariable() and
- store = src.asInstruction() and
- storeIntoGlobal(store, var) and
- // Setting `allowFromArg` to `true` like in the base case means we
- // treat a store to a global variable like the dispatch itself: flow
- // may come from anywhere.
- allowFromArg = true
+ qualifierSourceImpl(this, _)
+ }
+ }
+
+ final private class ContentSetFinal = ContentSet;
+
+ class Content extends ContentSetFinal {
+ Content() {
+ exists(DataFlow::Content c |
+ this.isSingleton(c) and
+ c.getIndirectionIndex() = 1
)
+ }
+ }
+
+ class ContentFilter extends Content {
+ Content getAMatchingContent() { result = this }
+ }
+
+ predicate compatibleContents(Content storeContents, Content loadContents) {
+ storeContents = loadContents
+ }
+
+ predicate simpleLocalSmallStep(Node nodeFrom, Node nodeTo) {
+ nodeFrom.getFunction() instanceof Function and
+ simpleLocalFlowStep(nodeFrom, nodeTo, _)
+ }
+
+ predicate levelStepNoCall(Node n1, LocalSourceNode n2) { none() }
+
+ predicate levelStepCall(Node n1, LocalSourceNode n2) { none() }
+
+ predicate storeStep(Node n1, Node n2, Content f) { DataFlowPrivate::storeStep(n1, f, n2) }
+
+ predicate callStep(Node n1, LocalSourceNode n2) {
+ exists(DataFlowPrivate::DataFlowCall call, DataFlowPrivate::Position pos |
+ n1.(DataFlowPrivate::ArgumentNode).argumentOf(call, pos) and
+ n2.(ParameterNode).isParameterOf(dispatch(call), pos)
+ )
+ }
+
+ predicate returnStep(Node n1, LocalSourceNode n2) {
+ exists(DataFlowPrivate::DataFlowCallable callable, DataFlowPrivate::DataFlowCall call |
+ n1.(DataFlowPrivate::ReturnNode).getEnclosingCallable() = callable and
+ callable = dispatch(call) and
+ n2 = DataFlowPrivate::getAnOutNode(call, n1.(DataFlowPrivate::ReturnNode).getKind())
)
}
+
+ predicate loadStep(Node n1, LocalSourceNode n2, Content f) {
+ DataFlowPrivate::readStep(n1, f, n2)
+ }
+
+ predicate loadStoreStep(Node nodeFrom, Node nodeTo, Content f1, Content f2) { none() }
+
+ predicate withContentStep(Node nodeFrom, LocalSourceNode nodeTo, ContentFilter f) { none() }
+
+ predicate withoutContentStep(Node nodeFrom, LocalSourceNode nodeTo, ContentFilter f) { none() }
+
+ predicate jumpStep(Node n1, LocalSourceNode n2) { DataFlowPrivate::jumpStep(n1, n2) }
+
+ predicate hasFeatureBacktrackStoreTarget() { none() }
}
- pragma[noinline]
- private predicate storeIntoGlobal(StoreInstruction store, GlobalOrNamespaceVariable var) {
- addressOfGlobal(store.getDestinationAddress(), var)
+ private predicate qualifierSource(RelevantNode n) { qualifierSourceImpl(n, _) }
+
+ /**
+ * Holds if `n` is the qualifier of `call` which targets the virtual member
+ * function `mf`.
+ */
+ private predicate qualifierOfVirtualCallImpl(
+ RelevantNode n, CallInstruction call, MemberFunction mf
+ ) {
+ n.asOperand() = call.getThisArgumentOperand() and
+ call.getStaticCallTarget() = mf and
+ mf.isVirtual()
}
- /** Holds if `addressInstr` is an instruction that produces the address of `var`. */
- private predicate addressOfGlobal(Instruction addressInstr, GlobalOrNamespaceVariable var) {
- // Access directly to the global variable
- addressInstr.(VariableAddressInstruction).getAstVariable() = var
- or
- // Access to a field on a global union
- exists(FieldAddressInstruction fa |
- fa = addressInstr and
- fa.getObjectAddress().(VariableAddressInstruction).getAstVariable() = var and
- fa.getField().getDeclaringType() instanceof Union
+ private predicate qualifierOfVirtualCall(RelevantNode n) { qualifierOfVirtualCallImpl(n, _, _) }
+
+ private import TypeTracking::TypeTrack::Graph
+
+ private predicate edgePlus(PathNode n1, PathNode n2) = fastTC(edges/2)(n1, n2)
+
+ /**
+ * Gets the most specific implementation of `mf` that may be called when the
+ * qualifier has runtime type `c`.
+ */
+ private MemberFunction mostSpecific(MemberFunction mf, Class c) {
+ qualifierOfVirtualCallImpl(_, _, mf) and
+ mf.getAnOverridingFunction*() = result and
+ (
+ result.getDeclaringType() = c
+ or
+ not c.getAMemberFunction().getAnOverriddenFunction*() = mf and
+ result = mostSpecific(mf, c.getABaseClass())
)
}
/**
- * A ReturnNode with its ReturnKind and its enclosing callable.
- *
- * Used to fix a join ordering issue in flowsFrom.
+ * Gets a possible pair of end-points `(p1, p2)` where:
+ * - `p1` is a derived-to-base conversion that converts from some
+ * class `derived`, and
+ * - `p2` is the qualifier of a call to a virtual function that may
+ * target `callable`, and
+ * - `callable` is the most specific implementation that may be called when
+ * the qualifier has type `derived`.
*/
- pragma[noinline]
- private predicate returnNodeWithKindAndEnclosingCallable(
- ReturnNode node, ReturnKind kind, DataFlowCallable callable
+ private predicate pairCand(
+ PathNode p1, PathNode p2, DataFlowPrivate::DataFlowCallable callable,
+ DataFlowPrivate::DataFlowCall call
) {
- node.getKind() = kind and
- node.getFunction() = callable.getUnderlyingCallable()
+ exists(Class derived, MemberFunction mf |
+ qualifierSourceImpl(p1.getNode(), derived) and
+ qualifierOfVirtualCallImpl(p2.getNode(), call.asCallInstruction(), mf) and
+ p1.isSource() and
+ p2.isSink() and
+ callable.asSourceCallable() = mostSpecific(mf, derived)
+ )
}
- /** Call through a function pointer. */
- private class DataSensitiveExprCall extends DataSensitiveCall {
- DataSensitiveExprCall() { not exists(this.getStaticCallTarget()) }
-
- override Node getDispatchValue() { result.asOperand() = this.getCallTargetOperand() }
-
- override Function resolve() {
- exists(FunctionInstruction fi |
- this.flowsFrom(instructionNode(fi), _) and
- result = fi.getFunctionSymbol()
- ) and
- (
- this.getNumberOfArguments() <= result.getEffectiveNumberOfParameters() and
- this.getNumberOfArguments() >= result.getEffectiveNumberOfParameters()
- or
- result.isVarargs()
- )
- }
+ /** Gets a possible run-time target of `call`. */
+ DataFlowPrivate::DataFlowCallable virtualDispatch(DataFlowPrivate::DataFlowCall call) {
+ exists(PathNode p1, PathNode p2 | p1 = p2 or edgePlus(p1, p2) | pairCand(p1, p2, result, call))
}
+}
- /** Call to a virtual function. */
- private class DataSensitiveOverriddenFunctionCall extends DataSensitiveCall {
- DataSensitiveOverriddenFunctionCall() {
- exists(
- this.getStaticCallTarget()
- .getUnderlyingCallable()
- .(VirtualFunction)
- .getAnOverridingFunction()
- )
- }
+private DataFlowPrivate::DataFlowCallable noDisp(DataFlowPrivate::DataFlowCall call) { none() }
- override Node getDispatchValue() { result.asInstruction() = this.getArgument(-1) }
+pragma[nomagic]
+private DataFlowPrivate::DataFlowCallable d1(DataFlowPrivate::DataFlowCall call) {
+ result = TrackVirtualDispatch::virtualDispatch(call)
+}
- override MemberFunction resolve() {
- exists(Class overridingClass |
- this.overrideMayAffectCall(overridingClass, result) and
- this.hasFlowFromCastFrom(overridingClass)
- )
- }
+pragma[nomagic]
+private DataFlowPrivate::DataFlowCallable d2(DataFlowPrivate::DataFlowCall call) {
+ result = TrackVirtualDispatch::virtualDispatch(call)
+}
- /**
- * Holds if `this` is a virtual function call whose static target is
- * overridden by `overridingFunction` in `overridingClass`.
- */
- pragma[noinline]
- private predicate overrideMayAffectCall(Class overridingClass, MemberFunction overridingFunction) {
- overridingFunction.getAnOverriddenFunction+() =
- this.getStaticCallTarget().getUnderlyingCallable().(VirtualFunction) and
- overridingFunction.getDeclaringType() = overridingClass
- }
+pragma[nomagic]
+private DataFlowPrivate::DataFlowCallable d3(DataFlowPrivate::DataFlowCall call) {
+ result = TrackVirtualDispatch::virtualDispatch(call)
+}
- /**
- * Holds if the qualifier of `this` has flow from an upcast from
- * `derivedClass`.
- */
- pragma[noinline]
- private predicate hasFlowFromCastFrom(Class derivedClass) {
- exists(ConvertToBaseInstruction toBase |
- this.flowsFrom(instructionNode(toBase), _) and
- derivedClass = toBase.getDerivedClass()
- )
- }
- }
+pragma[nomagic]
+private DataFlowPrivate::DataFlowCallable d4(DataFlowPrivate::DataFlowCall call) {
+ result = TrackVirtualDispatch::virtualDispatch(call)
}
-/**
- * Holds if `f` is a function with a body that has name `qualifiedName` and
- * `nparams` parameter count. See `functionSignature`.
- */
-private predicate functionSignatureWithBody(string qualifiedName, int nparams, Function f) {
- functionSignature(f, qualifiedName, nparams) and
- exists(f.getBlock())
+pragma[nomagic]
+private DataFlowPrivate::DataFlowCallable d5(DataFlowPrivate::DataFlowCall call) {
+ result = TrackVirtualDispatch::virtualDispatch(call)
}
-/**
- * Holds if the target of `call` is a function _with no definition_ that has
- * name `qualifiedName` and `nparams` parameter count. See `functionSignature`.
- */
-pragma[noinline]
-private predicate callSignatureWithoutBody(string qualifiedName, int nparams, CallInstruction call) {
- exists(Function target |
- target = call.getStaticCallTarget() and
- not exists(target.getBlock()) and
- functionSignature(target, qualifiedName, nparams)
- )
+pragma[nomagic]
+private DataFlowPrivate::DataFlowCallable d6(DataFlowPrivate::DataFlowCall call) {
+ result = TrackVirtualDispatch::virtualDispatch(call)
}
-/**
- * Holds if `f` has name `qualifiedName` and `nparams` parameter count. This is
- * an approximation of its signature for the purpose of matching functions that
- * might be the same across link targets.
- */
-private predicate functionSignature(Function f, string qualifiedName, int nparams) {
- qualifiedName = f.getQualifiedName() and
- nparams = f.getNumberOfParameters() and
- not f.isStatic()
+/** Gets a function that might be called by `call`. */
+cached
+DataFlowPrivate::DataFlowCallable viableCallable(DataFlowPrivate::DataFlowCall call) {
+ not exists(d6(call)) and
+ result = nonVirtualDispatch(call)
+ or
+ result = d6(call)
}
/**
* Holds if the set of viable implementations that can be called by `call`
* might be improved by knowing the call context.
*/
-predicate mayBenefitFromCallContext(DataFlowCall call) { mayBenefitFromCallContext(call, _, _) }
+predicate mayBenefitFromCallContext(DataFlowPrivate::DataFlowCall call) {
+ mayBenefitFromCallContext(call, _, _)
+}
+
+private predicate localLambdaFlowStep(Node nodeFrom, Node nodeTo) {
+ localFlowStep(nodeFrom, nodeTo)
+ or
+ DataFlowPrivate::additionalLambdaFlowStep(nodeFrom, nodeTo, _)
+}
/**
* Holds if `call` is a call through a function pointer, and the pointer
* value is given as the `arg`'th argument to `f`.
*/
private predicate mayBenefitFromCallContext(
- VirtualDispatch::DataSensitiveCall call, DataFlowCallable f, int arg
+ DataFlowPrivate::DataFlowCall call, DataFlowPrivate::DataFlowCallable f, int arg
) {
f = pragma[only_bind_out](call).getEnclosingCallable() and
exists(InitializeParameterInstruction init |
- not exists(call.getStaticCallTarget()) and
+ not exists(call.getStaticCallTarget())
+ or
+ exists(call.getStaticCallSourceTarget().(VirtualFunction).getAnOverridingFunction())
+ |
init.getEnclosingFunction() = f.getUnderlyingCallable() and
- call.flowsFrom(instructionNode(init), _) and
+ localLambdaFlowStep+(instructionNode(init),
+ operandNode(call.asCallInstruction().getCallTargetOperand())) and
init.getParameter().getIndex() = arg
)
}
@@ -274,9 +362,11 @@ private predicate mayBenefitFromCallContext(
* Gets a viable dispatch target of `call` in the context `ctx`. This is
* restricted to those `call`s for which a context might make a difference.
*/
-DataFlowCallable viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) {
+DataFlowPrivate::DataFlowCallable viableImplInCallContext(
+ DataFlowPrivate::DataFlowCall call, DataFlowPrivate::DataFlowCall ctx
+) {
result = viableCallable(call) and
- exists(int i, DataFlowCallable f |
+ exists(int i, DataFlowPrivate::DataFlowCallable f |
mayBenefitFromCallContext(pragma[only_bind_into](call), f, i) and
f = ctx.getStaticCallTarget() and
result.asSourceCallable() =
@@ -286,4 +376,8 @@ DataFlowCallable viableImplInCallContext(DataFlowCall call, DataFlowCall ctx) {
/** Holds if arguments at position `apos` match parameters at position `ppos`. */
pragma[inline]
-predicate parameterMatch(ParameterPosition ppos, ArgumentPosition apos) { ppos = apos }
+predicate parameterMatch(
+ DataFlowPrivate::ParameterPosition ppos, DataFlowPrivate::ArgumentPosition apos
+) {
+ ppos = apos
+}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll
index a03042a77ff0..582391e81cc9 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll
@@ -1492,7 +1492,14 @@ predicate lambdaCall(DataFlowCall call, LambdaCallKind kind, Node receiver) {
}
/** Extra data-flow steps needed for lambda flow analysis. */
-predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) { none() }
+predicate additionalLambdaFlowStep(Node nodeFrom, Node nodeTo, boolean preservesValue) {
+ preservesValue = false and
+ exists(ContentSet cs | cs.isSingleton(any(UnionContent uc)) |
+ storeStep(nodeFrom, cs, nodeTo)
+ or
+ readStep(nodeFrom, cs, nodeTo)
+ )
+}
predicate knownSourceModel(Node source, string model) { External::sourceNode(source, _, model) }
@@ -1873,9 +1880,7 @@ module IteratorFlow {
}
}
- private module SsaInput implements SsaImpl::InputSig {
- import Ssa::InputSigCommon
-
+ private module SsaInput implements SsaImpl::InputSig {
class SourceVariable = IteratorFlow::SourceVariable;
/** A call to function that dereferences an iterator. */
@@ -1953,7 +1958,7 @@ module IteratorFlow {
* Holds if `(bb, i)` contains a write to an iterator that may have been obtained
* by calling `begin` (or related functions) on the variable `v`.
*/
- predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {
+ predicate variableWrite(IRCfg::BasicBlock bb, int i, SourceVariable v, boolean certain) {
certain = false and
exists(GetsIteratorCall beginCall, Instruction writeToDeref, IRBlock bbQual, int iQual |
isIteratorStoreInstruction(beginCall, writeToDeref) and
@@ -1964,12 +1969,12 @@ module IteratorFlow {
}
/** Holds if `(bb, i)` reads the container variable `v`. */
- predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
+ predicate variableRead(IRCfg::BasicBlock bb, int i, SourceVariable v, boolean certain) {
Ssa::variableRead(bb, i, v, certain)
}
}
- private module IteratorSsa = SsaImpl::Make;
+ private module IteratorSsa = SsaImpl::Make;
private module DataFlowIntegrationInput implements IteratorSsa::DataFlowIntegrationInputSig {
private import codeql.util.Void
@@ -1982,7 +1987,7 @@ module IteratorFlow {
)
}
- predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { bb.getInstruction(i) = this }
+ predicate hasCfgNode(IRCfg::BasicBlock bb, int i) { bb.getInstruction(i) = this }
}
predicate ssaDefHasSource(IteratorSsa::WriteDefinition def) { none() }
@@ -1992,20 +1997,16 @@ module IteratorFlow {
class GuardValue = Void;
class Guard extends Void {
- predicate hasValueBranchEdge(
- SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue val
- ) {
+ predicate hasValueBranchEdge(IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue val) {
none()
}
- predicate valueControlsBranchEdge(
- SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue val
- ) {
+ predicate valueControlsBranchEdge(IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue val) {
none()
}
}
- predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, GuardValue val) {
+ predicate guardDirectlyControlsBlock(Guard guard, IRCfg::BasicBlock bb, GuardValue val) {
none()
}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
index a0a99711552c..ef4051171afb 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll
@@ -795,7 +795,7 @@ class FinalGlobalValue extends Node, TFinalGlobalValue {
override DataFlowType getType() {
exists(int indirectionIndex |
indirectionIndex = globalUse.getIndirectionIndex() and
- result = getTypeImpl(globalUse.getUnderlyingType(), indirectionIndex - 1)
+ result = getTypeImpl(globalUse.getUnderlyingType(), indirectionIndex)
)
}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll
index b9f320e57b23..d48a48dfb445 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll
@@ -756,9 +756,9 @@ private predicate modeledFlowBarrier(Node n) {
partialFlowFunc = call.getStaticCallTarget() and
not partialFlowFunc.isPartialWrite(output)
|
- call.getStaticCallTarget().(DataFlow::DataFlowFunction).hasDataFlow(_, output)
+ partialFlowFunc.(DataFlow::DataFlowFunction).hasDataFlow(_, output)
or
- call.getStaticCallTarget().(Taint::TaintFunction).hasTaintFlow(_, output)
+ partialFlowFunc.(Taint::TaintFunction).hasTaintFlow(_, output)
)
or
exists(Operand operand, Instruction instr, Node n0, int indirectionIndex |
@@ -891,15 +891,14 @@ private predicate baseSourceVariableIsGlobal(
)
}
-private module SsaInput implements Ssa::InputSig {
- import InputSigCommon
+private module SsaInput implements Ssa::InputSig {
import SourceVariables
/**
* Holds if the `i`'th write in block `bb` writes to the variable `v`.
* `certain` is `true` if the write is guaranteed to overwrite the entire variable.
*/
- predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {
+ predicate variableWrite(IRCfg::BasicBlock bb, int i, SourceVariable v, boolean certain) {
DataFlowImplCommon::forceCachingInSameStage() and
(
exists(DefImpl def | def.hasIndexInBlock(v, bb, i) |
@@ -917,7 +916,7 @@ private module SsaInput implements Ssa::InputSig {
* Holds if the `i`'th read in block `bb` reads to the variable `v`.
* `certain` is `true` if the read is guaranteed. For C++, this is always the case.
*/
- predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
+ predicate variableRead(IRCfg::BasicBlock bb, int i, SourceVariable v, boolean certain) {
exists(UseImpl use | use.hasIndexInBlock(bb, i, v) |
if use.isCertain() then certain = true else certain = false
)
@@ -965,7 +964,7 @@ class GlobalDef extends Definition {
GlobalLikeVariable getVariable() { result = impl.getVariable() }
}
-private module SsaImpl = Ssa::Make;
+private module SsaImpl = Ssa::Make;
private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationInputSig {
private import codeql.util.Boolean
@@ -978,7 +977,7 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
)
}
- predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { bb.getInstruction(i) = this }
+ predicate hasCfgNode(IRCfg::BasicBlock bb, int i) { bb.getInstruction(i) = this }
}
Expr getARead(SsaImpl::Definition def) {
@@ -1006,9 +1005,7 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
class Guard instanceof IRGuards::IRGuardCondition {
string toString() { result = super.toString() }
- predicate hasValueBranchEdge(
- SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue branch
- ) {
+ predicate hasValueBranchEdge(IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue branch) {
exists(EdgeKind kind |
super.getBlock() = bb1 and
kind = getConditionalEdge(branch) and
@@ -1017,13 +1014,13 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
}
predicate valueControlsBranchEdge(
- SsaInput::BasicBlock bb1, SsaInput::BasicBlock bb2, GuardValue branch
+ IRCfg::BasicBlock bb1, IRCfg::BasicBlock bb2, GuardValue branch
) {
this.hasValueBranchEdge(bb1, bb2, branch)
}
}
- predicate guardDirectlyControlsBlock(Guard guard, SsaInput::BasicBlock bb, GuardValue branch) {
+ predicate guardDirectlyControlsBlock(Guard guard, IRCfg::BasicBlock bb, GuardValue branch) {
guard.(IRGuards::IRGuardCondition).controls(bb, branch)
}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll
index 617e2be8cc38..552f504b84b0 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImplCommon.qll
@@ -768,21 +768,3 @@ private module Cached {
}
import Cached
-
-/**
- * Inputs to the shared SSA library's parameterized module that is shared
- * between the SSA pruning stage, and the final SSA stage.
- */
-module InputSigCommon {
- class BasicBlock extends IRBlock {
- ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
-
- int length() { result = this.getInstructionCount() }
- }
-
- class ControlFlowNode = Instruction;
-
- BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result.immediatelyDominates(bb) }
-
- BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
-}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll
index 50395db47e77..89efaa8e15af 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll
@@ -7,6 +7,7 @@ import Instruction
private import internal.IRBlockImports as Imports
import Imports::EdgeKind
private import Cached
+private import codeql.controlflow.BasicBlock as BB
/**
* Holds if `block` is a block in `func` and `sortOverride`, `sortKey1`, and `sortKey2` are the
@@ -263,6 +264,49 @@ private predicate isEntryBlock(TIRBlock block) {
block = MkIRBlock(any(EnterFunctionInstruction enter))
}
+module IRCfg implements BB::CfgSig {
+ class ControlFlowNode = Instruction;
+
+ class SuccessorType = EdgeKind;
+
+ final private class FinalIRBlock = IRBlock;
+
+ class BasicBlock extends FinalIRBlock {
+ ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
+
+ ControlFlowNode getLastNode() { result = super.getLastInstruction() }
+
+ int length() { result = this.getInstructionCount() }
+
+ BasicBlock getASuccessor() { result = super.getASuccessor() }
+
+ BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
+
+ predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
+
+ predicate dominates(BasicBlock bb) { super.dominates(bb) }
+
+ BasicBlock getImmediateDominator() { result.immediatelyDominates(this) }
+
+ predicate inDominanceFrontier(BasicBlock df) { super.dominanceFrontier() = df }
+
+ predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
+
+ predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
+ }
+
+ class EntryBasicBlock extends BasicBlock {
+ EntryBasicBlock() { isEntryBlock(this) }
+ }
+
+ pragma[nomagic]
+ predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
+ bb1.getASuccessor() = bb2 and
+ bb1 = bb2.getImmediateDominator() and
+ forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
+ }
+}
+
cached
private module Cached {
cached
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll
index 50395db47e77..89efaa8e15af 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll
@@ -7,6 +7,7 @@ import Instruction
private import internal.IRBlockImports as Imports
import Imports::EdgeKind
private import Cached
+private import codeql.controlflow.BasicBlock as BB
/**
* Holds if `block` is a block in `func` and `sortOverride`, `sortKey1`, and `sortKey2` are the
@@ -263,6 +264,49 @@ private predicate isEntryBlock(TIRBlock block) {
block = MkIRBlock(any(EnterFunctionInstruction enter))
}
+module IRCfg implements BB::CfgSig {
+ class ControlFlowNode = Instruction;
+
+ class SuccessorType = EdgeKind;
+
+ final private class FinalIRBlock = IRBlock;
+
+ class BasicBlock extends FinalIRBlock {
+ ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
+
+ ControlFlowNode getLastNode() { result = super.getLastInstruction() }
+
+ int length() { result = this.getInstructionCount() }
+
+ BasicBlock getASuccessor() { result = super.getASuccessor() }
+
+ BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
+
+ predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
+
+ predicate dominates(BasicBlock bb) { super.dominates(bb) }
+
+ BasicBlock getImmediateDominator() { result.immediatelyDominates(this) }
+
+ predicate inDominanceFrontier(BasicBlock df) { super.dominanceFrontier() = df }
+
+ predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
+
+ predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
+ }
+
+ class EntryBasicBlock extends BasicBlock {
+ EntryBasicBlock() { isEntryBlock(this) }
+ }
+
+ pragma[nomagic]
+ predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
+ bb1.getASuccessor() = bb2 and
+ bb1 = bb2.getImmediateDominator() and
+ forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
+ }
+}
+
cached
private module Cached {
cached
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
index f7786fcf290a..f749f8b7502c 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll
@@ -3884,7 +3884,7 @@ class TranslatedNewExpr extends TranslatedNewOrNewArrayExpr {
final override Type getTargetType() { result = expr.getAllocatedType().getUnspecifiedType() }
final override TranslatedInitialization getInitialization() {
- result = getTranslatedInitialization(expr.getInitializer())
+ result = getTranslatedInitialization(expr.getInitializer().getFullyConverted())
}
}
diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll
index 50395db47e77..89efaa8e15af 100644
--- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll
+++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll
@@ -7,6 +7,7 @@ import Instruction
private import internal.IRBlockImports as Imports
import Imports::EdgeKind
private import Cached
+private import codeql.controlflow.BasicBlock as BB
/**
* Holds if `block` is a block in `func` and `sortOverride`, `sortKey1`, and `sortKey2` are the
@@ -263,6 +264,49 @@ private predicate isEntryBlock(TIRBlock block) {
block = MkIRBlock(any(EnterFunctionInstruction enter))
}
+module IRCfg implements BB::CfgSig {
+ class ControlFlowNode = Instruction;
+
+ class SuccessorType = EdgeKind;
+
+ final private class FinalIRBlock = IRBlock;
+
+ class BasicBlock extends FinalIRBlock {
+ ControlFlowNode getNode(int i) { result = this.getInstruction(i) }
+
+ ControlFlowNode getLastNode() { result = super.getLastInstruction() }
+
+ int length() { result = this.getInstructionCount() }
+
+ BasicBlock getASuccessor() { result = super.getASuccessor() }
+
+ BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
+
+ predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
+
+ predicate dominates(BasicBlock bb) { super.dominates(bb) }
+
+ BasicBlock getImmediateDominator() { result.immediatelyDominates(this) }
+
+ predicate inDominanceFrontier(BasicBlock df) { super.dominanceFrontier() = df }
+
+ predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) }
+
+ predicate postDominates(BasicBlock bb) { super.postDominates(bb) }
+ }
+
+ class EntryBasicBlock extends BasicBlock {
+ EntryBasicBlock() { isEntryBlock(this) }
+ }
+
+ pragma[nomagic]
+ predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
+ bb1.getASuccessor() = bb2 and
+ bb1 = bb2.getImmediateDominator() and
+ forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred))
+ }
+}
+
cached
private module Cached {
cached
diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll
index ce65a65319a8..757db13fe8c3 100644
--- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll
+++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FormattingFunction.qll
@@ -170,6 +170,16 @@ abstract class FormattingFunction extends ArrayFunction, TaintFunction {
output.isParameterDeref(this.getOutputParameterIndex(_))
)
}
+
+ final override predicate isPartialWrite(FunctionOutput output) {
+ exists(int outputParameterIndex |
+ output.isParameterDeref(outputParameterIndex) and
+ // We require the output to be a stream since that definitely means that
+ // it's a partial write. If it's not a stream then it will most likely
+ // fill the whole buffer.
+ outputParameterIndex = this.getOutputParameterIndex(true)
+ )
+ }
}
/**
diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme b/cpp/ql/lib/semmlecode.cpp.dbscheme
index 5340d6d5f428..c16b29b27f71 100644
--- a/cpp/ql/lib/semmlecode.cpp.dbscheme
+++ b/cpp/ql/lib/semmlecode.cpp.dbscheme
@@ -222,6 +222,19 @@ extractor_version(
string frontend_version: string ref
)
+pch_uses(
+ int pch: @pch ref,
+ int compilation: @compilation ref,
+ int id: @file ref
+)
+
+#keyset[pch, compilation]
+pch_creations(
+ int pch: @pch,
+ int compilation: @compilation ref,
+ int from: @file ref
+)
+
/** An element for which line-count information is available. */
@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable;
diff --git a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats
index ef86a76e7edd..42cff5d8d16f 100644
--- a/cpp/ql/lib/semmlecode.cpp.dbscheme.stats
+++ b/cpp/ql/lib/semmlecode.cpp.dbscheme.stats
@@ -2,7 +2,7 @@
@compilation
- 12642
+ 12643@externalDataElement
@@ -10,7 +10,7 @@
@file
- 65211
+ 65212@folder
@@ -22,11 +22,15 @@
@location_default
- 46965929
+ 46945087
+
+
+ @pch
+ 249@macro_expansion
- 40257319
+ 40256583@other_macro_reference
@@ -34,7 +38,7 @@
@normal_function
- 2740505
+ 2738022@unknown_function
@@ -42,19 +46,19 @@
@constructor
- 698724
+ 698728@destructor
- 86280
+ 86202@conversion_function
- 10363
+ 10354@operator
- 653036
+ 652444@user_defined_literal
@@ -62,27 +66,27 @@
@deduction_guide
- 5868
+ 5863@fun_decl
- 4206778
+ 4202967@var_decl
- 9391612
+ 9383104@type_decl
- 1634963
+ 1633482@namespace_decl
- 407321
+ 407775@using_declaration
- 267931
+ 267822@using_directive
@@ -94,27 +98,27 @@
@static_assert
- 173266
+ 173262@parameter
- 7026197
+ 7019832@membervariable
- 1496815
+ 1497674@globalvariable
- 488591
+ 488148@localvariable
- 726232
+ 726300@enumconstant
- 345733
+ 347816@errortype
@@ -362,23 +366,23 @@
@pointer
- 452880
+ 452469@type_with_specifiers
- 693866
+ 693238@array
- 90401
+ 90319@routineptr
- 684109
+ 684112@reference
- 968192
+ 967314@gnu_vector
@@ -390,7 +394,7 @@
@rvalue_reference
- 291306
+ 291042@block
@@ -410,7 +414,7 @@
@underlying_type
- 624
+ 623@bases
@@ -486,23 +490,23 @@
@struct
- 979865
+ 979892@union
- 20977
+ 20958@enum
- 41337
+ 41550@template_parameter
- 867072
+ 867095@alias
- 1762239
+ 1762360@unknown_usertype
@@ -510,7 +514,7 @@
@class
- 325269
+ 324974@template_template_parameter
@@ -518,31 +522,31 @@
@proxy_class
- 48438
+ 48439@scoped_enum
- 11612
+ 11601@template_struct
- 212078
+ 212084@template_class
- 29342
+ 29316@template_union
- 1373
+ 1372@mangledname
- 6370039
+ 6364268@type_mention
- 5902897
+ 5903894@concept_template
@@ -550,15 +554,15 @@
@routinetype
- 604319
+ 604322@ptrtomember
- 9727
+ 9728@specifier
- 7741
+ 7734@gnuattribute
@@ -566,11 +570,11 @@
@stdattribute
- 353114
+ 352794@declspec
- 330047
+ 330281@msattribute
@@ -578,7 +582,7 @@
@alignas
- 2166
+ 2164@attribute_arg_token
@@ -586,7 +590,7 @@
@attribute_arg_constant_expr
- 71875
+ 71856@attribute_arg_expr
@@ -606,15 +610,15 @@
@derivation
- 476900
+ 476902@frienddecl
- 700462
+ 700465@comment
- 11241965
+ 11233402@namespace
@@ -626,15 +630,15 @@
@namequalifier
- 3041863
+ 3041979@value
- 13474606
+ 13474601@initialiser
- 2251035
+ 2251321@address_of
@@ -646,11 +650,11 @@
@array_to_pointer
- 1953751
+ 1953750@parexpr
- 4915208
+ 4915206@arithnegexpr
@@ -658,7 +662,7 @@
@unaryplusexpr
- 4073
+ 4069@complementexpr
@@ -670,7 +674,7 @@
@postincrexpr
- 84581
+ 84571@postdecrexpr
@@ -686,11 +690,11 @@
@conditionalexpr
- 897880
+ 897879@addexpr
- 571553
+ 571552@subexpr
@@ -702,7 +706,7 @@
@divexpr
- 52393
+ 52387@remexpr
@@ -714,11 +718,11 @@
@psubexpr
- 68024
+ 68016@pdiffexpr
- 43951
+ 43912@lshiftexpr
@@ -738,7 +742,7 @@
@xorexpr
- 73961
+ 73952@eqexpr
@@ -758,7 +762,7 @@
@geexpr
- 81368
+ 81358@leexpr
@@ -786,7 +790,7 @@
@assignremexpr
- 874
+ 873@assignlshiftexpr
@@ -822,19 +826,19 @@
@orlogicalexpr
- 1103523
+ 1103522@commaexpr
- 168440
+ 168288@subscriptexpr
- 435143
+ 435142@callexpr
- 239778
+ 239780@vastartexpr
@@ -846,7 +850,7 @@
@vaendexpr
- 2941
+ 2940@vacopyexpr
@@ -854,7 +858,7 @@
@varaccess
- 8254632
+ 8254629@runtime_sizeof
@@ -870,11 +874,11 @@
@routineexpr
- 5732226
+ 5732444@type_operand
- 1405363
+ 1405362@offsetofexpr
@@ -886,7 +890,7 @@
@literal
- 7967630
+ 7966299@aggregateliteral
@@ -894,11 +898,11 @@
@c_style_cast
- 6026986
+ 6026987@temp_init
- 992324
+ 992173@errorexpr
@@ -906,11 +910,11 @@
@reference_to
- 1902638
+ 1903138@ref_indirect
- 2107314
+ 2107325@vacuous_destructor_call
@@ -970,11 +974,11 @@
@thisaccess
- 1558310
+ 1558277@new_expr
- 46197
+ 46198@delete_expr
@@ -982,11 +986,11 @@
@throw_expr
- 24105
+ 24178@condition_decl
- 408905
+ 408920@braced_init_list
@@ -1058,11 +1062,11 @@
@isemptyexpr
- 8865
+ 8857@isenumexpr
- 2996
+ 2994@ispodexpr
@@ -1086,7 +1090,7 @@
@uuidof
- 26588
+ 26677@delete_array_expr
@@ -1110,11 +1114,11 @@
@ctorfieldinit
- 206399
+ 206212@ctordelegatinginit
- 3621
+ 3617@dtordirectdestruct
@@ -1126,15 +1130,15 @@
@dtorfielddestruct
- 39826
+ 39827@static_cast
- 348369
+ 348053@reinterpret_cast
- 40089
+ 40088@const_cast
@@ -1150,7 +1154,7 @@
@param_ref
- 164014
+ 164066@noopexpr
@@ -1158,7 +1162,7 @@
@istriviallyconstructibleexpr
- 3745
+ 3742@isdestructibleexpr
@@ -1174,15 +1178,15 @@
@istriviallyassignableexpr
- 3745
+ 3742@isnothrowassignableexpr
- 5119
+ 5114@istrivialexpr
- 3368
+ 3367@isstandardlayoutexpr
@@ -1190,7 +1194,7 @@
@istriviallycopyableexpr
- 1373
+ 1372@isliteraltypeexpr
@@ -1210,11 +1214,11 @@
@isconstructibleexpr
- 3621
+ 3617@isnothrowconstructibleexpr
- 20727
+ 20708@hasfinalizerexpr
@@ -1254,7 +1258,7 @@
@noexceptexpr
- 28356
+ 28465@builtinshufflevector
@@ -1266,7 +1270,7 @@
@builtinaddressof
- 15483
+ 15469@vec_fill
@@ -1426,7 +1430,7 @@
@reuseexpr
- 847007
+ 847039@istriviallycopyassignable
@@ -1526,7 +1530,7 @@
@requires_expr
- 16502
+ 16503@nested_requirement
@@ -1538,15 +1542,15 @@
@concept_id
- 90430
+ 90433@lambdacapture
- 31966
+ 31965@stmt_expr
- 2031614
+ 2031613@stmt_if
@@ -1558,19 +1562,19 @@
@stmt_goto
- 157904
+ 157909@stmt_label
- 78022
+ 78025@stmt_return
- 1241797
+ 1241788@stmt_block
- 1729360
+ 1728666@stmt_end_test_while
@@ -1582,11 +1586,11 @@
@stmt_switch_case
- 836120
+ 836152@stmt_switch
- 411852
+ 411868@stmt_asm
@@ -1594,11 +1598,11 @@
@stmt_decl
- 772441
+ 772425@stmt_empty
- 429388
+ 429404@stmt_continue
@@ -1606,11 +1610,11 @@
@stmt_break
- 137937
+ 137934@stmt_try_block
- 26698
+ 26740@stmt_microsoft_try
@@ -1630,15 +1634,15 @@
@stmt_range_based_for
- 6387
+ 6384@stmt_handler
- 43746
+ 43781@stmt_constexpr_if
- 106134
+ 106037@stmt_co_return
@@ -1658,7 +1662,7 @@
@ppd_if
- 591478
+ 590942@ppd_ifdef
@@ -1666,35 +1670,35 @@
@ppd_ifndef
- 158651
+ 158633@ppd_elif
- 21916
+ 21917@ppd_else
- 235118
+ 234905@ppd_endif
- 889777
+ 888971@ppd_plain_include
- 318555
+ 318564@ppd_define
- 2752617
+ 2750123@ppd_undef
- 100515
+ 100424@ppd_pragma
- 406555
+ 406187@ppd_include_next
@@ -1702,7 +1706,7 @@
@ppd_line
- 18827
+ 18812@ppd_error
@@ -1760,11 +1764,11 @@
compilations
- 12642
+ 12643id
- 12642
+ 12643cwd
@@ -1782,7 +1786,7 @@
12
- 12642
+ 12643
@@ -1808,11 +1812,11 @@
compilation_args
- 1012186
+ 1012213id
- 12642
+ 12643num
@@ -1820,7 +1824,7 @@
arg
- 29267
+ 29268
@@ -2179,7 +2183,7 @@
12
- 19381
+ 193822
@@ -2199,15 +2203,15 @@
compilation_build_mode
- 12642
+ 2id
- 12642
+ 2mode
- 10
+ 2
@@ -2221,7 +2225,7 @@
12
- 12642
+ 2
@@ -2235,9 +2239,9 @@
12
- 1197
- 1198
- 10
+ 1
+ 2
+ 2
@@ -2247,19 +2251,19 @@
compilation_compiling_files
- 15739
+ 15738id
- 2723
+ 2722num
- 4520
+ 4519file
- 13670
+ 13668
@@ -2447,7 +2451,7 @@
12
- 12308
+ 123072
@@ -2473,7 +2477,7 @@
12
- 12526
+ 125252
@@ -2493,15 +2497,15 @@
compilation_time
- 62959
+ 62952id
- 2723
+ 2722num
- 4520
+ 4519kind
@@ -2509,7 +2513,7 @@
seconds
- 13343
+ 13396
@@ -2574,7 +2578,7 @@
45
- 2723
+ 2722
@@ -2587,20 +2591,15 @@
12
-
- 2
- 3
- 54
- 34
- 653
+ 81645
- 653
+ 5446
@@ -2619,23 +2618,23 @@
11
- 14
+ 15217
- 16
- 18
- 163
+ 15
+ 19
+ 217
- 18
- 22
+ 19
+ 26217
- 25
- 103
- 217
+ 42
+ 92
+ 163
@@ -2687,7 +2686,7 @@
45
- 4520
+ 4519
@@ -2700,6 +2699,11 @@
12
+
+ 2
+ 3
+ 54
+ 34
@@ -2708,38 +2712,43 @@
45
- 1034
+ 98056
- 326
+ 27267
- 381
+ 54478
- 326
+ 16389
- 326
+ 2729
- 22
+ 14381
- 25
- 91
+ 17
+ 44381
+
+ 49
+ 87
+ 108
+
@@ -2794,13 +2803,13 @@
54
- 148
- 149
+ 144
+ 14554
- 154
- 155
+ 149
+ 15054
@@ -2817,27 +2826,27 @@
12
- 6644
+ 680723
- 3267
+ 337634
- 1797
+ 16334
- 6
- 1198
+ 5
+ 1034
- 6
- 48
- 435
+ 5
+ 45
+ 544
@@ -2853,17 +2862,17 @@
12
- 5882
+ 620823
- 2941
+ 266834
- 1960
+ 20694
@@ -2872,13 +2881,13 @@
5
- 7
+ 81198
- 7
- 73
- 435
+ 8
+ 74
+ 326
@@ -2894,12 +2903,17 @@
12
- 9857
+ 1051023
- 3485
+ 2831
+
+
+ 3
+ 4
+ 54
@@ -3155,15 +3169,15 @@
compilation_finished
- 12642
+ 12643id
- 12642
+ 12643cpu_seconds
- 9579
+ 9379elapsed_seconds
@@ -3181,7 +3195,7 @@
12
- 12642
+ 12643
@@ -3197,7 +3211,7 @@
12
- 12642
+ 12643
@@ -3213,17 +3227,17 @@
12
- 8080
+ 776323
- 1077
+ 11723
- 25
- 422
+ 29
+ 443
@@ -3239,12 +3253,12 @@
12
- 9051
+ 873523
- 528
+ 644
@@ -3260,47 +3274,47 @@
12
- 73
+ 632
- 5
+ 321
- 6
- 8
+ 3
+ 521
- 11
- 12
- 10
+ 8
+ 9
+ 31
- 13
- 14
+ 12
+ 1521
- 14
- 17
+ 15
+ 3721
- 27
- 54
+ 51
+ 17721
- 164
- 251
+ 241
+ 28621
- 289
- 322
- 21
+ 326
+ 327
+ 10
@@ -3316,47 +3330,47 @@
12
- 73
+ 632
- 5
+ 321
- 6
- 8
+ 3
+ 521
- 11
- 12
- 10
+ 8
+ 9
+ 31
- 13
- 14
+ 12
+ 1521
- 14
- 17
+ 15
+ 3721
- 26
- 53
+ 48
+ 16221
- 154
- 161
+ 165
+ 22121
- 227
- 246
- 21
+ 237
+ 238
+ 10
@@ -3593,31 +3607,31 @@
locations_default
- 46965929
+ 46945087id
- 46965929
+ 46945087file
- 40955
+ 40918beginLine
- 7507421
+ 7500620beginColumn
- 21975
+ 21956endLine
- 7508545
+ 7501742endColumn
- 53441
+ 53393
@@ -3631,7 +3645,7 @@
12
- 46965929
+ 46945087
@@ -3647,7 +3661,7 @@
12
- 46965929
+ 46945087
@@ -3663,7 +3677,7 @@
12
- 46965929
+ 46945087
@@ -3679,7 +3693,7 @@
12
- 46965929
+ 46945087
@@ -3695,7 +3709,7 @@
12
- 46965929
+ 46945087
@@ -3711,67 +3725,67 @@
115
- 3121
+ 31181541
- 3121
+ 31184272
- 3121
+ 311872114
- 3371
+ 3368114142
- 3121
+ 3118143211
- 3121
+ 3118213307
- 3121
+ 3118310430
- 3121
+ 3118437596
- 3121
+ 3118607827
- 3121
+ 31188391298
- 3121
+ 31181300
- 2722
- 3121
+ 2855
+ 3118311430788
- 3121
+ 311857880
@@ -3792,67 +3806,67 @@
113
- 3371
+ 33681331
- 3371
+ 33683147
- 3121
+ 31184764
- 3121
+ 31186484
- 3121
+ 311885115
- 3121
+ 3118116160
- 3246
+ 3243160206
- 3121
+ 3118206291
- 3121
+ 3118298388
- 3121
+ 3118395527
- 3121
+ 31185611339
- 3121
+ 3118137557764
- 2871
+ 2869
@@ -3868,67 +3882,67 @@
15
- 3745
+ 374259
- 3121
+ 3118915
- 3246
+ 32431520
- 3246
+ 32432028
- 3246
+ 32432836
- 3246
+ 32433642
- 3121
+ 31184253
- 3371
+ 33685362
- 3246
+ 32436281
- 3121
+ 31188195
- 3121
+ 311895111
- 3121
+ 3118112156
- 1997
+ 1996
@@ -3944,67 +3958,67 @@
113
- 3371
+ 33681331
- 3371
+ 33683146
- 3121
+ 31184663
- 3121
+ 31186384
- 3121
+ 311884114
- 3121
+ 3118118160
- 3246
+ 3243160206
- 3121
+ 3118207291
- 3121
+ 3118300390
- 3121
+ 3118395562
- 3121
+ 31185641350
- 3121
+ 3118142057764
- 2871
+ 2869
@@ -4020,67 +4034,67 @@
112
- 3371
+ 33681326
- 3496
+ 34932634
- 3246
+ 32433442
- 3246
+ 32434250
- 3246
+ 32435061
- 3121
+ 31186167
- 3246
+ 32436776
- 3496
+ 34937688
- 3246
+ 324389102
- 3121
+ 3118102116
- 3496
+ 3493116133
- 3121
+ 3118136363
- 1498
+ 1497
@@ -4096,32 +4110,32 @@
12
- 4961952
+ 495745723
- 779772
+ 77906634
- 544405
+ 543911412
- 570876
+ 5703591297
- 563134
+ 56337297637
- 87279
+ 86452
@@ -4137,27 +4151,27 @@
12
- 5024010
+ 501945823
- 1222414
+ 122130636
- 640550
+ 639969657
- 563509
+ 56324857329
- 56937
+ 56636
@@ -4173,27 +4187,27 @@
12
- 5646455
+ 564133923
- 483596
+ 48315837
- 582613
+ 582085725
- 566256
+ 5652442594
- 228500
+ 228792
@@ -4209,12 +4223,12 @@
12
- 7041180
+ 7034552285
- 466240
+ 466067
@@ -4230,32 +4244,32 @@
12
- 5031002
+ 502644423
- 740066
+ 73939534
- 540284
+ 539795412
- 587483
+ 5869501272
- 565257
+ 56412172250
- 43327
+ 43912
@@ -4271,67 +4285,67 @@
12
- 1748
+ 174626
- 1997
+ 1996612
- 1872
+ 18711240
- 1748
+ 174649128
- 1748
+ 1746129253
- 1748
+ 1746316707
- 1748
+ 17467911267
- 1748
+ 174612811943
- 1748
+ 174620172398
- 1748
+ 1746
- 2491
- 3203
- 1748
+ 2493
+ 3212
+ 1746
- 3252
+ 32607915
- 1748
+ 1746
- 10983
+ 11053121029
- 624
+ 623
@@ -4347,62 +4361,62 @@
12
- 1997
+ 199624
- 1748
+ 174647
- 1748
+ 1746718
- 1872
+ 18711943
- 1748
+ 17464460
- 1748
+ 17466693
- 1748
+ 174696117
- 1748
+ 1746117150
- 1748
+ 1746150169
- 1748
+ 1746169181
- 1748
+ 1746182217
- 1872
+ 1871243
@@ -4423,67 +4437,67 @@
12
- 1872
+ 187125
- 1872
+ 1871511
- 1748
+ 17461136
- 1748
+ 174636101
- 1748
+ 1746108217
- 1748
+ 1746
- 226
+ 225543
- 1748
+ 1746633
- 1057
- 1748
+ 1059
+ 1746
- 1072
- 1409
- 1748
+ 1071
+ 1410
+ 1746
- 1416
- 1614
- 1748
+ 1414
+ 1610
+ 1746
- 1615
- 1810
- 1748
+ 1613
+ 1807
+ 1746
- 1826
- 3777
- 1748
+ 1834
+ 3791
+ 1746
- 3834
+ 383759554
- 749
+ 748
@@ -4499,67 +4513,67 @@
12
- 1872
+ 187125
- 1872
+ 1871511
- 1748
+ 17461136
- 1748
+ 174636102
- 1748
+ 1746109218
- 1748
+ 1746
- 225
+ 224545
- 1748
+ 1746631
- 1055
- 1748
+ 1057
+ 1746
- 1074
+ 10731407
- 1748
+ 1746
- 1425
- 1611
- 1748
+ 1423
+ 1609
+ 1746
- 1614
- 1807
- 1748
+ 1612
+ 1805
+ 1746
- 1827
- 3760
- 1748
+ 1835
+ 3774
+ 1746
- 3827
+ 383059562
- 749
+ 748
@@ -4575,67 +4589,67 @@
12
- 2122
+ 212025
- 1498
+ 149758
- 1623
+ 1621813
- 1748
+ 17461323
- 1997
+ 19962333
- 1872
+ 18713444
- 1748
+ 17464557
- 1748
+ 174658
- 74
- 1997
+ 73
+ 1497
- 77
- 86
- 1872
+ 73
+ 83
+ 1746
- 86
- 98
- 1748
+ 83
+ 92
+ 1746
- 98
- 160
- 1748
+ 92
+ 144
+ 1746
- 258
+ 147299
- 249
+ 873
@@ -4651,32 +4665,32 @@
12
- 4959830
+ 495533623
- 782270
+ 78156134
- 545279
+ 544785412
- 568378
+ 56786412
- 96
- 564757
+ 95
+ 563497
- 96
+ 95620
- 88028
+ 88697
@@ -4692,27 +4706,27 @@
12
- 5021138
+ 501658923
- 1224911
+ 122380136
- 633932
+ 633357652
- 564633
+ 56412152329
- 63930
+ 63872
@@ -4728,12 +4742,12 @@
12
- 7057912
+ 70516432
- 18
- 450632
+ 15
+ 450099
@@ -4749,27 +4763,27 @@
12
- 5645580
+ 564046623
- 480974
+ 48053837
- 587607
+ 587075725
- 569752
+ 5688622589
- 224629
+ 224800
@@ -4785,32 +4799,32 @@
12
- 5029629
+ 502507223
- 744436
+ 74376234
- 540034
+ 539545412
- 588107
+ 5875741272
- 563509
+ 56274972250
- 42828
+ 43038
@@ -4826,52 +4840,52 @@
12
- 15732
+ 1571823
- 5618
+ 561337
- 4245
+ 4241717
- 4120
+ 41161733
- 4120
+ 411633106
- 4120
+ 4116114689
- 4120
+ 4116721
- 2458
- 4120
+ 2460
+ 4116
- 2593
- 4731
- 4120
+ 2595
+ 4737
+ 4116475933780
- 3121
+ 3118
@@ -4887,52 +4901,52 @@
12
- 18604
+ 1858723
- 5618
+ 561335
- 3621
+ 361757
- 3745
+ 3742716
- 4370
+ 43661680
- 4120
+ 411681152
- 4245
+ 4241158212
- 4245
+ 4241212265
- 4120
+ 4116265329
- 749
+ 748
@@ -4948,52 +4962,52 @@
12
- 15982
+ 1596823
- 5993
+ 598838
- 4245
+ 4241818
- 4370
+ 43661842
- 4120
+ 411643218
- 4120
+ 4116
- 235
- 759
- 4120
+ 234
+ 758
+ 4116
- 768
- 2177
- 4120
+ 767
+ 2176
+ 4116
- 2209
- 2884
- 4120
+ 2206
+ 2882
+ 4116
- 2885
+ 289030763
- 2247
+ 2245
@@ -5009,52 +5023,52 @@
12
- 17231
+ 1721523
- 6243
+ 623734
- 3246
+ 324347
- 4245
+ 4241714
- 4245
+ 42411428
- 4120
+ 449128
- 45
- 4245
+ 46
+ 4116
- 45
- 69
- 4120
+ 46
+ 70
+ 4116
- 69
- 81
- 4245
+ 70
+ 82
+ 4241
- 81
+ 82117
- 1498
+ 1247
@@ -5070,52 +5084,52 @@
12
- 15982
+ 1596823
- 5993
+ 598838
- 4245
+ 4241818
- 4370
+ 43661841
- 4120
+ 411643217
- 4120
+ 4116
- 233
- 756
- 4120
+ 232
+ 755
+ 4116768
- 2177
- 4120
+ 2176
+ 4116
- 2208
- 2858
- 4120
+ 2206
+ 2862
+ 4116
- 2868
+ 286730757
- 2247
+ 2245
@@ -5125,15 +5139,15 @@
files
- 65211
+ 65212id
- 65211
+ 65212name
- 65211
+ 65212
@@ -5147,7 +5161,7 @@
12
- 65211
+ 65212
@@ -5163,7 +5177,7 @@
12
- 65211
+ 65212
@@ -5221,7 +5235,7 @@
containerparent
- 77579
+ 77581parent
@@ -5229,7 +5243,7 @@
child
- 77579
+ 77581
@@ -5294,7 +5308,7 @@
12
- 77579
+ 77581
@@ -5304,23 +5318,23 @@
numlines
- 808616
+ 807883element_id
- 807492
+ 806761num_lines
- 39456
+ 39421num_code
- 34087
+ 34056num_comment
- 18230
+ 18338
@@ -5334,12 +5348,12 @@
12
- 806368
+ 80563823
- 1123
+ 1122
@@ -5355,12 +5369,12 @@
12
- 806368
+ 80563823
- 1123
+ 1122
@@ -5376,7 +5390,7 @@
12
- 807242
+ 8065112
@@ -5397,27 +5411,27 @@
12
- 26720
+ 2669623
- 3745
+ 374235
- 3371
+ 3368535
- 2996
+ 2994391983
- 2622
+ 2619
@@ -5433,27 +5447,27 @@
12
- 27220
+ 2719523
- 4120
+ 411634
- 2497
+ 249547
- 3496
+ 3493712
- 2122
+ 2120
@@ -5469,27 +5483,27 @@
12
- 26845
+ 2682123
- 4120
+ 411634
- 2372
+ 237046
- 3246
+ 3243610
- 2871
+ 2869
@@ -5505,32 +5519,32 @@
12
- 21851
+ 2183123
- 3621
+ 361734
- 2372
+ 2370413
- 2871
+ 286914198
- 2622
+ 26192042092
- 749
+ 748
@@ -5546,32 +5560,32 @@
12
- 22225
+ 2220523
- 3621
+ 361734
- 2122
+ 212046
- 1872
+ 187169
- 2746
+ 2744913
- 1498
+ 1497
@@ -5587,27 +5601,27 @@
12
- 21975
+ 2195623
- 4245
+ 424135
- 2871
+ 286958
- 3121
+ 3118812
- 1872
+ 1871
@@ -5623,32 +5637,32 @@
12
- 11112
+ 1135223
- 2122
+ 199634
- 1123
+ 112247
- 1498
+ 14978
- 21
- 1373
+ 22
+ 1497
- 21
+ 423651
- 998
+ 873
@@ -5664,32 +5678,32 @@
12
- 11112
+ 1135223
- 2122
+ 199634
- 1123
+ 112247
- 1623
+ 16218
- 21
- 1373
+ 27
+ 1497
- 26
+ 3048
- 874
+ 748
@@ -5705,32 +5719,32 @@
12
- 11112
+ 1135223
- 2122
+ 199634
- 1373
+ 13724
- 7
- 1373
+ 8
+ 1497
- 7
- 21
- 1373
+ 8
+ 31
+ 1497
- 23
+ 3542
- 874
+ 623
@@ -6343,13 +6357,395 @@
+
+ pch_uses
+ 4134
+
+
+ pch
+ 162
+
+
+ compilation
+ 4134
+
+
+ id
+ 4134
+
+
+
+
+ pch
+ compilation
+
+
+ 12
+
+
+ 1
+ 2
+ 24
+
+
+ 4
+ 5
+ 8
+
+
+ 8
+ 9
+ 8
+
+
+ 10
+ 11
+ 16
+
+
+ 11
+ 12
+ 8
+
+
+ 13
+ 14
+ 8
+
+
+ 14
+ 15
+ 8
+
+
+ 19
+ 20
+ 16
+
+
+ 24
+ 25
+ 8
+
+
+ 25
+ 26
+ 8
+
+
+ 26
+ 27
+ 8
+
+
+ 36
+ 37
+ 8
+
+
+ 42
+ 43
+ 8
+
+
+ 51
+ 52
+ 8
+
+
+ 87
+ 88
+ 8
+
+
+ 107
+ 108
+ 8
+
+
+
+
+
+
+ pch
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 24
+
+
+ 4
+ 5
+ 8
+
+
+ 8
+ 9
+ 8
+
+
+ 10
+ 11
+ 16
+
+
+ 11
+ 12
+ 8
+
+
+ 13
+ 14
+ 8
+
+
+ 14
+ 15
+ 8
+
+
+ 19
+ 20
+ 16
+
+
+ 24
+ 25
+ 8
+
+
+ 25
+ 26
+ 8
+
+
+ 26
+ 27
+ 8
+
+
+ 36
+ 37
+ 8
+
+
+ 42
+ 43
+ 8
+
+
+ 51
+ 52
+ 8
+
+
+ 87
+ 88
+ 8
+
+
+ 107
+ 108
+ 8
+
+
+
+
+
+
+ compilation
+ pch
+
+
+ 12
+
+
+ 1
+ 2
+ 4134
+
+
+
+
+
+
+ compilation
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 4134
+
+
+
+
+
+
+ id
+ pch
+
+
+ 12
+
+
+ 1
+ 2
+ 4134
+
+
+
+
+
+
+ id
+ compilation
+
+
+ 12
+
+
+ 1
+ 2
+ 4134
+
+
+
+
+
+
+
+
+ pch_creations
+ 249
+
+
+ pch
+ 249
+
+
+ compilation
+ 249
+
+
+ from
+ 249
+
+
+
+
+ pch
+ compilation
+
+
+ 12
+
+
+ 1
+ 2
+ 249
+
+
+
+
+
+
+ pch
+ from
+
+
+ 12
+
+
+ 1
+ 2
+ 249
+
+
+
+
+
+
+ compilation
+ pch
+
+
+ 12
+
+
+ 1
+ 2
+ 249
+
+
+
+
+
+
+ compilation
+ from
+
+
+ 12
+
+
+ 1
+ 2
+ 249
+
+
+
+
+
+
+ from
+ pch
+
+
+ 12
+
+
+ 1
+ 2
+ 249
+
+
+
+
+
+
+ from
+ compilation
+
+
+ 12
+
+
+ 1
+ 2
+ 249
+
+
+
+
+
+
+ fileannotations
- 4200439
+ 4200551id
- 5766
+ 5767kind
@@ -6357,11 +6753,11 @@
name
- 58715
+ 58716value
- 39513
+ 39514
@@ -6606,7 +7002,7 @@
12
- 11026
+ 110272
@@ -6651,7 +7047,7 @@
47128
- 4921
+ 4922128
@@ -6677,7 +7073,7 @@
12
- 58715
+ 58716
@@ -6693,7 +7089,7 @@
12
- 11586
+ 115872
@@ -6774,12 +7170,12 @@
58
- 2460
+ 2461814
- 2967
+ 296814
@@ -6840,7 +7236,7 @@
12
- 39502
+ 395032
@@ -6936,15 +7332,15 @@
inmacroexpansion
- 149995963
+ 149995903id
- 24670878
+ 24670868inv
- 3705272
+ 3705270
@@ -6968,22 +7364,22 @@
56
- 1620369
+ 162036867
- 6582545
+ 658254278
- 8719001
+ 871899789
- 3557049
+ 35570479
@@ -7024,12 +7420,12 @@
78
- 282153
+ 28215289
- 330247
+ 3302469
@@ -7064,15 +7460,15 @@
affectedbymacroexpansion
- 48735840
+ 48735823id
- 7044740
+ 7044739inv
- 3803121
+ 3803120
@@ -7091,7 +7487,7 @@
23
- 766305
+ 7663043
@@ -7142,7 +7538,7 @@
79
- 301088
+ 3010879
@@ -7202,19 +7598,19 @@
macroinvocations
- 40338469
+ 40337724id
- 40338469
+ 40337724macro_id
- 182070
+ 182049location
- 5912755
+ 5912934kind
@@ -7232,7 +7628,7 @@
12
- 40338469
+ 40337724
@@ -7248,7 +7644,7 @@
12
- 40338469
+ 40337724
@@ -7264,7 +7660,7 @@
12
- 40338469
+ 40337724
@@ -7280,47 +7676,47 @@
12
- 60781
+ 6077323
- 27558
+ 2755534
- 17972
+ 1797045
- 10021
+ 1002057
- 13779
+ 13777713
- 14705
+ 147031333
- 13779
+ 1377733180
- 13670
+ 13668181
- 72144
- 9803
+ 72152
+ 9802
@@ -7336,42 +7732,42 @@
12
- 77283
+ 7727423
- 30553
+ 3055034
- 14323
+ 1432245
- 10293
+ 1029258
- 14105
+ 14104818
- 14160
+ 141581888
- 13670
+ 1366889
- 12189
- 7679
+ 12187
+ 7678
@@ -7387,7 +7783,7 @@
12
- 177495
+ 1774752
@@ -7408,17 +7804,17 @@
12
- 5255927
+ 525618324
- 422362
+ 4223134
- 72144
- 234464
+ 72152
+ 234437
@@ -7434,12 +7830,12 @@
12
- 5890588
+ 5890770237
- 22166
+ 22163
@@ -7455,7 +7851,7 @@
12
- 5912755
+ 5912934
@@ -7474,8 +7870,8 @@
54
- 739164
- 739165
+ 739237
+ 73923854
@@ -7516,8 +7912,8 @@
54
- 107495
- 107496
+ 107511
+ 10751254
@@ -7528,15 +7924,15 @@
macroparent
- 33655984
+ 33655149id
- 33655984
+ 33655149parent_id
- 15926379
+ 15926203
@@ -7550,7 +7946,7 @@
12
- 33655984
+ 33655149
@@ -7566,27 +7962,27 @@
12
- 7806498
+ 780645623
- 1595448
+ 159547934
- 4702906
+ 470295545
- 1295464
+ 12953125205
- 526061
+ 525999
@@ -7596,15 +7992,15 @@
macrolocationbind
- 6046191
+ 6040022id
- 4227950
+ 4221190location
- 2278566
+ 2279306
@@ -7618,27 +8014,27 @@
12
- 3302009
+ 329494823
- 491104
+ 49126434
- 7893
+ 789645
- 413756
+ 413891517
- 13185
+ 13189
@@ -7654,27 +8050,27 @@
12
- 1336578
+ 133701323
- 481984
+ 48214134
- 7807
+ 781045
- 428082
+ 4282215522
- 24112
+ 24119
@@ -7684,11 +8080,11 @@
macro_argument_unexpanded
- 82497361
+ 82495572invocation
- 26285935
+ 26282637argument_index
@@ -7696,7 +8092,7 @@
text
- 343260
+ 343270
@@ -7710,22 +8106,22 @@
12
- 9683509
+ 967976623
- 9770372
+ 977063534
- 5002131
+ 5002265467
- 1829922
+ 1829971
@@ -7741,22 +8137,22 @@
12
- 9866140
+ 986240123
- 9787916
+ 978817934
- 4845472
+ 4845602467
- 1786405
+ 1786453
@@ -7781,7 +8177,7 @@
646840
- 2488681
+ 248830231
@@ -7824,12 +8220,12 @@
12
- 39703
+ 3970423
- 62327
+ 623293
@@ -7839,37 +8235,37 @@
45
- 34580
+ 3458156
- 39249
+ 3925069
- 30873
+ 30874915
- 28982
+ 289831526
- 25887
+ 258882657
- 27144
+ 2714557517
- 25993
+ 25994518
@@ -7890,12 +8286,12 @@
12
- 243173
+ 24318023
- 89873
+ 898763
@@ -7910,11 +8306,11 @@
macro_argument_expanded
- 82497361
+ 82495572invocation
- 26285935
+ 26282637argument_index
@@ -7922,7 +8318,7 @@
text
- 207927
+ 207933
@@ -7936,22 +8332,22 @@
12
- 9683509
+ 967976623
- 9770372
+ 977063534
- 5002131
+ 5002265467
- 1829922
+ 1829971
@@ -7967,22 +8363,22 @@
12
- 12642108
+ 1263844423
- 8428244
+ 842847034
- 4225217
+ 422533149
- 990364
+ 990391
@@ -8007,7 +8403,7 @@
646840
- 2488681
+ 248830231
@@ -8055,17 +8451,17 @@
23
- 26859
+ 2686034
- 43495
+ 4349645
- 15906
+ 159075
@@ -8080,7 +8476,7 @@
710
- 18969
+ 1897010
@@ -8090,7 +8486,7 @@
1951
- 15779
+ 1578051
@@ -8099,7 +8495,7 @@
252
- 1169584
+ 11692059495
@@ -8116,12 +8512,12 @@
12
- 105083
+ 10508623
- 88912
+ 889143
@@ -8136,19 +8532,19 @@
functions
- 4053071
+ 4049399id
- 4053071
+ 4049399name
- 1694897
+ 1693362kind
- 874
+ 873
@@ -8162,7 +8558,7 @@
12
- 4053071
+ 4049399
@@ -8178,7 +8574,7 @@
12
- 4053071
+ 4049399
@@ -8194,17 +8590,17 @@
12
- 1448542
+ 144722924
- 139098
+ 13897143162
- 107257
+ 107160
@@ -8220,12 +8616,12 @@
12
- 1692026
+ 169049323
- 2871
+ 2869
@@ -8338,15 +8734,15 @@
function_entry_point
- 1141555
+ 1141561id
- 1137808
+ 1137813entry_point
- 1141555
+ 1141561
@@ -8360,7 +8756,7 @@
12
- 1134605
+ 11346112
@@ -8381,7 +8777,7 @@
12
- 1141555
+ 1141561
@@ -8391,15 +8787,15 @@
function_return_type
- 4070552
+ 4066864id
- 4053071
+ 4049399return_type
- 619822
+ 619261
@@ -8413,12 +8809,12 @@
12
- 4035590
+ 403193423
- 17480
+ 17465
@@ -8434,27 +8830,27 @@
12
- 310161
+ 30988023
- 213891
+ 21369735
- 48072
+ 480285365
- 46574
+ 465314329944
- 1123
+ 1122
@@ -8734,59 +9130,59 @@
purefunctions
- 131414
+ 131703id
- 131414
+ 131703function_deleted
- 88085
+ 88088id
- 88085
+ 88088function_defaulted
- 51680
+ 51682id
- 51680
+ 51682function_prototyped
- 4051572
+ 4047902id
- 4051572
+ 4047902deduction_guide_for_class
- 5868
+ 5863id
- 5868
+ 5863class_template
- 2247
+ 2245
@@ -8800,7 +9196,7 @@
12
- 5868
+ 5863
@@ -8816,7 +9212,7 @@
12
- 1123
+ 11222
@@ -8851,15 +9247,15 @@
member_function_this_type
- 674762
+ 674151id
- 674762
+ 674151this_type
- 176182
+ 176022
@@ -8873,7 +9269,7 @@
12
- 674762
+ 674151
@@ -8889,37 +9285,37 @@
12
- 47198
+ 4715523
- 36959
+ 3692634
- 32714
+ 3268445
- 20103
+ 2008456
- 12860
+ 12849610
- 14484
+ 144711065
- 11862
+ 11851
@@ -8929,27 +9325,27 @@
fun_decls
- 4212771
+ 4208955id
- 4206778
+ 4202967function
- 4028473
+ 4024823type_id
- 611831
+ 611277name
- 1693399
+ 1691865location
- 2815798
+ 2813247
@@ -8963,7 +9359,7 @@
12
- 4206778
+ 4202967
@@ -8979,12 +9375,12 @@
12
- 4200784
+ 419697923
- 5993
+ 5988
@@ -9000,7 +9396,7 @@
12
- 4206778
+ 4202967
@@ -9016,7 +9412,7 @@
12
- 4206778
+ 4202967
@@ -9032,12 +9428,12 @@
12
- 3864776
+ 386127525
- 163696
+ 163547
@@ -9053,12 +9449,12 @@
12
- 4009993
+ 400636023
- 18479
+ 18463
@@ -9074,7 +9470,7 @@
12
- 4028473
+ 4024823
@@ -9090,12 +9486,12 @@
12
- 3885254
+ 388173424
- 143218
+ 143088
@@ -9111,27 +9507,27 @@
12
- 295427
+ 29515923
- 220758
+ 22055835
- 48447
+ 484035364
- 45949
+ 4590836410292
- 1248
+ 1247
@@ -9147,22 +9543,22 @@
12
- 305541
+ 30526423
- 212018
+ 21182635
- 48072
+ 4802851163
- 45949
+ 459081483
@@ -9183,22 +9579,22 @@
12
- 491962
+ 49151623
- 52942
+ 5289437
- 50195
+ 5014972238
- 16731
+ 16716
@@ -9214,22 +9610,22 @@
12
- 455377
+ 45496423
- 69549
+ 6948536
- 56063
+ 5601264756
- 30841
+ 30813
@@ -9245,22 +9641,22 @@
12
- 1332543
+ 133133623
- 194662
+ 194485311
- 129608
+ 129490113169
- 36585
+ 36551
@@ -9276,17 +9672,17 @@
12
- 1448042
+ 144673024
- 139597
+ 13947043162
- 105759
+ 105663
@@ -9302,12 +9698,12 @@
12
- 1603497
+ 160204521596
- 89901
+ 89820
@@ -9323,17 +9719,17 @@
12
- 1368504
+ 136726423
- 208522
+ 20833331592
- 116372
+ 116267
@@ -9349,17 +9745,17 @@
12
- 2422477
+ 242028323
- 251724
+ 2514963211
- 141595
+ 141466
@@ -9375,17 +9771,17 @@
12
- 2441207
+ 243899523
- 233494
+ 2332833211
- 141095
+ 140967
@@ -9401,12 +9797,12 @@
12
- 2701298
+ 26988512211
- 114499
+ 114396
@@ -9422,12 +9818,12 @@
12
- 2776590
+ 277407528
- 39207
+ 39171
@@ -9437,11 +9833,11 @@
fun_def
- 1423569
+ 1422279id
- 1423569
+ 1422279
@@ -9470,15 +9866,15 @@
fun_decl_specifiers
- 4283569
+ 4279688id
- 1749837
+ 1748252name
- 1373
+ 1372
@@ -9492,22 +9888,22 @@
12
- 363228
+ 36289923
- 262463
+ 26222534
- 1101171
+ 110017445
- 22974
+ 22954
@@ -9704,22 +10100,22 @@
fun_decl_empty_throws
- 420457
+ 420911fun_decl
- 420457
+ 420911fun_decl_noexcept
- 141829
+ 141830fun_decl
- 141829
+ 141830constant
@@ -9737,7 +10133,7 @@
12
- 141829
+ 141830
@@ -9768,22 +10164,22 @@
fun_decl_empty_noexcept
- 1164727
+ 1163672fun_decl
- 1164727
+ 1163672fun_decl_typedef_type
- 2763
+ 2761fun_decl
- 2763
+ 2761typedeftype_id
@@ -9801,7 +10197,7 @@
12
- 2763
+ 2761
@@ -9877,7 +10273,7 @@
fun_requires
- 29110
+ 29111id
@@ -9889,7 +10285,7 @@
constraint
- 28874
+ 28875
@@ -9903,7 +10299,7 @@
12
- 10047
+ 100482
@@ -10007,7 +10403,7 @@
12
- 28637
+ 286382
@@ -10028,7 +10424,7 @@
12
- 28874
+ 28875
@@ -10038,19 +10434,19 @@
param_decl_bind
- 7317004
+ 7310375id
- 7317004
+ 7310375index
- 7991
+ 7984fun_decl
- 3534887
+ 3531684
@@ -10064,7 +10460,7 @@
12
- 7317004
+ 7310375
@@ -10080,7 +10476,7 @@
12
- 7317004
+ 7310375
@@ -10096,27 +10492,27 @@
23
- 3995
+ 399267
- 1997
+ 19961620
- 624
+ 62325147
- 624
+ 62334316215
- 624
+ 62328310
@@ -10137,27 +10533,27 @@
23
- 3995
+ 399267
- 1997
+ 19961620
- 624
+ 62325147
- 624
+ 62334316215
- 624
+ 62328310
@@ -10178,27 +10574,27 @@
12
- 1510349
+ 150898123
- 977182
+ 97629634
- 602591
+ 60204545
- 290932
+ 290668565
- 153831
+ 153692
@@ -10214,27 +10610,27 @@
12
- 1510349
+ 150898123
- 977182
+ 97629634
- 602591
+ 60204545
- 290932
+ 290668565
- 153831
+ 153692
@@ -10244,27 +10640,27 @@
var_decls
- 9398480
+ 9389965id
- 9391612
+ 9383104variable
- 9042868
+ 9034676type_id
- 1457782
+ 1456461name
- 853317
+ 852544location
- 6280262
+ 6274572
@@ -10278,7 +10674,7 @@
12
- 9391612
+ 9383104
@@ -10294,12 +10690,12 @@
12
- 9384745
+ 937624323
- 6867
+ 6861
@@ -10315,7 +10711,7 @@
12
- 9391612
+ 9383104
@@ -10331,7 +10727,7 @@
12
- 9391612
+ 9383104
@@ -10347,12 +10743,12 @@
12
- 8711605
+ 870371325
- 331263
+ 330962
@@ -10368,12 +10764,12 @@
12
- 8989302
+ 898115823
- 53566
+ 53517
@@ -10389,12 +10785,12 @@
12
- 8937359
+ 892926224
- 105509
+ 105414
@@ -10410,12 +10806,12 @@
12
- 8791018
+ 878305424
- 251849
+ 251621
@@ -10431,27 +10827,27 @@
12
- 850695
+ 84992423
- 284314
+ 28405635
- 127485
+ 127370511
- 113251
+ 113148112944
- 82035
+ 81961
@@ -10467,27 +10863,27 @@
12
- 871547
+ 87075823
- 269330
+ 26908635
- 122865
+ 122754511
- 113126
+ 113023112860
- 80911
+ 80838
@@ -10503,22 +10899,22 @@
12
- 1120525
+ 111951023
- 192789
+ 19261437
- 115373
+ 11526971038
- 29093
+ 29066
@@ -10534,27 +10930,27 @@
12
- 986297
+ 98540323
- 219260
+ 21906136
- 133728
+ 133607695
- 109380
+ 109281972622
- 9115
+ 9106
@@ -10570,32 +10966,32 @@
12
- 466365
+ 46594223
- 165943
+ 16579334
- 59684
+ 5963047
- 65927
+ 65868725
- 64179
+ 641212527139
- 31215
+ 31187
@@ -10611,32 +11007,32 @@
12
- 479351
+ 47891623
- 165194
+ 16504434
- 54690
+ 5464048
- 71671
+ 71606845
- 64304
+ 642464526704
- 18105
+ 18088
@@ -10652,22 +11048,22 @@
12
- 655283
+ 65469023
- 110878
+ 110778311
- 65553
+ 65493113463
- 21601
+ 21581
@@ -10683,27 +11079,27 @@
12
- 494209
+ 49376223
- 183424
+ 18325834
- 51693
+ 5164648
- 65053
+ 64994822619
- 58935
+ 58882
@@ -10719,17 +11115,17 @@
12
- 5780059
+ 5774822221
- 472733
+ 472305212943
- 27469
+ 27445
@@ -10745,12 +11141,12 @@
12
- 5860970
+ 585566022935
- 419291
+ 418911
@@ -10766,12 +11162,12 @@
12
- 5981463
+ 597604522555
- 298798
+ 298527
@@ -10787,12 +11183,12 @@
12
- 6267900
+ 626222225
- 12361
+ 12350
@@ -10802,11 +11198,11 @@
var_def
- 3770380
+ 3766964id
- 3770380
+ 3766964
@@ -10824,11 +11220,11 @@
var_decl_specifiers
- 490339
+ 489894id
- 490339
+ 489894name
@@ -10846,7 +11242,7 @@
12
- 490339
+ 489894
@@ -10956,19 +11352,19 @@
type_decls
- 1634963
+ 1633482id
- 1634963
+ 1633482type_id
- 1615984
+ 1614520location
- 1548807
+ 1547404
@@ -10982,7 +11378,7 @@
12
- 1634963
+ 1633482
@@ -10998,7 +11394,7 @@
12
- 1634963
+ 1633482
@@ -11014,12 +11410,12 @@
12
- 1599627
+ 1598177210
- 16357
+ 16342
@@ -11035,12 +11431,12 @@
12
- 1599751
+ 1598302210
- 16232
+ 16217
@@ -11056,12 +11452,12 @@
12
- 1526706
+ 1525323264
- 22100
+ 22080
@@ -11077,12 +11473,12 @@
12
- 1526831
+ 1525448264
- 21975
+ 21956
@@ -11092,22 +11488,22 @@
type_def
- 1096551
+ 1095558id
- 1096551
+ 1095558type_decl_top
- 673602
+ 673959type_decl
- 673602
+ 673959
@@ -11118,7 +11514,7 @@
id
- 2043
+ 2044constraint
@@ -11187,11 +11583,11 @@
namespace_decls
- 407321
+ 407775id
- 407321
+ 407775namespace_id
@@ -11199,11 +11595,11 @@
location
- 407321
+ 407775bodylocation
- 407321
+ 407775
@@ -11217,7 +11613,7 @@
12
- 407321
+ 407775
@@ -11233,7 +11629,7 @@
12
- 407321
+ 407775
@@ -11249,7 +11645,7 @@
12
- 407321
+ 407775
@@ -11308,13 +11704,13 @@
146
- 268
- 1868
+ 270
+ 18701462205
- 12449
+ 1246132
@@ -11374,13 +11770,13 @@
146
- 268
- 1868
+ 270
+ 18701462205
- 12449
+ 1246132
@@ -11440,13 +11836,13 @@
146
- 268
- 1868
+ 270
+ 18701462205
- 12449
+ 1246132
@@ -11463,7 +11859,7 @@
12
- 407321
+ 407775
@@ -11479,7 +11875,7 @@
12
- 407321
+ 407775
@@ -11495,7 +11891,7 @@
12
- 407321
+ 407775
@@ -11511,7 +11907,7 @@
12
- 407321
+ 407775
@@ -11527,7 +11923,7 @@
12
- 407321
+ 407775
@@ -11543,7 +11939,7 @@
12
- 407321
+ 407775
@@ -11553,15 +11949,15 @@
usings
- 272082
+ 271973id
- 272082
+ 271973element_id
- 59053
+ 58938location
@@ -11583,7 +11979,7 @@
12
- 272082
+ 271973
@@ -11599,7 +11995,7 @@
12
- 272082
+ 271973
@@ -11615,7 +12011,7 @@
12
- 272082
+ 271973
@@ -11631,7 +12027,7 @@
12
- 51321
+ 512062
@@ -11657,7 +12053,7 @@
12
- 51321
+ 512062
@@ -11683,7 +12079,7 @@
12
- 59053
+ 58938
@@ -11704,12 +12100,12 @@
24
- 2302
+ 22924132
- 1943
+ 1954145
@@ -11735,12 +12131,12 @@
24
- 2302
+ 22924132
- 1943
+ 1954145
@@ -11780,8 +12176,8 @@
10
- 25367
- 25368
+ 25356
+ 2535710
@@ -11801,8 +12197,8 @@
10
- 5377
- 5378
+ 5366
+ 536710
@@ -11834,15 +12230,15 @@
using_container
- 580149
+ 580049parent
- 21895
+ 21874child
- 272082
+ 271973
@@ -11871,7 +12267,7 @@
67
- 2291
+ 22707
@@ -11907,22 +12303,22 @@
12
- 96601
+ 9648823
- 120282
+ 12028534
- 20099
+ 2010045
- 26711
+ 267125
@@ -11937,23 +12333,23 @@
static_asserts
- 173266
+ 173262id
- 173266
+ 173262condition
- 173266
+ 173262message
- 38765
+ 38764location
- 22648
+ 22647enclosing
@@ -11971,7 +12367,7 @@
12
- 173266
+ 173262
@@ -11987,7 +12383,7 @@
12
- 173266
+ 173262
@@ -12003,7 +12399,7 @@
12
- 173266
+ 173262
@@ -12019,7 +12415,7 @@
12
- 173266
+ 173262
@@ -12035,7 +12431,7 @@
12
- 173266
+ 173262
@@ -12051,7 +12447,7 @@
12
- 173266
+ 173262
@@ -12067,7 +12463,7 @@
12
- 173266
+ 173262
@@ -12083,7 +12479,7 @@
12
- 173266
+ 173262
@@ -12099,7 +12495,7 @@
12
- 28505
+ 285042
@@ -12140,7 +12536,7 @@
12
- 28505
+ 285042
@@ -12181,7 +12577,7 @@
12
- 35922
+ 359212
@@ -12217,7 +12613,7 @@
412
- 1909
+ 190812
@@ -12258,7 +12654,7 @@
56
- 4736
+ 47356
@@ -12319,7 +12715,7 @@
56
- 4736
+ 47356
@@ -12391,12 +12787,12 @@
12
- 5069
+ 506823
- 8099
+ 80983
@@ -12499,7 +12895,7 @@
12
- 5857
+ 58562
@@ -12545,23 +12941,23 @@
params
- 7067152
+ 7060750id
- 7026197
+ 7019832function
- 3408025
+ 3404938index
- 7991
+ 7984type_id
- 1221415
+ 1220308
@@ -12575,7 +12971,7 @@
12
- 7026197
+ 7019832
@@ -12591,7 +12987,7 @@
12
- 7026197
+ 7019832
@@ -12607,12 +13003,12 @@
12
- 6985242
+ 697891323
- 40955
+ 40918
@@ -12628,27 +13024,27 @@
12
- 1474513
+ 147317723
- 927111
+ 92627234
- 579242
+ 57871745
- 281067
+ 280813565
- 146090
+ 145958
@@ -12664,27 +13060,27 @@
12
- 1474513
+ 147317723
- 927111
+ 92627234
- 579242
+ 57871745
- 281067
+ 280813565
- 146090
+ 145958
@@ -12700,22 +13096,22 @@
12
- 1783301
+ 178168523
- 1031622
+ 103068834
- 437896
+ 437499411
- 155205
+ 155064
@@ -12731,27 +13127,27 @@
23
- 3995
+ 399267
- 1997
+ 19961418
- 624
+ 62323138
- 624
+ 62332015486
- 624
+ 62327294
@@ -12772,27 +13168,27 @@
23
- 3995
+ 399267
- 1997
+ 19961418
- 624
+ 62323138
- 624
+ 62332015486
- 624
+ 62327294
@@ -12813,27 +13209,27 @@
12
- 3995
+ 399223
- 1997
+ 199647
- 624
+ 623955
- 624
+ 6231162703
- 624
+ 6237497
@@ -12854,27 +13250,27 @@
12
- 738193
+ 73752423
- 240612
+ 24039435
- 93273
+ 93188513
- 93897
+ 93812132574
- 55439
+ 55389
@@ -12890,27 +13286,27 @@
12
- 820353
+ 81961023
- 179803
+ 17964036
- 106258
+ 106162627
- 92274
+ 92190272562
- 22725
+ 22704
@@ -12926,17 +13322,17 @@
12
- 996036
+ 99513423
- 166942
+ 166791365
- 58436
+ 58383
@@ -12946,11 +13342,11 @@
overrides
- 159781
+ 159778new
- 151073
+ 151069old
@@ -12968,7 +13364,7 @@
12
- 142372
+ 1423692
@@ -13024,19 +13420,19 @@
membervariables
- 1499266
+ 1500125id
- 1496815
+ 1497674type_id
- 456075
+ 456185name
- 641686
+ 642156
@@ -13050,7 +13446,7 @@
12
- 1494473
+ 14953332
@@ -13071,7 +13467,7 @@
12
- 1496815
+ 1497674
@@ -13087,22 +13483,22 @@
12
- 338326
+ 33844923
- 72218
+ 72155310
- 35401
+ 3545110
- 4444
- 10130
+ 4445
+ 10128
@@ -13118,22 +13514,22 @@
12
- 355917
+ 35603923
- 64321
+ 64313349
- 34311
+ 34253
- 56
- 2185
- 1524
+ 49
+ 2186
+ 1579
@@ -13149,22 +13545,22 @@
12
- 421164
+ 42149623
- 122542
+ 12241935
- 57785
+ 580515656
- 40193
+ 40189
@@ -13180,17 +13576,17 @@
12
- 524318
+ 52442023
- 72817
+ 731903660
- 44550
+ 44545
@@ -13200,19 +13596,19 @@
globalvariables
- 488591
+ 488148id
- 488591
+ 488148type_id
- 10363
+ 10354name
- 112626
+ 112524
@@ -13226,7 +13622,7 @@
12
- 488591
+ 488148
@@ -13242,7 +13638,7 @@
12
- 488591
+ 488148
@@ -13258,7 +13654,7 @@
12
- 6992
+ 69862
@@ -13268,17 +13664,17 @@
35
- 749
+ 748520
- 874
+ 8732074
- 874
+ 873152
@@ -13299,7 +13695,7 @@
12
- 7117
+ 71102
@@ -13309,17 +13705,17 @@
35
- 749
+ 748520
- 749
+ 7482074
- 874
+ 873125
@@ -13340,17 +13736,17 @@
12
- 95395
+ 9530927
- 8865
+ 88577604
- 8365
+ 8358
@@ -13366,12 +13762,12 @@
12
- 97018
+ 9693123
- 15358
+ 153443
@@ -13386,19 +13782,19 @@
localvariables
- 726232
+ 726300id
- 726232
+ 726300type_id
- 53437
+ 53440name
- 101525
+ 101634
@@ -13412,7 +13808,7 @@
12
- 726232
+ 726300
@@ -13428,7 +13824,7 @@
12
- 726232
+ 726300
@@ -13444,37 +13840,37 @@
12
- 28883
+ 2886523
- 7837
+ 784334
- 4028
+ 402946
- 4053
+ 4065612
- 4145
+ 413312
- 165
- 4008
+ 162
+ 4009
- 165
- 19323
- 480
+ 162
+ 19347
+ 492
@@ -13490,22 +13886,22 @@
12
- 38383
+ 3836923
- 6700
+ 670735
- 4465
+ 44785
- 3502
- 3888
+ 3509
+ 3885
@@ -13521,32 +13917,32 @@
12
- 62449
+ 6254023
- 16031
+ 1603934
- 6524
+ 653048
- 8146
+ 81478
- 132
- 7617
+ 134
+ 7623
- 132
- 7547
- 756
+ 134
+ 7549
+ 752
@@ -13562,22 +13958,22 @@
12
- 84480
+ 8458623
- 8414
+ 8411315
- 7677
+ 7683151509
- 953
+ 952
@@ -13587,15 +13983,15 @@
autoderivation
- 229374
+ 229166var
- 229374
+ 229166derivation_type
- 624
+ 623
@@ -13609,7 +14005,7 @@
12
- 229374
+ 229166
@@ -13655,15 +14051,15 @@
orphaned_variables
- 44323
+ 44324var
- 44323
+ 44324function
- 41052
+ 41053
@@ -13677,7 +14073,7 @@
12
- 44323
+ 44324
@@ -13708,19 +14104,19 @@
enumconstants
- 345733
+ 347816id
- 345733
+ 347816parent
- 41337
+ 41550index
- 13942
+ 13940type_id
@@ -13728,11 +14124,11 @@
name
- 345351
+ 347435location
- 318338
+ 320424
@@ -13746,7 +14142,7 @@
12
- 345733
+ 347816
@@ -13762,7 +14158,7 @@
12
- 345733
+ 347816
@@ -13778,7 +14174,7 @@
12
- 345733
+ 347816
@@ -13794,7 +14190,7 @@
12
- 345733
+ 347816
@@ -13810,7 +14206,7 @@
12
- 345733
+ 347816
@@ -13831,17 +14227,17 @@
23
- 5773
+ 577234
- 8714
+ 871345
- 5500
+ 55545
@@ -13861,22 +14257,22 @@
810
- 2941
+ 29951015
- 3322
+ 343015
- 32
- 3104
+ 33
+ 3158
- 32
+ 33257
- 1361
+ 1306
@@ -13897,17 +14293,17 @@
23
- 5773
+ 577234
- 8714
+ 871345
- 5500
+ 55545
@@ -13927,22 +14323,22 @@
810
- 2941
+ 29951015
- 3322
+ 343015
- 32
- 3104
+ 33
+ 3158
- 32
+ 33257
- 1361
+ 1306
@@ -13958,7 +14354,7 @@
12
- 41337
+ 41550
@@ -13979,17 +14375,17 @@
23
- 5773
+ 577234
- 8714
+ 871345
- 5500
+ 55545
@@ -14009,22 +14405,22 @@
810
- 2941
+ 29951015
- 3322
+ 343015
- 32
- 3104
+ 33
+ 3158
- 32
+ 33257
- 1361
+ 1306
@@ -14040,7 +14436,7 @@
12
- 2124
+ 21232
@@ -14050,12 +14446,12 @@
34
- 8768
+ 876745
- 5446
+ 55005
@@ -14075,22 +14471,22 @@
811
- 3757
+ 38111117
- 3104
+ 321217
- 123
- 3104
+ 165
+ 3158
- 164
+ 256257
- 108
+ 54
@@ -14145,7 +14541,7 @@
64
- 760
+ 764980
@@ -14201,7 +14597,7 @@
64
- 760
+ 764980
@@ -14218,7 +14614,7 @@
12
- 13942
+ 13940
@@ -14273,7 +14669,7 @@
64
- 757
+ 761980
@@ -14329,7 +14725,7 @@
64
- 760
+ 764980
@@ -14344,8 +14740,8 @@
12
- 6348
- 6349
+ 6387
+ 638854
@@ -14360,8 +14756,8 @@
12
- 759
- 760
+ 763
+ 76454
@@ -14392,8 +14788,8 @@
12
- 6341
- 6342
+ 6380
+ 638154
@@ -14408,8 +14804,8 @@
12
- 5845
- 5846
+ 5884
+ 588554
@@ -14426,7 +14822,7 @@
12
- 344970
+ 3470542
@@ -14447,7 +14843,7 @@
12
- 344970
+ 3470542
@@ -14468,7 +14864,7 @@
12
- 345351
+ 347435
@@ -14484,7 +14880,7 @@
12
- 345351
+ 347435
@@ -14500,7 +14896,7 @@
12
- 344970
+ 3470542
@@ -14521,7 +14917,7 @@
12
- 317303
+ 3193892
@@ -14542,7 +14938,7 @@
12
- 318338
+ 320424
@@ -14558,7 +14954,7 @@
12
- 317303
+ 3193892
@@ -14579,7 +14975,7 @@
12
- 318338
+ 320424
@@ -14595,7 +14991,7 @@
12
- 317303
+ 3193892
@@ -14610,23 +15006,23 @@
builtintypes
- 7616
+ 7609id
- 7616
+ 7609name
- 7616
+ 7609kind
- 7616
+ 7609size
- 874
+ 873sign
@@ -14634,7 +15030,7 @@
alignment
- 624
+ 623
@@ -14648,7 +15044,7 @@
12
- 7616
+ 7609
@@ -14664,7 +15060,7 @@
12
- 7616
+ 7609
@@ -14680,7 +15076,7 @@
12
- 7616
+ 7609
@@ -14696,7 +15092,7 @@
12
- 7616
+ 7609
@@ -14712,7 +15108,7 @@
12
- 7616
+ 7609
@@ -14728,7 +15124,7 @@
12
- 7616
+ 7609
@@ -14744,7 +15140,7 @@
12
- 7616
+ 7609
@@ -14760,7 +15156,7 @@
12
- 7616
+ 7609
@@ -14776,7 +15172,7 @@
12
- 7616
+ 7609
@@ -14792,7 +15188,7 @@
12
- 7616
+ 7609
@@ -14808,7 +15204,7 @@
12
- 7616
+ 7609
@@ -14824,7 +15220,7 @@
12
- 7616
+ 7609
@@ -14840,7 +15236,7 @@
12
- 7616
+ 7609
@@ -14856,7 +15252,7 @@
12
- 7616
+ 7609
@@ -14872,7 +15268,7 @@
12
- 7616
+ 7609
@@ -15016,7 +15412,7 @@
34
- 624
+ 623
@@ -15261,7 +15657,7 @@
23
- 624
+ 623
@@ -15277,7 +15673,7 @@
34
- 624
+ 623
@@ -15287,23 +15683,23 @@
derivedtypes
- 3033685
+ 3030936id
- 3033685
+ 3030936name
- 1461902
+ 1460578kind
- 749
+ 748type_id
- 1948495
+ 1946730
@@ -15317,7 +15713,7 @@
12
- 3033685
+ 3030936
@@ -15333,7 +15729,7 @@
12
- 3033685
+ 3030936
@@ -15349,7 +15745,7 @@
12
- 3033685
+ 3030936
@@ -15365,17 +15761,17 @@
12
- 1345279
+ 1344061228
- 110004
+ 109905294302
- 6617
+ 6611
@@ -15391,7 +15787,7 @@
12
- 1461902
+ 1460578
@@ -15407,17 +15803,17 @@
12
- 1345404
+ 1344185228
- 109879
+ 109780294302
- 6617
+ 6611
@@ -15556,22 +15952,22 @@
12
- 1318684
+ 131748923
- 376213
+ 37587334
- 123365
+ 1232534137
- 130232
+ 130114
@@ -15587,22 +15983,22 @@
12
- 1320182
+ 131898623
- 376213
+ 37587334
- 121866
+ 1217564137
- 130232
+ 130114
@@ -15618,22 +16014,22 @@
12
- 1320557
+ 131936023
- 376838
+ 37649634
- 123614
+ 12350246
- 127485
+ 127370
@@ -15643,11 +16039,11 @@
pointerishsize
- 2249417
+ 2247379id
- 2249417
+ 2247379size
@@ -15669,7 +16065,7 @@
12
- 2249417
+ 2247379
@@ -15685,7 +16081,7 @@
12
- 2249417
+ 2247379
@@ -15769,23 +16165,23 @@
arraysizes
- 80661
+ 80588id
- 80661
+ 80588num_elements
- 17855
+ 17839bytesize
- 20227
+ 20209alignment
- 624
+ 623
@@ -15799,7 +16195,7 @@
12
- 80661
+ 80588
@@ -15815,7 +16211,7 @@
12
- 80661
+ 80588
@@ -15831,7 +16227,7 @@
12
- 80661
+ 80588
@@ -15852,7 +16248,7 @@
23
- 10863
+ 108533
@@ -15862,17 +16258,17 @@
45
- 3496
+ 349359
- 1498
+ 1497942
- 1373
+ 137256
@@ -15893,12 +16289,12 @@
12
- 11737
+ 1172623
- 3995
+ 39923
@@ -15908,7 +16304,7 @@
511
- 1123
+ 1122
@@ -15924,22 +16320,22 @@
12
- 11737
+ 1172623
- 3995
+ 399234
- 749
+ 74846
- 1373
+ 1372
@@ -15955,12 +16351,12 @@
12
- 624
+ 62323
- 12736
+ 127243
@@ -15970,17 +16366,17 @@
45
- 2746
+ 274457
- 1498
+ 1497717
- 1623
+ 162124
@@ -16001,17 +16397,17 @@
12
- 14609
+ 1459523
- 3621
+ 361736
- 1872
+ 18716
@@ -16032,17 +16428,17 @@
12
- 14858
+ 1484523
- 3371
+ 336835
- 1623
+ 16215
@@ -16208,15 +16604,15 @@
typedefbase
- 1762239
+ 1762360id
- 1762239
+ 1762360type_id
- 838004
+ 838037
@@ -16230,7 +16626,7 @@
12
- 1762239
+ 1762360
@@ -16246,22 +16642,22 @@
12
- 662556
+ 66255223
- 80927
+ 8094036
- 64154
+ 6417764526
- 30366
+ 30367
@@ -16271,7 +16667,7 @@
decltypes
- 814476
+ 814475id
@@ -16279,7 +16675,7 @@
expr
- 814476
+ 814475kind
@@ -16409,7 +16805,7 @@
12
- 814476
+ 814475
@@ -16425,7 +16821,7 @@
12
- 814476
+ 814475
@@ -16441,7 +16837,7 @@
12
- 814476
+ 814475
@@ -16457,7 +16853,7 @@
12
- 814476
+ 814475
@@ -16719,11 +17115,11 @@
type_operators
- 7960
+ 7961id
- 7960
+ 7961arg_type
@@ -16735,7 +17131,7 @@
base_type
- 5249
+ 5250
@@ -16749,7 +17145,7 @@
12
- 7960
+ 7961
@@ -16765,7 +17161,7 @@
12
- 7960
+ 7961
@@ -16781,7 +17177,7 @@
12
- 7960
+ 7961
@@ -17015,7 +17411,7 @@
12
- 4087
+ 40882
@@ -17035,15 +17431,15 @@
usertypes
- 4151525
+ 4151710id
- 4151525
+ 4151710name
- 918510
+ 918534kind
@@ -17061,7 +17457,7 @@
12
- 4151525
+ 4151710
@@ -17077,7 +17473,7 @@
12
- 4151525
+ 4151710
@@ -17093,22 +17489,22 @@
12
- 654243
+ 65426123
- 158665
+ 15866938
- 70566
+ 70567832669
- 35034
+ 35035
@@ -17124,12 +17520,12 @@
12
- 866765
+ 866789210
- 51744
+ 51745
@@ -17198,8 +17594,8 @@
10
- 166844
- 166845
+ 166851
+ 16685210
@@ -17281,11 +17677,11 @@
usertypesize
- 1363780
+ 1363817id
- 1363780
+ 1363817size
@@ -17307,7 +17703,7 @@
12
- 1363780
+ 1363817
@@ -17323,7 +17719,7 @@
12
- 1363780
+ 1363817
@@ -17517,26 +17913,26 @@
usertype_final
- 11487
+ 11477id
- 11487
+ 11477usertype_uuid
- 47628
+ 47716id
- 47628
+ 47716uuid
- 47148
+ 47237
@@ -17550,7 +17946,7 @@
12
- 47628
+ 47716
@@ -17566,7 +17962,7 @@
12
- 46669
+ 467582
@@ -17581,11 +17977,11 @@
usertype_alias_kind
- 1762239
+ 1762360id
- 1762239
+ 1762360alias_kind
@@ -17603,7 +17999,7 @@
12
- 1762239
+ 1762360
@@ -17617,8 +18013,8 @@
12
- 36900
- 36901
+ 36907
+ 3690810
@@ -17634,26 +18030,26 @@
nontype_template_parameters
- 766283
+ 766287id
- 766283
+ 766287type_template_type_constraint
- 27152
+ 27153id
- 13382
+ 13383constraint
- 26012
+ 26013
@@ -17667,7 +18063,7 @@
12
- 10219
+ 102202
@@ -17703,7 +18099,7 @@
12
- 24872
+ 248732
@@ -17718,15 +18114,15 @@
mangled_name
- 7859536
+ 7852416id
- 7859536
+ 7852416mangled_name
- 6370039
+ 6364268is_complete
@@ -17744,7 +18140,7 @@
12
- 7859536
+ 7852416
@@ -17760,7 +18156,7 @@
12
- 7859536
+ 7852416
@@ -17776,12 +18172,12 @@
12
- 6041648
+ 603617421120
- 328391
+ 328093
@@ -17797,7 +18193,7 @@
12
- 6370039
+ 6364268
@@ -17849,59 +18245,59 @@
is_pod_class
- 593757
+ 593760id
- 593757
+ 593760is_standard_layout_class
- 1124388
+ 1124418id
- 1124388
+ 1124418is_complete
- 1346258
+ 1346294id
- 1346258
+ 1346294is_class_template
- 232167
+ 232173id
- 232167
+ 232173class_instantiation
- 1126046
+ 1126076to
- 1123004
+ 1123034from
- 71801
+ 71803
@@ -17915,7 +18311,7 @@
12
- 1120871
+ 11209012
@@ -17936,12 +18332,12 @@
12
- 20490
+ 2050123
- 12885
+ 128863
@@ -17951,7 +18347,7 @@
45
- 4657
+ 46585
@@ -17961,7 +18357,7 @@
710
- 5724
+ 571410
@@ -17986,11 +18382,11 @@
class_template_argument
- 2898595
+ 2898672type_id
- 1367076
+ 1367112index
@@ -17998,7 +18394,7 @@
arg_type
- 822077
+ 822099
@@ -18012,27 +18408,27 @@
12
- 579347
+ 57936223
- 410278
+ 41028934
- 251042
+ 25104947
- 103097
+ 1031007113
- 23310
+ 23311
@@ -18048,22 +18444,22 @@
12
- 607886
+ 60790223
- 424283
+ 42429434
- 251876
+ 2518834113
- 83029
+ 83031
@@ -18171,22 +18567,22 @@
12
- 513703
+ 51371623
- 167643
+ 16764735
- 75086
+ 75088547
- 61736
+ 6173747
@@ -18207,17 +18603,17 @@
12
- 723795
+ 72381523
- 79913
+ 79915322
- 18367
+ 18368
@@ -18227,11 +18623,11 @@
class_template_argument_value
- 510083
+ 510086type_id
- 205811
+ 205812index
@@ -18239,7 +18635,7 @@
arg_value
- 509947
+ 509949
@@ -18253,7 +18649,7 @@
12
- 155798
+ 1557992
@@ -18279,7 +18675,7 @@
12
- 147928
+ 1479292
@@ -18422,7 +18818,7 @@
12
- 509811
+ 5098132
@@ -18443,7 +18839,7 @@
12
- 509947
+ 509949
@@ -18453,15 +18849,15 @@
is_proxy_class_for
- 48438
+ 48439id
- 48438
+ 48439templ_param_id
- 45766
+ 45767
@@ -18475,7 +18871,7 @@
12
- 48438
+ 48439
@@ -18491,7 +18887,7 @@
12
- 45047
+ 450482
@@ -18506,19 +18902,19 @@
type_mentions
- 5902897
+ 5903894id
- 5902897
+ 5903894type_id
- 276673
+ 276913location
- 5846582
+ 5847585kind
@@ -18536,7 +18932,7 @@
12
- 5902897
+ 5903894
@@ -18552,7 +18948,7 @@
12
- 5902897
+ 5903894
@@ -18568,7 +18964,7 @@
12
- 5902897
+ 5903894
@@ -18584,42 +18980,42 @@
12
- 136593
+ 13679523
- 31153
+ 3120334
- 11273
+ 1127245
- 14922
+ 1492157
- 19988
+ 19931712
- 21785
+ 218371228
- 21077
+ 2107428
- 8940
- 19879
+ 8941
+ 19876
@@ -18635,42 +19031,42 @@
12
- 136593
+ 13679523
- 31153
+ 3120334
- 11273
+ 1127245
- 14922
+ 1492157
- 19988
+ 19931712
- 21785
+ 218371228
- 21077
+ 2107428
- 8940
- 19879
+ 8941
+ 19876
@@ -18686,7 +19082,7 @@
12
- 276673
+ 276913
@@ -18702,12 +19098,12 @@
12
- 5800887
+ 580189624
- 45694
+ 45689
@@ -18723,12 +19119,12 @@
12
- 5800887
+ 580189624
- 45694
+ 45689
@@ -18744,7 +19140,7 @@
12
- 5846582
+ 5847585
@@ -18758,8 +19154,8 @@
12
- 108383
- 108384
+ 108414
+ 10841554
@@ -18774,8 +19170,8 @@
12
- 5080
- 5081
+ 5085
+ 508654
@@ -18790,8 +19186,8 @@
12
- 107349
- 107350
+ 107380
+ 10738154
@@ -18802,26 +19198,26 @@
is_function_template
- 1332543
+ 1331336id
- 1332543
+ 1331336function_instantiation
- 973628
+ 973633to
- 973628
+ 973633from
- 182644
+ 182645
@@ -18835,7 +19231,7 @@
12
- 973628
+ 973633
@@ -18851,12 +19247,12 @@
12
- 110588
+ 11058923
- 42790
+ 427913
@@ -18881,11 +19277,11 @@
function_template_argument
- 2484801
+ 2484813function_id
- 1453288
+ 1453296index
@@ -18893,7 +19289,7 @@
arg_type
- 298003
+ 298004
@@ -18907,17 +19303,17 @@
12
- 783011
+ 78301523
- 413156
+ 41315834
- 171810
+ 1718114
@@ -18938,17 +19334,17 @@
12
- 802158
+ 80216223
- 411249
+ 41125134
- 169630
+ 1696314
@@ -19091,7 +19487,7 @@
12
- 174774
+ 1747752
@@ -19137,7 +19533,7 @@
12
- 256813
+ 2568142
@@ -19157,11 +19553,11 @@
function_template_argument_value
- 452779
+ 452781function_id
- 196783
+ 196784index
@@ -19169,7 +19565,7 @@
arg_value
- 450087
+ 450090
@@ -19183,7 +19579,7 @@
12
- 151403
+ 1514042
@@ -19209,7 +19605,7 @@
12
- 144487
+ 1444882
@@ -19362,7 +19758,7 @@
12
- 447396
+ 4473982
@@ -19383,7 +19779,7 @@
12
- 450087
+ 450090
@@ -19393,26 +19789,26 @@
is_variable_template
- 58685
+ 58632id
- 58685
+ 58632variable_instantiation
- 423162
+ 422779to
- 423162
+ 422779from
- 35336
+ 35304
@@ -19426,7 +19822,7 @@
12
- 423162
+ 422779
@@ -19442,42 +19838,42 @@
12
- 15233
+ 1521923
- 3870
+ 386734
- 2372
+ 237046
- 2996
+ 299468
- 2247
+ 2245812
- 3121
+ 31181231
- 2746
+ 274432546
- 2746
+ 2744
@@ -19487,19 +19883,19 @@
variable_template_argument
- 769159
+ 768462variable_id
- 401311
+ 400947index
- 1997
+ 1996arg_type
- 256344
+ 256112
@@ -19513,22 +19909,22 @@
12
- 156703
+ 15656123
- 189917
+ 18974534
- 36460
+ 36427417
- 18230
+ 18213
@@ -19544,22 +19940,22 @@
12
- 171562
+ 17140723
- 180178
+ 18001434
- 33713
+ 33682417
- 15857
+ 15843
@@ -19575,7 +19971,7 @@
2829
- 874
+ 87334
@@ -19626,7 +20022,7 @@
12
- 874
+ 8732
@@ -19677,22 +20073,22 @@
12
- 175558
+ 17539923
- 44701
+ 4466036
- 21601
+ 215816206
- 14484
+ 14471
@@ -19708,17 +20104,17 @@
12
- 228000
+ 22779423
- 24722
+ 2470037
- 3621
+ 3617
@@ -19728,11 +20124,11 @@
variable_template_argument_value
- 19978
+ 19960variable_id
- 14858
+ 14845index
@@ -19740,7 +20136,7 @@
arg_value
- 19978
+ 19960
@@ -19754,12 +20150,12 @@
12
- 13360
+ 1334823
- 1498
+ 1497
@@ -19775,12 +20171,12 @@
12
- 10488
+ 1047923
- 3995
+ 39924
@@ -19863,7 +20259,7 @@
12
- 19978
+ 19960
@@ -19879,7 +20275,7 @@
12
- 19978
+ 19960
@@ -19889,15 +20285,15 @@
template_template_instantiation
- 6368
+ 6362to
- 4994
+ 4990from
- 1123
+ 1122
@@ -19911,12 +20307,12 @@
12
- 3621
+ 361723
- 1373
+ 1372
@@ -19932,7 +20328,7 @@
12
- 749
+ 7482
@@ -19957,7 +20353,7 @@
template_template_argument
- 9674
+ 9675type_id
@@ -20167,7 +20563,7 @@
12
- 9051
+ 90523
@@ -20455,11 +20851,11 @@
concept_instantiation
- 90430
+ 90433to
- 90430
+ 90433from
@@ -20477,7 +20873,7 @@
12
- 90430
+ 90433
@@ -20573,22 +20969,22 @@
is_type_constraint
- 36899
+ 36900concept_id
- 36899
+ 36900concept_template_argument
- 113043
+ 113047concept_id
- 76380
+ 76383index
@@ -20596,7 +20992,7 @@
arg_type
- 21429
+ 21430
@@ -20610,12 +21006,12 @@
12
- 46473
+ 4647523
- 24678
+ 246793
@@ -20636,17 +21032,17 @@
12
- 50088
+ 5009023
- 22376
+ 2237737
- 3915
+ 3916
@@ -20946,15 +21342,15 @@
routinetypes
- 604319
+ 604322id
- 604319
+ 604322return_type
- 283864
+ 283865
@@ -20968,7 +21364,7 @@
12
- 604319
+ 604322
@@ -20984,7 +21380,7 @@
12
- 234225
+ 2342262
@@ -21004,11 +21400,11 @@
routinetypeargs
- 1176788
+ 1176651routine
- 415119
+ 415070index
@@ -21016,7 +21412,7 @@
type_id
- 111595
+ 111582
@@ -21030,32 +21426,32 @@
12
- 82511
+ 8250223
- 126028
+ 12601334
- 107456
+ 10744345
- 49289
+ 4928357
- 33168
+ 33164719
- 16665
+ 16663
@@ -21071,27 +21467,27 @@
12
- 88502
+ 8849223
- 138663
+ 13864734
- 114209
+ 11419645
- 40738
+ 40733510
- 32895
+ 3289110
@@ -21289,42 +21685,42 @@
12
- 33222
+ 3321823
- 15195
+ 1519334
- 13234
+ 1323345
- 9803
+ 980256
- 6372
+ 637168
- 9476
+ 9475813
- 9531
+ 95291326
- 8659
+ 865826
@@ -21345,22 +21741,22 @@
12
- 78917
+ 7890823
- 17537
+ 1753535
- 9476
+ 9475517
- 5664
+ 5663
@@ -21370,11 +21766,11 @@
ptrtomembers
- 9727
+ 9728id
- 9727
+ 9728type_id
@@ -21396,7 +21792,7 @@
12
- 9727
+ 9728
@@ -21412,7 +21808,7 @@
12
- 9727
+ 9728
@@ -21526,15 +21922,15 @@
specifiers
- 7741
+ 7734id
- 7741
+ 7734str
- 7741
+ 7734
@@ -21548,7 +21944,7 @@
12
- 7741
+ 7734
@@ -21564,7 +21960,7 @@
12
- 7741
+ 7734
@@ -21574,15 +21970,15 @@
typespecifiers
- 854940
+ 854272type_id
- 847448
+ 849128spec_id
- 1623
+ 95
@@ -21596,12 +21992,12 @@
12
- 839957
+ 84398423
- 7491
+ 5143
@@ -21615,69 +22011,49 @@
12
- 1
- 2
- 124
-
-
- 2
- 3
- 124
-
-
- 16
- 17
- 124
-
-
- 17
- 18
- 124
-
-
- 24
- 25
- 124
+ 168
+ 169
+ 10
- 44
- 45
- 124
+ 215
+ 216
+ 10
- 49
- 50
- 124
+ 225
+ 226
+ 10
- 51
- 52
- 124
+ 533
+ 534
+ 10
- 112
- 113
- 124
+ 821
+ 822
+ 10
- 199
- 200
- 124
+ 1568
+ 1569
+ 10
- 325
- 326
- 124
+ 4195
+ 4196
+ 10
- 545
- 546
- 124
+ 18295
+ 18296
+ 10
- 5462
- 5463
- 124
+ 54858
+ 54859
+ 10
@@ -21687,15 +22063,15 @@
funspecifiers
- 9723250
+ 9714441func_id
- 4012490
+ 4008855spec_id
- 2372
+ 2370
@@ -21709,27 +22085,27 @@
12
- 1528454
+ 152707023
- 506696
+ 50623734
- 1037865
+ 103692545
- 693492
+ 69286358
- 245981
+ 245758
@@ -21845,15 +22221,15 @@
varspecifiers
- 3078136
+ 3075347var_id
- 2316968
+ 2314869spec_id
- 1123
+ 1122
@@ -21867,17 +22243,17 @@
12
- 1659561
+ 165805823
- 554144
+ 55364235
- 103262
+ 103168
@@ -21943,15 +22319,15 @@
explicit_specifier_exprs
- 41329
+ 41292func_id
- 41329
+ 41292constant
- 41329
+ 41292
@@ -21965,7 +22341,7 @@
12
- 41329
+ 41292
@@ -21981,7 +22357,7 @@
12
- 41329
+ 41292
@@ -21991,11 +22367,11 @@
attributes
- 654409
+ 653817id
- 654409
+ 653817kind
@@ -22003,7 +22379,7 @@
name
- 2122
+ 2120name_space
@@ -22011,7 +22387,7 @@
location
- 648291
+ 647704
@@ -22025,7 +22401,7 @@
12
- 654409
+ 653817
@@ -22041,7 +22417,7 @@
12
- 654409
+ 653817
@@ -22057,7 +22433,7 @@
12
- 654409
+ 653817
@@ -22073,7 +22449,7 @@
12
- 654409
+ 653817
@@ -22269,7 +22645,7 @@
12
- 1872
+ 18712
@@ -22290,7 +22666,7 @@
12
- 2122
+ 2120
@@ -22476,12 +22852,12 @@
12
- 642423
+ 64184125
- 5868
+ 5863
@@ -22497,7 +22873,7 @@
12
- 648291
+ 647704
@@ -22513,12 +22889,12 @@
12
- 643172
+ 64258923
- 5119
+ 5114
@@ -22534,7 +22910,7 @@
12
- 648291
+ 647704
@@ -23243,15 +23619,15 @@
attribute_arg_constant
- 71875
+ 71856arg
- 71875
+ 71856constant
- 71875
+ 71856
@@ -23265,7 +23641,7 @@
12
- 71875
+ 71856
@@ -23281,7 +23657,7 @@
12
- 71875
+ 71856
@@ -23392,15 +23768,15 @@
typeattributes
- 96394
+ 96307type_id
- 94646
+ 94560spec_id
- 32464
+ 32435
@@ -23414,12 +23790,12 @@
12
- 92898
+ 9281423
- 1748
+ 1746
@@ -23435,17 +23811,17 @@
12
- 27969
+ 2794429
- 2497
+ 24951158
- 1997
+ 1996
@@ -23455,15 +23831,15 @@
funcattributes
- 844327
+ 843562func_id
- 799751
+ 799026spec_id
- 617325
+ 616766
@@ -23477,12 +23853,12 @@
12
- 759669
+ 75898127
- 40081
+ 40044
@@ -23498,12 +23874,12 @@
12
- 572249
+ 5717312213
- 45075
+ 45034
@@ -23702,15 +24078,15 @@
unspecifiedtype
- 7179404
+ 7172900type_id
- 7179404
+ 7172900unspecified_type_id
- 3965916
+ 3962323
@@ -23724,7 +24100,7 @@
12
- 7179404
+ 7172900
@@ -23740,22 +24116,22 @@
12
- 2482787
+ 248053723
- 1117778
+ 111676537
- 302918
+ 3026447537
- 62431
+ 62375
@@ -23765,19 +24141,19 @@
member
- 4193417
+ 4189618parent
- 543780
+ 543288index
- 29717
+ 29690child
- 4188797
+ 4185003
@@ -23791,57 +24167,57 @@
12
- 129108
+ 12899123
- 83408
+ 8333334
- 32464
+ 3243545
- 44950
+ 4491056
- 42453
+ 4241567
- 33962
+ 3393279
- 42328
+ 42290913
- 41204
+ 411671318
- 41329
+ 412921842
- 40830
+ 4079342239
- 11737
+ 11726
@@ -23857,57 +24233,57 @@
12
- 128859
+ 12874223
- 83533
+ 8345834
- 32214
+ 3218545
- 45075
+ 4503456
- 42578
+ 4253967
- 32839
+ 3280979
- 42703
+ 42664913
- 41579
+ 415411318
- 41454
+ 414171842
- 40955
+ 4091842265
- 11986
+ 11976
@@ -23923,57 +24299,57 @@
12
- 6492
+ 648723
- 2622
+ 261938
- 1872
+ 1871910
- 2871
+ 28691019
- 2247
+ 22451926
- 2247
+ 22452636
- 2497
+ 24953650
- 2247
+ 224554141
- 2247
+ 2245150468
- 2247
+ 22454804310
- 2122
+ 2120
@@ -23989,57 +24365,57 @@
12
- 5493
+ 548923
- 3621
+ 361739
- 1872
+ 1871910
- 2871
+ 28691020
- 2372
+ 23702028
- 2372
+ 23702837
- 2372
+ 23703756
- 2372
+ 237058156
- 2247
+ 2245163527
- 2247
+ 22455474330
- 1872
+ 1871
@@ -24055,7 +24431,7 @@
12
- 4188797
+ 4185003
@@ -24071,12 +24447,12 @@
12
- 4184177
+ 418038723
- 4619
+ 4615
@@ -24094,7 +24470,7 @@
parent
- 71340
+ 71341
@@ -24149,15 +24525,15 @@
derivations
- 476900
+ 476902derivation
- 476900
+ 476902sub
- 455164
+ 455166index
@@ -24165,11 +24541,11 @@
super
- 235554
+ 235555location
- 35397
+ 35398
@@ -24183,7 +24559,7 @@
12
- 476900
+ 476902
@@ -24199,7 +24575,7 @@
12
- 476900
+ 476902
@@ -24215,7 +24591,7 @@
12
- 476900
+ 476902
@@ -24231,7 +24607,7 @@
12
- 476900
+ 476902
@@ -24247,7 +24623,7 @@
12
- 438640
+ 4386422
@@ -24268,7 +24644,7 @@
12
- 438640
+ 4386422
@@ -24289,7 +24665,7 @@
12
- 438640
+ 4386422
@@ -24310,7 +24686,7 @@
12
- 438640
+ 4386422
@@ -24470,7 +24846,7 @@
12
- 225742
+ 2257432
@@ -24491,7 +24867,7 @@
12
- 225742
+ 2257432
@@ -24512,7 +24888,7 @@
12
- 235111
+ 2351122
@@ -24533,7 +24909,7 @@
12
- 230205
+ 2302062
@@ -24626,7 +25002,7 @@
12
- 35397
+ 35398
@@ -24667,11 +25043,11 @@
derspecifiers
- 478671
+ 478674der_id
- 476457
+ 476459spec_id
@@ -24689,7 +25065,7 @@
12
- 474242
+ 4742452
@@ -24735,11 +25111,11 @@
direct_base_offsets
- 449985
+ 449987der_id
- 449985
+ 449987offset
@@ -24757,7 +25133,7 @@
12
- 449985
+ 449987
@@ -24954,11 +25330,11 @@
frienddecls
- 700462
+ 700465id
- 700462
+ 700465type_id
@@ -24984,7 +25360,7 @@
12
- 700462
+ 700465
@@ -25000,358 +25376,7 @@
12
- 700462
-
-
-
-
-
-
- id
- location
-
-
- 12
-
-
- 1
- 2
- 700462
-
-
-
-
-
-
- type_id
- id
-
-
- 12
-
-
- 1
- 2
- 6166
-
-
- 2
- 3
- 13968
-
-
- 3
- 7
- 3577
-
-
- 7
- 12
- 3440
-
-
- 12
- 20
- 3645
-
-
- 20
- 32
- 3304
-
-
- 33
- 50
- 3781
-
-
- 50
- 80
- 3781
-
-
- 101
- 120
- 749
-
-
-
-
-
-
- type_id
- decl_id
-
-
- 12
-
-
- 1
- 2
- 6166
-
-
- 2
- 3
- 13968
-
-
- 3
- 7
- 3577
-
-
- 7
- 12
- 3440
-
-
- 12
- 20
- 3645
-
-
- 20
- 32
- 3304
-
-
- 33
- 50
- 3781
-
-
- 50
- 80
- 3781
-
-
- 101
- 120
- 749
-
-
-
-
-
-
- type_id
- location
-
-
- 12
-
-
- 1
- 2
- 41053
-
-
- 2
- 13
- 1362
-
-
-
-
-
-
- decl_id
- id
-
-
- 12
-
-
- 1
- 2
- 48071
-
-
- 2
- 3
- 5962
-
-
- 3
- 8
- 5996
-
-
- 8
- 15
- 6064
-
-
- 15
- 40
- 6064
-
-
- 40
- 164
- 5689
-
-
-
-
-
-
- decl_id
- type_id
-
-
- 12
-
-
- 1
- 2
- 48071
-
-
- 2
- 3
- 5962
-
-
- 3
- 8
- 5996
-
-
- 8
- 15
- 6064
-
-
- 15
- 40
- 6064
-
-
- 40
- 164
- 5689
-
-
-
-
-
-
- decl_id
- location
-
-
- 12
-
-
- 1
- 2
- 77166
-
-
- 2
- 5
- 681
-
-
-
-
-
-
- location
- id
-
-
- 12
-
-
- 1
- 2
- 5723
-
-
- 2
- 20371
- 374
-
-
-
-
-
-
- location
- type_id
-
-
- 12
-
-
- 1
- 2
- 5962
-
-
- 2
- 1148
- 136
-
-
-
-
-
-
- location
- decl_id
-
-
- 12
-
-
- 1
- 2
- 5757
-
-
- 2
- 2132
- 340
-
-
-
-
-
-
-
-
- comments
- 11241965
-
-
- id
- 11241965
-
-
- contents
- 4306669
-
-
- location
- 11241965
-
-
-
-
- id
- contents
-
-
- 12
-
-
- 1
- 2
- 11241965
+ 700465
@@ -25367,14 +25392,14 @@
12
- 11241965
+ 700465
- contents
+ type_idid
@@ -25383,17 +25408,368 @@
12
- 3932328
+ 6166
+
+
+ 2
+ 3
+ 13968
+
+
+ 3
+ 7
+ 3577
+
+
+ 7
+ 12
+ 3441
+
+
+ 12
+ 20
+ 3645
+
+
+ 20
+ 32
+ 3304
+
+
+ 33
+ 50
+ 3781
+
+
+ 50
+ 80
+ 3781
+
+
+ 101
+ 120
+ 749
+
+
+
+
+
+
+ type_id
+ decl_id
+
+
+ 12
+
+
+ 1
+ 2
+ 61662
+ 3
+ 13968
+
+
+ 37
- 330014
+ 35777
+ 12
+ 3441
+
+
+ 12
+ 20
+ 3645
+
+
+ 20
+ 32
+ 3304
+
+
+ 33
+ 50
+ 3781
+
+
+ 50
+ 80
+ 3781
+
+
+ 101
+ 120
+ 749
+
+
+
+
+
+
+ type_id
+ location
+
+
+ 12
+
+
+ 1
+ 2
+ 41053
+
+
+ 2
+ 13
+ 1362
+
+
+
+
+
+
+ decl_id
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 48071
+
+
+ 2
+ 3
+ 5962
+
+
+ 3
+ 8
+ 5996
+
+
+ 8
+ 15
+ 6064
+
+
+ 15
+ 40
+ 6064
+
+
+ 40
+ 164
+ 5689
+
+
+
+
+
+
+ decl_id
+ type_id
+
+
+ 12
+
+
+ 1
+ 2
+ 48071
+
+
+ 2
+ 3
+ 5962
+
+
+ 3
+ 8
+ 5996
+
+
+ 8
+ 15
+ 6064
+
+
+ 15
+ 40
+ 6064
+
+
+ 40
+ 164
+ 5689
+
+
+
+
+
+
+ decl_id
+ location
+
+
+ 12
+
+
+ 1
+ 2
+ 77167
+
+
+ 2
+ 5
+ 681
+
+
+
+
+
+
+ location
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 5723
+
+
+ 2
+ 20371
+ 374
+
+
+
+
+
+
+ location
+ type_id
+
+
+ 12
+
+
+ 1
+ 2
+ 5962
+
+
+ 2
+ 1148
+ 136
+
+
+
+
+
+
+ location
+ decl_id
+
+
+ 12
+
+
+ 1
+ 2
+ 5757
+
+
+ 2
+ 2132
+ 340
+
+
+
+
+
+
+
+
+ comments
+ 11233402
+
+
+ id
+ 11233402
+
+
+ contents
+ 4303640
+
+
+ location
+ 11233402
+
+
+
+
+ id
+ contents
+
+
+ 12
+
+
+ 1
+ 2
+ 11233402
+
+
+
+
+
+
+ id
+ location
+
+
+ 12
+
+
+ 1
+ 2
+ 11233402
+
+
+
+
+
+
+ contents
+ id
+
+
+ 12
+
+
+ 1
+ 2
+ 3928890
+
+
+ 2
+ 6
+ 322978
+
+
+ 634447
- 44326
+ 51771
@@ -25409,17 +25785,17 @@
12
- 3932328
+ 39288902
- 7
- 330014
+ 6
+ 322978
- 7
+ 634447
- 44326
+ 51771
@@ -25435,7 +25811,7 @@
12
- 11241965
+ 11233402
@@ -25451,7 +25827,7 @@
12
- 11241965
+ 11233402
@@ -25461,15 +25837,15 @@
commentbinding
- 3916720
+ 3914793id
- 3352211
+ 3350796element
- 3751026
+ 3749249
@@ -25483,12 +25859,12 @@
12
- 3290529
+ 328917021706
- 61682
+ 61626
@@ -25504,12 +25880,12 @@
12
- 3585332
+ 358370523
- 165693
+ 165543
@@ -25519,15 +25895,15 @@
exprconv
- 9633088
+ 9633084converted
- 9632982
+ 9632979conversion
- 9633088
+ 9633084
@@ -25541,7 +25917,7 @@
12
- 9632877
+ 96328732
@@ -25562,7 +25938,7 @@
12
- 9633088
+ 9633084
@@ -25572,22 +25948,22 @@
compgenerated
- 9891529
+ 9892394id
- 9891529
+ 9892394synthetic_destructor_call
- 1671638
+ 1671701element
- 1244918
+ 1244965i
@@ -25595,7 +25971,7 @@
destructor_call
- 1671638
+ 1671701
@@ -25609,17 +25985,17 @@
12
- 828654
+ 82868523
- 409464
+ 409480319
- 6798
+ 6799
@@ -25635,17 +26011,17 @@
12
- 828654
+ 82868523
- 409464
+ 409480319
- 6798
+ 6799
@@ -25793,7 +26169,7 @@
12
- 1671638
+ 1671701
@@ -25809,7 +26185,7 @@
12
- 1671638
+ 1671701
@@ -25888,15 +26264,15 @@
namespacembrs
- 2039521
+ 2037673parentid
- 3995
+ 3992memberid
- 2039521
+ 2037673
@@ -25925,7 +26301,7 @@
45
- 624
+ 6235
@@ -25986,7 +26362,7 @@
12
- 2039521
+ 2037673
@@ -25996,11 +26372,11 @@
exprparents
- 19454218
+ 19454210expr_id
- 19454218
+ 19454210child_index
@@ -26008,7 +26384,7 @@
parent_id
- 12939988
+ 12939983
@@ -26022,7 +26398,7 @@
12
- 19454218
+ 19454210
@@ -26038,7 +26414,7 @@
12
- 19454218
+ 19454210
@@ -26156,12 +26532,12 @@
12
- 7394757
+ 739475423
- 5082680
+ 50826783
@@ -26182,12 +26558,12 @@
12
- 7394757
+ 739475423
- 5082680
+ 50826783
@@ -26202,22 +26578,22 @@
expr_isload
- 6909475
+ 6909332expr_id
- 6909475
+ 6909332conversionkinds
- 6050433
+ 6050443expr_id
- 6050433
+ 6050443kind
@@ -26235,7 +26611,7 @@
12
- 6050433
+ 6050443
@@ -26259,8 +26635,8 @@
1
- 7362
- 7363
+ 7371
+ 73721
@@ -26279,8 +26655,8 @@
1
- 5831534
- 5831535
+ 5831535
+ 58315361
@@ -26291,11 +26667,11 @@
iscall
- 5802603
+ 5802824caller
- 5802603
+ 5802824kind
@@ -26313,7 +26689,7 @@
12
- 5802603
+ 5802824
@@ -26349,11 +26725,11 @@
numtemplatearguments
- 627938
+ 627369expr_id
- 627938
+ 627369num
@@ -26371,7 +26747,7 @@
12
- 627938
+ 627369
@@ -26455,23 +26831,23 @@
namequalifiers
- 3041863
+ 3041979id
- 3041863
+ 3041979qualifiableelement
- 3041863
+ 3041979qualifyingelement
- 47485
+ 47486location
- 552436
+ 552457
@@ -26485,7 +26861,7 @@
12
- 3041863
+ 3041979
@@ -26501,7 +26877,7 @@
12
- 3041863
+ 3041979
@@ -26517,7 +26893,7 @@
12
- 3041863
+ 3041979
@@ -26533,7 +26909,7 @@
12
- 3041863
+ 3041979
@@ -26549,7 +26925,7 @@
12
- 3041863
+ 3041979
@@ -26565,7 +26941,7 @@
12
- 3041863
+ 3041979
@@ -26581,12 +26957,12 @@
12
- 31541
+ 3154323
- 8175
+ 81763
@@ -26617,12 +26993,12 @@
12
- 31541
+ 3154323
- 8175
+ 81763
@@ -26653,7 +27029,7 @@
12
- 34403
+ 344042
@@ -26684,22 +27060,22 @@
12
- 79134
+ 7913726
- 38104
+ 3810567
- 398986
+ 3990017192
- 36210
+ 36212
@@ -26715,22 +27091,22 @@
12
- 79134
+ 7913726
- 38104
+ 3810567
- 398986
+ 3990017192
- 36210
+ 36212
@@ -26746,22 +27122,22 @@
12
- 111537
+ 11154124
- 13296
+ 1329745
- 415295
+ 415311533
- 12306
+ 12307
@@ -26771,15 +27147,15 @@
varbind
- 8254632
+ 8254629expr
- 8254632
+ 8254629var
- 1050376
+ 1050375
@@ -26793,7 +27169,7 @@
12
- 8254632
+ 8254629
@@ -26829,7 +27205,7 @@
56
- 83151
+ 831506
@@ -26864,15 +27240,15 @@
funbind
- 5812199
+ 5812528expr
- 5809833
+ 5810054fun
- 275916
+ 275948
@@ -26886,12 +27262,12 @@
12
- 5807466
+ 580757923
- 2366
+ 2474
@@ -26907,27 +27283,27 @@
12
- 181420
+ 18144823
- 38835
+ 3883734
- 17212
+ 1719148
- 22720
+ 22742837798
- 15727
+ 15728
@@ -26937,11 +27313,11 @@
expr_allocator
- 45243
+ 45244expr
- 45243
+ 45244func
@@ -26963,7 +27339,7 @@
12
- 45243
+ 45244
@@ -26979,7 +27355,7 @@
12
- 45243
+ 45244
@@ -27210,15 +27586,15 @@
expr_cond_guard
- 897880
+ 897879cond
- 897880
+ 897879guard
- 897880
+ 897879
@@ -27232,7 +27608,7 @@
12
- 897880
+ 897879
@@ -27248,7 +27624,7 @@
12
- 897880
+ 897879
@@ -27306,15 +27682,15 @@
expr_cond_false
- 897880
+ 897879cond
- 897880
+ 897879false
- 897880
+ 897879
@@ -27328,7 +27704,7 @@
12
- 897880
+ 897879
@@ -27344,7 +27720,7 @@
12
- 897880
+ 897879
@@ -27354,11 +27730,11 @@
values
- 13474606
+ 13474601id
- 13474606
+ 13474601str
@@ -27376,7 +27752,7 @@
12
- 13474606
+ 13474601
@@ -27422,11 +27798,11 @@
valuetext
- 6647578
+ 6647456id
- 6647578
+ 6647456text
@@ -27444,7 +27820,7 @@
12
- 6647578
+ 6647456
@@ -27485,15 +27861,15 @@
valuebind
- 13583189
+ 13583183val
- 13474606
+ 13474601expr
- 13583189
+ 13583183
@@ -27507,7 +27883,7 @@
12
- 13384052
+ 133840462
@@ -27528,7 +27904,7 @@
12
- 13583189
+ 13583183
@@ -27538,15 +27914,15 @@
fieldoffsets
- 1496815
+ 1497674id
- 1496815
+ 1497674byteoffset
- 31370
+ 31367bitoffset
@@ -27564,7 +27940,7 @@
12
- 1496815
+ 1497674
@@ -27580,7 +27956,7 @@
12
- 1496815
+ 1497674
@@ -27596,7 +27972,7 @@
12
- 17700
+ 176982
@@ -27611,7 +27987,7 @@
512
- 2614
+ 261312
@@ -27625,7 +28001,7 @@
250
- 5947
+ 59501089
@@ -27642,7 +28018,7 @@
12
- 30390
+ 303862
@@ -27696,8 +28072,8 @@
54
- 27127
- 27128
+ 27146
+ 2714754
@@ -27739,19 +28115,19 @@
bitfield
- 30341
+ 30314id
- 30341
+ 30314bits
- 3496
+ 3493declared_bits
- 3496
+ 3493
@@ -27765,7 +28141,7 @@
12
- 30341
+ 30314
@@ -27781,7 +28157,7 @@
12
- 30341
+ 30314
@@ -27802,7 +28178,7 @@
23
- 749
+ 7483
@@ -27848,7 +28224,7 @@
12
- 3496
+ 3493
@@ -27869,7 +28245,7 @@
23
- 749
+ 7483
@@ -27915,7 +28291,7 @@
12
- 3496
+ 3493
@@ -27925,23 +28301,23 @@
initialisers
- 2251035
+ 2251321init
- 2251035
+ 2251321var
- 980971
+ 981178expr
- 2251035
+ 2251321location
- 516371
+ 516961
@@ -27955,7 +28331,7 @@
12
- 2251035
+ 2251321
@@ -27971,7 +28347,7 @@
12
- 2251035
+ 2251321
@@ -27987,7 +28363,7 @@
12
- 2251035
+ 2251321
@@ -28003,17 +28379,17 @@
12
- 870556
+ 870758215
- 37441
+ 374481625
- 72973
+ 72972
@@ -28029,17 +28405,17 @@
12
- 870556
+ 870758215
- 37441
+ 374481625
- 72973
+ 72972
@@ -28055,7 +28431,7 @@
12
- 980963
+ 9811702
@@ -28076,7 +28452,7 @@
12
- 2251035
+ 2251321
@@ -28092,7 +28468,7 @@
12
- 2251035
+ 2251321
@@ -28108,7 +28484,7 @@
12
- 2251035
+ 2251321
@@ -28124,22 +28500,22 @@
12
- 414356
+ 41511123
- 33606
+ 33614313
- 42250
+ 4207013
- 111911
- 26157
+ 111925
+ 26165
@@ -28155,17 +28531,17 @@
12
- 443657
+ 44441223
- 34516
+ 345243
- 12237
- 38196
+ 12238
+ 38025
@@ -28181,22 +28557,22 @@
12
- 414356
+ 41511123
- 33606
+ 33614313
- 42250
+ 4207013
- 111911
- 26157
+ 111925
+ 26165
@@ -28206,26 +28582,26 @@
braced_initialisers
- 68468
+ 68438init
- 68468
+ 68438expr_ancestor
- 1677619
+ 1677683exp
- 1677619
+ 1677683ancestor
- 839627
+ 839659
@@ -28239,7 +28615,7 @@
12
- 1677619
+ 1677683
@@ -28255,12 +28631,12 @@
12
- 17083
+ 1708423
- 812474
+ 8125053
@@ -28275,11 +28651,11 @@
exprs
- 25210577
+ 25210567id
- 25210577
+ 25210567kind
@@ -28287,7 +28663,7 @@
location
- 10582671
+ 10585854
@@ -28301,7 +28677,7 @@
12
- 25210577
+ 25210567
@@ -28317,7 +28693,7 @@
12
- 25210577
+ 25210567
@@ -28477,8 +28853,8 @@
109
- 224080
- 224081
+ 224225
+ 22422621
@@ -28495,7 +28871,7 @@
12
- 8900701
+ 89038852
@@ -28505,7 +28881,7 @@
316
- 797199
+ 79719816
@@ -28526,12 +28902,12 @@
12
- 9040103
+ 904328723
- 774273
+ 7742723
@@ -28546,15 +28922,15 @@
expr_reuse
- 847007
+ 847039reuse
- 847007
+ 847039original
- 847007
+ 847039value_category
@@ -28572,7 +28948,7 @@
12
- 847007
+ 847039
@@ -28588,7 +28964,7 @@
12
- 847007
+ 847039
@@ -28604,7 +28980,7 @@
12
- 847007
+ 847039
@@ -28620,7 +28996,7 @@
12
- 847007
+ 847039
@@ -28672,11 +29048,11 @@
expr_types
- 25210577
+ 25210567id
- 25210577
+ 25210567typeid
@@ -28698,7 +29074,7 @@
12
- 25210577
+ 25210567
@@ -28714,7 +29090,7 @@
12
- 25210577
+ 25210567
@@ -28859,11 +29235,11 @@
new_allocated_type
- 46197
+ 46198expr
- 46197
+ 46198type_id
@@ -28881,7 +29257,7 @@
12
- 46197
+ 46198
@@ -30316,15 +30692,15 @@
condition_decl_bind
- 408905
+ 408920expr
- 408905
+ 408920decl
- 408905
+ 408920
@@ -30338,7 +30714,7 @@
12
- 408905
+ 408920
@@ -30354,7 +30730,7 @@
12
- 408905
+ 408920
@@ -30422,15 +30798,15 @@
uuidof_bind
- 26588
+ 26677expr
- 26588
+ 26677type_id
- 26336
+ 26425
@@ -30444,7 +30820,7 @@
12
- 26588
+ 26677
@@ -30460,7 +30836,7 @@
12
- 26125
+ 262142
@@ -30475,11 +30851,11 @@
sizeof_bind
- 242027
+ 242026expr
- 242027
+ 242026type_id
@@ -30497,7 +30873,7 @@
12
- 242027
+ 242026
@@ -30852,11 +31228,11 @@
lambda_capture
- 31966
+ 31965id
- 31966
+ 31965lambda
@@ -30868,7 +31244,7 @@
field
- 31966
+ 31965captured_by_reference
@@ -30894,7 +31270,7 @@
12
- 31966
+ 31965
@@ -30910,7 +31286,7 @@
12
- 31966
+ 31965
@@ -30926,7 +31302,7 @@
12
- 31966
+ 31965
@@ -30942,7 +31318,7 @@
12
- 31966
+ 31965
@@ -30958,7 +31334,7 @@
12
- 31966
+ 31965
@@ -30974,7 +31350,7 @@
12
- 31966
+ 31965
@@ -31602,7 +31978,7 @@
12
- 31966
+ 31965
@@ -31618,7 +31994,7 @@
12
- 31966
+ 31965
@@ -31634,7 +32010,7 @@
12
- 31966
+ 31965
@@ -31650,7 +32026,7 @@
12
- 31966
+ 31965
@@ -31666,7 +32042,7 @@
12
- 31966
+ 31965
@@ -31682,7 +32058,7 @@
12
- 31966
+ 31965
@@ -31992,7 +32368,7 @@
12
- 17254
+ 172532
@@ -32196,11 +32572,11 @@
stmts
- 6368968
+ 6368836id
- 6368968
+ 6368836kind
@@ -32208,7 +32584,7 @@
location
- 2684538
+ 2684483
@@ -32222,7 +32598,7 @@
12
- 6368968
+ 6368836
@@ -32238,7 +32614,7 @@
12
- 6368968
+ 6368836
@@ -32476,22 +32852,22 @@
12
- 2225039
+ 222499323
- 182234
+ 182231310
- 202178
+ 202173101789
- 75085
+ 75084
@@ -32507,12 +32883,12 @@
12
- 2601581
+ 2601527210
- 82957
+ 82955
@@ -32725,15 +33101,15 @@
if_else
- 437090
+ 437107if_stmt
- 437090
+ 437107else_id
- 437090
+ 437107
@@ -32747,7 +33123,7 @@
12
- 437090
+ 437107
@@ -32763,7 +33139,7 @@
12
- 437090
+ 437107
@@ -32821,15 +33197,15 @@
constexpr_if_then
- 106134
+ 106037constexpr_if_stmt
- 106134
+ 106037then_id
- 106134
+ 106037
@@ -32843,7 +33219,7 @@
12
- 106134
+ 106037
@@ -32859,7 +33235,7 @@
12
- 106134
+ 106037
@@ -32869,15 +33245,15 @@
constexpr_if_else
- 76166
+ 76097constexpr_if_stmt
- 76166
+ 76097else_id
- 76166
+ 76097
@@ -32891,7 +33267,7 @@
12
- 76166
+ 76097
@@ -32907,7 +33283,7 @@
12
- 76166
+ 76097
@@ -33157,11 +33533,11 @@
switch_case
- 836120
+ 836152switch_stmt
- 411852
+ 411868index
@@ -33169,7 +33545,7 @@
case_id
- 836120
+ 836152
@@ -33188,7 +33564,7 @@
23
- 408969
+ 4089853
@@ -33214,7 +33590,7 @@
23
- 408969
+ 4089853
@@ -33377,7 +33753,7 @@
12
- 836120
+ 836152
@@ -33393,7 +33769,7 @@
12
- 836120
+ 836152
@@ -33403,15 +33779,15 @@
switch_body
- 411852
+ 411868switch_stmt
- 411852
+ 411868body_id
- 411852
+ 411868
@@ -33425,7 +33801,7 @@
12
- 411852
+ 411868
@@ -33441,7 +33817,7 @@
12
- 411852
+ 411868
@@ -33643,11 +34019,11 @@
stmtparents
- 5628380
+ 5628263id
- 5628380
+ 5628263index
@@ -33655,7 +34031,7 @@
parent
- 2381490
+ 2381441
@@ -33669,7 +34045,7 @@
12
- 5628380
+ 5628263
@@ -33685,7 +34061,7 @@
12
- 5628380
+ 5628263
@@ -33721,7 +34097,7 @@
78
- 1316
+ 13158
@@ -33782,7 +34158,7 @@
78
- 1316
+ 13158
@@ -33823,27 +34199,27 @@
12
- 1359015
+ 135898723
- 517378
+ 51736834
- 151519
+ 15151646
- 155727
+ 155724616
- 178871
+ 17886816
@@ -33864,27 +34240,27 @@
12
- 1359015
+ 135898723
- 517378
+ 51736834
- 151519
+ 15151646
- 155727
+ 155724616
- 178871
+ 17886816
@@ -33899,22 +34275,22 @@
ishandler
- 43746
+ 43781block
- 43746
+ 43781stmt_decl_bind
- 725885
+ 725870stmt
- 715316
+ 715301num
@@ -33922,7 +34298,7 @@
decl
- 725885
+ 725870
@@ -33936,7 +34312,7 @@
12
- 707850
+ 7078362
@@ -33957,7 +34333,7 @@
12
- 707850
+ 7078362
@@ -34090,7 +34466,7 @@
12
- 725885
+ 725870
@@ -34106,7 +34482,7 @@
12
- 725885
+ 725870
@@ -34116,11 +34492,11 @@
stmt_decl_entry_bind
- 725885
+ 725870stmt
- 715316
+ 715301num
@@ -34128,7 +34504,7 @@
decl_entry
- 725885
+ 725870
@@ -34142,7 +34518,7 @@
12
- 707850
+ 7078362
@@ -34163,7 +34539,7 @@
12
- 707850
+ 7078362
@@ -34296,7 +34672,7 @@
12
- 725885
+ 725870
@@ -34312,7 +34688,7 @@
12
- 725885
+ 725870
@@ -34322,15 +34698,15 @@
blockscope
- 1644952
+ 1644335block
- 1644952
+ 1644335enclosing
- 1428064
+ 1427145
@@ -34344,7 +34720,7 @@
12
- 1644952
+ 1644335
@@ -34360,17 +34736,17 @@
12
- 1295584
+ 129453524
- 117122
+ 1172654
- 28
- 15358
+ 29
+ 15344
@@ -34561,19 +34937,19 @@
preprocdirects
- 5413334
+ 5408430id
- 5413334
+ 5408430kind
- 1373
+ 1372location
- 5410088
+ 5405187
@@ -34587,7 +34963,7 @@
12
- 5413334
+ 5408430
@@ -34603,7 +34979,7 @@
12
- 5413334
+ 5408430
@@ -34751,7 +35127,7 @@
12
- 5409963
+ 540506227
@@ -34772,7 +35148,7 @@
12
- 5410088
+ 5405187
@@ -34782,15 +35158,15 @@
preprocpair
- 1142251
+ 1141217begin
- 889777
+ 888971elseelifend
- 1142251
+ 1141217
@@ -34804,17 +35180,17 @@
12
- 650164
+ 64957523
- 230622
+ 23041439
- 8990
+ 8982
@@ -34830,7 +35206,7 @@
12
- 1142251
+ 1141217
@@ -34840,41 +35216,41 @@
preproctrue
- 439769
+ 439371branch
- 439769
+ 439371preprocfalse
- 285562
+ 285304branch
- 285562
+ 285304preproctext
- 4356364
+ 4352418id
- 4356364
+ 4352418head
- 2957767
+ 2955088body
- 1684908
+ 1683382
@@ -34888,7 +35264,7 @@
12
- 4356364
+ 4352418
@@ -34904,7 +35280,7 @@
12
- 4356364
+ 4352418
@@ -34920,12 +35296,12 @@
12
- 2758985
+ 27564852798
- 198782
+ 198602
@@ -34941,12 +35317,12 @@
12
- 2876481
+ 287387525
- 81286
+ 81212
@@ -34962,17 +35338,17 @@
12
- 1536570
+ 1535178210
- 127360
+ 1272451013606
- 20977
+ 20958
@@ -34988,17 +35364,17 @@
12
- 1540816
+ 1539420212
- 126986
+ 126871123246
- 17106
+ 17090
@@ -35008,15 +35384,15 @@
includes
- 318629
+ 318638id
- 318629
+ 318638included
- 58694
+ 58695
@@ -35030,7 +35406,7 @@
12
- 318629
+ 318638
@@ -35134,11 +35510,11 @@
link_parent
- 30398086
+ 30398238element
- 3866101
+ 3866121link_target
@@ -35156,7 +35532,7 @@
12
- 530457
+ 5304592
@@ -35166,7 +35542,7 @@
910
- 3308696
+ 3308712
diff --git a/cpp/ql/lib/upgrades/5340d6d5f428557632b1a50113e406430f29ef7d/old.dbscheme b/cpp/ql/lib/upgrades/5340d6d5f428557632b1a50113e406430f29ef7d/old.dbscheme
new file mode 100644
index 000000000000..5340d6d5f428
--- /dev/null
+++ b/cpp/ql/lib/upgrades/5340d6d5f428557632b1a50113e406430f29ef7d/old.dbscheme
@@ -0,0 +1,2423 @@
+/*- 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
+ *
+ * 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 -*/
+
+/**
+ * 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
+);
+
+/*- Source location prefix -*/
+
+/**
+ * The source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string ref);
+
+/*- Files and folders -*/
+
+/**
+ * The location of an element.
+ * 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(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref
+);
+
+@container = @file | @folder
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*- Lines of code -*/
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+/*- Diagnostic messages -*/
+
+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
+);
+
+/*- C++ dbscheme -*/
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+/** An element for which line-count information is available. */
+@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable;
+
+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_default 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
+ 0 = @unknown_function
+| 1 = @normal_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+// ... 6 = @builtin_function deprecated // 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
+);
+
+builtin_functions(
+ int id: @function 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
+| 63 = @scalable_vector_count // __SVCount_t
+| 64 = @complex_fp16 // _Complex __fp16
+| 65 = @complex_std_bfloat16 // _Complex __bf16
+| 66 = @complex_std_float16 // _Complex std::float16_t
+;
+
+builtintypes(
+ unique int id: @builtintype,
+ string name: string ref,
+ int kind: int ref,
+ int size: int ref,
+ int sign: int ref,
+ int alignment: int ref
+);
+
+/**
+ * Derived types are types that are directly derived from existing types and
+ * point to, refer to, transform type data to return a new type.
+ */
+case @derivedtype.kind of
+ 1 = @pointer
+| 2 = @reference
+| 3 = @type_with_specifiers
+| 4 = @array
+| 5 = @gnu_vector
+| 6 = @routineptr
+| 7 = @routinereference
+| 8 = @rvalue_reference // C++11
+// ... 9 type_conforming_to_protocols deprecated
+| 10 = @block
+| 11 = @scalable_vector // Arm SVE
+;
+
+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
+);
+
+tupleelements(
+ unique int id: @derivedtype ref,
+ int num_elements: 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_default 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
+);
+
+namespaceattributes(
+ int namespace_id: @namespace 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_default 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_default 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_default 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
+| 40 = @stmt_leave
+;
+
+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 | @stmt_leave;
+
+@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/5340d6d5f428557632b1a50113e406430f29ef7d/semmlecode.cpp.dbscheme b/cpp/ql/lib/upgrades/5340d6d5f428557632b1a50113e406430f29ef7d/semmlecode.cpp.dbscheme
new file mode 100644
index 000000000000..c16b29b27f71
--- /dev/null
+++ b/cpp/ql/lib/upgrades/5340d6d5f428557632b1a50113e406430f29ef7d/semmlecode.cpp.dbscheme
@@ -0,0 +1,2436 @@
+/*- 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
+ *
+ * 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 -*/
+
+/**
+ * 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
+);
+
+/*- Source location prefix -*/
+
+/**
+ * The source location of the snapshot.
+ */
+sourceLocationPrefix(string prefix : string ref);
+
+/*- Files and folders -*/
+
+/**
+ * The location of an element.
+ * 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(
+ unique int id: @location_default,
+ int file: @file ref,
+ int beginLine: int ref,
+ int beginColumn: int ref,
+ int endLine: int ref,
+ int endColumn: int ref
+);
+
+files(
+ unique int id: @file,
+ string name: string ref
+);
+
+folders(
+ unique int id: @folder,
+ string name: string ref
+);
+
+@container = @file | @folder
+
+containerparent(
+ int parent: @container ref,
+ unique int child: @container ref
+);
+
+/*- Lines of code -*/
+
+numlines(
+ int element_id: @sourceline ref,
+ int num_lines: int ref,
+ int num_code: int ref,
+ int num_comment: int ref
+);
+
+/*- Diagnostic messages -*/
+
+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
+);
+
+/*- C++ dbscheme -*/
+
+extractor_version(
+ string codeql_version: string ref,
+ string frontend_version: string ref
+)
+
+pch_uses(
+ int pch: @pch ref,
+ int compilation: @compilation ref,
+ int id: @file ref
+)
+
+#keyset[pch, compilation]
+pch_creations(
+ int pch: @pch,
+ int compilation: @compilation ref,
+ int from: @file ref
+)
+
+/** An element for which line-count information is available. */
+@sourceline = @file | @function | @variable | @enumconstant | @xmllocatable;
+
+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_default 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
+ 0 = @unknown_function
+| 1 = @normal_function
+| 2 = @constructor
+| 3 = @destructor
+| 4 = @conversion_function
+| 5 = @operator
+// ... 6 = @builtin_function deprecated // 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
+);
+
+builtin_functions(
+ int id: @function 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
+| 63 = @scalable_vector_count // __SVCount_t
+| 64 = @complex_fp16 // _Complex __fp16
+| 65 = @complex_std_bfloat16 // _Complex __bf16
+| 66 = @complex_std_float16 // _Complex std::float16_t
+;
+
+builtintypes(
+ unique int id: @builtintype,
+ string name: string ref,
+ int kind: int ref,
+ int size: int ref,
+ int sign: int ref,
+ int alignment: int ref
+);
+
+/**
+ * Derived types are types that are directly derived from existing types and
+ * point to, refer to, transform type data to return a new type.
+ */
+case @derivedtype.kind of
+ 1 = @pointer
+| 2 = @reference
+| 3 = @type_with_specifiers
+| 4 = @array
+| 5 = @gnu_vector
+| 6 = @routineptr
+| 7 = @routinereference
+| 8 = @rvalue_reference // C++11
+// ... 9 type_conforming_to_protocols deprecated
+| 10 = @block
+| 11 = @scalable_vector // Arm SVE
+;
+
+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
+);
+
+tupleelements(
+ unique int id: @derivedtype ref,
+ int num_elements: 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_default 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
+);
+
+namespaceattributes(
+ int namespace_id: @namespace 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_default 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_default 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_default 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
+| 40 = @stmt_leave
+;
+
+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 | @stmt_leave;
+
+@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/5340d6d5f428557632b1a50113e406430f29ef7d/upgrade.properties b/cpp/ql/lib/upgrades/5340d6d5f428557632b1a50113e406430f29ef7d/upgrade.properties
new file mode 100644
index 000000000000..d8e09e944fe5
--- /dev/null
+++ b/cpp/ql/lib/upgrades/5340d6d5f428557632b1a50113e406430f29ef7d/upgrade.properties
@@ -0,0 +1,2 @@
+description: Link PCH creations and uses
+compatibility: backwards
diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md
index e3c013b76c75..eb805dc1af6e 100644
--- a/cpp/ql/src/CHANGELOG.md
+++ b/cpp/ql/src/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 1.4.7
+
+### Bug Fixes
+
+* Fixed an inconsistency across languages where most have a `Customizations.qll` file for adding customizations, but not all did.
+
## 1.4.6
### Minor Analysis Improvements
diff --git a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql
index 1098656f7a20..9119f5271fe6 100644
--- a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql
+++ b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql
@@ -147,8 +147,8 @@ module ExecTaintConfig implements DataFlow::StateConfigSig {
predicate isBarrier(DataFlow::Node node) { isBarrierImpl(node) }
- predicate isBarrierOut(DataFlow::Node node) {
- isSink(node, _) // Prevent duplicates along a call chain, since `shellCommand` will include wrappers
+ predicate isBarrierOut(DataFlow::Node node, FlowState state) {
+ isSink(node, state) // Prevent duplicates along a call chain, since `shellCommand` will include wrappers
}
predicate observeDiffInformedIncrementalMode() { any() }
diff --git a/cpp/ql/src/change-notes/released/1.4.7.md b/cpp/ql/src/change-notes/released/1.4.7.md
new file mode 100644
index 000000000000..d3b9a12c7984
--- /dev/null
+++ b/cpp/ql/src/change-notes/released/1.4.7.md
@@ -0,0 +1,5 @@
+## 1.4.7
+
+### Bug Fixes
+
+* Fixed an inconsistency across languages where most have a `Customizations.qll` file for adding customizations, but not all did.
diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml
index 3b00bbce928c..163362bd6321 100644
--- a/cpp/ql/src/codeql-pack.release.yml
+++ b/cpp/ql/src/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 1.4.6
+lastReleaseVersion: 1.4.7
diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml
index bd7ff423c7cb..aaa6ceb2e931 100644
--- a/cpp/ql/src/qlpack.yml
+++ b/cpp/ql/src/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/cpp-queries
-version: 1.4.6
+version: 1.4.7
groups:
- cpp
- queries
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp
index 105212ccca67..63528d712c0c 100644
--- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dispatch.cpp
@@ -8,7 +8,7 @@ struct Top {
virtual void isSink(int x) { }
virtual int notSource1() { return source(); }
virtual int notSource2() { return source(); }
- virtual void notSink(int x) { sink(x); } // $ SPURIOUS: ast,ir=37:19 ast,ir=45:18
+ virtual void notSink(int x) { sink(x); } // $ SPURIOUS: ast=37:19 ast=45:18
};
// This class has the correct behavior for just the functions ending in 2.
@@ -32,16 +32,16 @@ void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) { // $ ast-def=bottom
sink(topPtr->isSource2()); // $ ir MISSING: ast
topPtr->isSink(source()); // causing a MISSING for ast
- sink(topPtr->notSource1()); // $ SPURIOUS: ast,ir
- sink(topPtr->notSource2()); // $ SPURIOUS: ast,ir
+ sink(topPtr->notSource1()); // $ SPURIOUS: ast
+ sink(topPtr->notSource2()); // $ SPURIOUS: ast
topPtr->notSink(source()); // causing SPURIOUS for ast,ir
sink(topRef.isSource1()); // $ ir MISSING: ast
sink(topRef.isSource2()); // $ ir MISSING: ast
topRef.isSink(source()); // causing a MISSING for ast
- sink(topRef.notSource1()); // $ SPURIOUS: ast,ir
- sink(topRef.notSource2()); // $ SPURIOUS: ast,ir
+ sink(topRef.notSource1()); // $ SPURIOUS: ast
+ sink(topRef.notSource2()); // $ SPURIOUS: ast
topRef.notSink(source()); // causing SPURIOUS for ast,ir
}
@@ -126,8 +126,8 @@ namespace virtual_inheritance {
// get flow from a `Middle` value to the call qualifier.
Top *topPtr = bottomPtr, &topRef = bottomRef;
- sink(topPtr->isSource()); // $ MISSING: ast,ir
- sink(topRef.isSource()); // $ MISSING: ast,ir
+ sink(topPtr->isSource()); // $ ir MISSING: ast
+ sink(topRef.isSource()); // $ ir MISSING: ast
}
}
diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected
index 6e0b03be9c61..8c009241734a 100644
--- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected
+++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test-source-sink.expected
@@ -169,10 +169,6 @@ irFlow
| clang.cpp:50:35:50:40 | call to source | clang.cpp:53:17:53:26 | *stackArray |
| clang.cpp:51:19:51:24 | call to source | clang.cpp:53:17:53:26 | *stackArray |
| clang.cpp:57:21:57:28 | call to source | clang.cpp:59:8:59:8 | d |
-| dispatch.cpp:9:37:9:42 | call to source | dispatch.cpp:35:16:35:25 | call to notSource1 |
-| dispatch.cpp:9:37:9:42 | call to source | dispatch.cpp:43:15:43:24 | call to notSource1 |
-| dispatch.cpp:10:37:10:42 | call to source | dispatch.cpp:36:16:36:25 | call to notSource2 |
-| dispatch.cpp:10:37:10:42 | call to source | dispatch.cpp:44:15:44:24 | call to notSource2 |
| dispatch.cpp:16:37:16:42 | call to source | dispatch.cpp:32:16:32:24 | call to isSource2 |
| dispatch.cpp:16:37:16:42 | call to source | dispatch.cpp:40:15:40:23 | call to isSource2 |
| dispatch.cpp:22:37:22:42 | call to source | dispatch.cpp:31:16:31:24 | call to isSource1 |
@@ -180,13 +176,13 @@ irFlow
| dispatch.cpp:22:37:22:42 | call to source | dispatch.cpp:55:22:55:30 | call to isSource1 |
| dispatch.cpp:22:37:22:42 | call to source | dispatch.cpp:58:28:58:36 | call to isSource1 |
| dispatch.cpp:33:18:33:23 | call to source | dispatch.cpp:23:38:23:38 | x |
-| dispatch.cpp:37:19:37:24 | call to source | dispatch.cpp:11:38:11:38 | x |
| dispatch.cpp:41:17:41:22 | call to source | dispatch.cpp:23:38:23:38 | x |
-| dispatch.cpp:45:18:45:23 | call to source | dispatch.cpp:11:38:11:38 | x |
| dispatch.cpp:69:15:69:20 | call to source | dispatch.cpp:23:38:23:38 | x |
| dispatch.cpp:73:14:73:19 | call to source | dispatch.cpp:23:38:23:38 | x |
| dispatch.cpp:81:13:81:18 | call to source | dispatch.cpp:23:38:23:38 | x |
| dispatch.cpp:107:17:107:22 | call to source | dispatch.cpp:96:8:96:8 | x |
+| dispatch.cpp:117:38:117:43 | call to source | dispatch.cpp:129:18:129:25 | call to isSource |
+| dispatch.cpp:117:38:117:43 | call to source | dispatch.cpp:130:17:130:24 | call to isSource |
| dispatch.cpp:140:8:140:13 | call to source | dispatch.cpp:96:8:96:8 | x |
| dispatch.cpp:144:8:144:13 | call to source | dispatch.cpp:96:8:96:8 | x |
| flowOut.cpp:5:16:5:21 | call to source | flowOut.cpp:31:9:31:9 | x |
diff --git a/cpp/ql/test/library-tests/dataflow/dispatch/test.cpp b/cpp/ql/test/library-tests/dataflow/dispatch/test.cpp
new file mode 100644
index 000000000000..f243b76ad140
--- /dev/null
+++ b/cpp/ql/test/library-tests/dataflow/dispatch/test.cpp
@@ -0,0 +1,127 @@
+struct Base {
+ void f();
+ virtual void virtual_f();
+};
+
+struct Derived : Base {
+ void f();
+ void virtual_f();
+};
+
+void test_simple() {
+ Base b;
+ b.f(); // $ target=2
+ b.virtual_f(); // $ target=3
+
+ Derived d;
+ d.f(); // $ target=7
+ d.virtual_f(); // $ target=8
+
+ Base* b_ptr = &d;
+ b_ptr->f(); // $ target=2
+ b_ptr->virtual_f(); // $ target=8
+
+ Base& b_ref = d;
+ b_ref.f(); // $ target=2
+ b_ref.virtual_f(); // $ target=8
+
+ Base* b_null = nullptr;
+ b_null->f(); // $ target=2
+ b_null->virtual_f(); // $ target=3
+
+ Base* base_is_derived = new Derived();
+ base_is_derived->f(); // $ target=2
+ base_is_derived->virtual_f(); // $ target=8
+
+ Base* base_is_base = new Base();
+ base_is_base->f(); // $ target=2
+ base_is_base->virtual_f(); // $ target=3
+
+ Derived* derived_is_derived = new Derived();
+ derived_is_derived->f(); // $ target=7
+ derived_is_derived->virtual_f(); // $ target=8
+
+ Base& b_ref2 = b;
+ b_ref2 = d;
+ b_ref2.f(); // $ target=2
+ b_ref2.virtual_f(); // $ target=3
+}
+
+struct S {
+ Base* b1;
+ Base* b2;
+};
+
+void test_fields() {
+ S s;
+
+ s.b1 = new Base();
+ s.b2 = new Derived();
+
+ s.b1->virtual_f(); // $ target=3
+ s.b2->virtual_f(); // $ target=8
+
+ s.b1 = new Derived();
+ s.b2 = new Base();
+ s.b1->virtual_f(); // $ target=8 SPURIOUS: target=3 // type-tracking has no 'clearsContent' feature and C/C++ doesn't have field-based SSA
+ s.b2->virtual_f(); // $ target=3 SPURIOUS: target=8 // type-tracking has no 'clearsContent' feature and C/C++ doesn't have field-based SSA
+}
+
+Base* getDerived() {
+ return new Derived();
+}
+
+void test_getDerived() {
+ Base* b = getDerived();
+ b->virtual_f(); // $ target=8
+
+ Derived d = *(Derived*)getDerived();
+ d.virtual_f(); // $ target=8
+}
+
+void write_to_arg(Base* b) {
+ *b = Derived();
+}
+
+void write_to_arg_2(Base** b) {
+ Derived* d = new Derived();
+ *b = d;
+}
+
+void test_write_to_arg() {
+ {
+ Base b;
+ write_to_arg(&b);
+ b.virtual_f(); // $ SPURIOUS: target=3 MISSING: target=8 // missing flow through the copy-constructor in write_to_arg
+ }
+
+ {
+ Base* b;
+ write_to_arg_2(&b);
+ b->virtual_f(); // $ target=8
+ }
+}
+
+Base* global_derived;
+
+void set_global_to_derived() {
+ global_derived = new Derived();
+}
+
+void read_global() {
+ global_derived->virtual_f(); // $ target=8
+}
+
+Base* global_base_or_derived;
+
+void set_global_base_or_derived_1() {
+ global_base_or_derived = new Base();
+}
+
+void set_global_base_or_derived_2() {
+ global_base_or_derived = new Derived();
+}
+
+void read_global_base_or_derived() {
+ global_base_or_derived->virtual_f(); // $ target=3 target=8
+}
\ No newline at end of file
diff --git a/cpp/ql/test/library-tests/dataflow/dispatch/test.expected b/cpp/ql/test/library-tests/dataflow/dispatch/test.expected
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/cpp/ql/test/library-tests/dataflow/dispatch/test.ql b/cpp/ql/test/library-tests/dataflow/dispatch/test.ql
new file mode 100644
index 000000000000..de16d6da1ef1
--- /dev/null
+++ b/cpp/ql/test/library-tests/dataflow/dispatch/test.ql
@@ -0,0 +1,22 @@
+import cpp
+import utils.test.InlineExpectationsTest
+import semmle.code.cpp.ir.dataflow.internal.DataFlowDispatch
+import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate
+
+module ResolveDispatchTest implements TestSig {
+ string getARelevantTag() { result = "target" }
+
+ predicate hasActualResult(Location location, string element, string tag, string value) {
+ exists(DataFlowCall call, SourceCallable callable, MemberFunction mf |
+ mf = callable.asSourceCallable() and
+ not mf.isCompilerGenerated() and
+ callable = viableCallable(call) and
+ location = call.getLocation() and
+ element = call.toString() and
+ tag = "target" and
+ value = callable.getLocation().getStartLine().toString()
+ )
+ }
+}
+
+import MakeTest
diff --git a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected
index aeb2362ef339..1b74b290eb39 100644
--- a/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected
+++ b/cpp/ql/test/library-tests/dataflow/external-models/validatemodels.expected
@@ -6,12 +6,14 @@
| Dubious member name "operator LPWSTR" in summary model. |
| Dubious member name "operator PCXSTR" in summary model. |
| Dubious member name "operator PXSTR" in summary model. |
+| Dubious member name "operator void**" in summary model. |
| Dubious member name "operator&" in summary model. |
| Dubious member name "operator*" in summary model. |
| Dubious member name "operator+" in summary model. |
| Dubious member name "operator+=" in summary model. |
| Dubious member name "operator->" in summary model. |
| Dubious member name "operator=" in summary model. |
+| Dubious member name "operator=" in summary model. |
| Dubious member name "operator[]" in summary model. |
| Dubious signature "(..(*)(..))" in summary model. |
| Dubious signature "(..(*)(..),..(*)(..),..(*)(..),..(*)(..))" in summary model. |
@@ -503,6 +505,7 @@
| Dubious signature "(CURLU *,CURLUPart,const char *,unsigned int)" in summary model. |
| Dubious signature "(CURLU *,const char *)" in summary model. |
| Dubious signature "(CURLU *,const char *,char **,OperationConfig *)" in summary model. |
+| Dubious signature "(ComPtr &&)" in summary model. |
| Dubious signature "(CompoundDictionary *,const PreparedDictionary *)" in summary model. |
| Dubious signature "(Curl_cfilter *)" in summary model. |
| Dubious signature "(Curl_cfilter **,Curl_easy *)" in summary model. |
@@ -2130,6 +2133,7 @@
| Dubious signature "(RAND_POOL *,unsigned char *)" in summary model. |
| Dubious signature "(RAND_POOL *,unsigned int)" in summary model. |
| Dubious signature "(RECORD_LAYER *,SSL_CONNECTION *)" in summary model. |
+| Dubious signature "(REFIID,void **)" in summary model. |
| Dubious signature "(RIO_NOTIFIER *)" in summary model. |
| Dubious signature "(RIPEMD160_CTX *,const unsigned char *)" in summary model. |
| Dubious signature "(RIPEMD160_CTX *,const void *,size_t)" in summary model. |
@@ -2431,6 +2435,8 @@
| Dubious signature "(Strent *)" in summary model. |
| Dubious signature "(Strtab *,const char *,size_t)" in summary model. |
| Dubious signature "(Strtab *,size_t *)" in summary model. |
+| Dubious signature "(T *)" in summary model. |
+| Dubious signature "(T **)" in summary model. |
| Dubious signature "(TLS_FEATURE *)" in summary model. |
| Dubious signature "(TLS_RL_RECORD *,const unsigned char *)" in summary model. |
| Dubious signature "(TS_ACCURACY *)" in summary model. |
@@ -2493,6 +2499,7 @@
| Dubious signature "(TS_VERIFY_CTX *,unsigned char *,long)" in summary model. |
| Dubious signature "(TXT_DB *,OPENSSL_STRING *)" in summary model. |
| Dubious signature "(TXT_DB *,int,..(*)(..),OPENSSL_LH_HASHFUNC,OPENSSL_LH_COMPFUNC)" in summary model. |
+| Dubious signature "(U *)" in summary model. |
| Dubious signature "(UI *)" in summary model. |
| Dubious signature "(UI *,UI_STRING *,const char *)" in summary model. |
| Dubious signature "(UI *,UI_STRING *,const char *,int)" in summary model. |
@@ -3155,6 +3162,7 @@
| Dubious signature "(const CT_POLICY_EVAL_CTX *)" in summary model. |
| Dubious signature "(const CURLU *)" in summary model. |
| Dubious signature "(const CURLU *,CURLUPart,char **,unsigned int)" in summary model. |
+| Dubious signature "(const ComPtr &)" in summary model. |
| Dubious signature "(const Command *,const size_t,const BlockSplit *,const BlockSplit *,const BlockSplit *,const uint8_t *,size_t,size_t,uint8_t,uint8_t,const ContextType *,HistogramLiteral *,HistogramCommand *,HistogramDistance *)" in summary model. |
| Dubious signature "(const Curl_easy *,const connectdata *,int)" in summary model. |
| Dubious signature "(const DH *)" in summary model. |
diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/atl.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/atl.cpp
index e26416a0e68c..aff51f629647 100644
--- a/cpp/ql/test/library-tests/dataflow/taint-tests/atl.cpp
+++ b/cpp/ql/test/library-tests/dataflow/taint-tests/atl.cpp
@@ -1241,4 +1241,221 @@ namespace ATL {
sink(static_cast::PCXSTR>(b)); // $ ir
sink(static_cast::PXSTR>(b)); // $ ir
}
+}
+
+namespace Microsoft {
+ namespace WRL {
+ template
+ class ComPtr;
+
+ struct GUID;
+
+ typedef GUID IID;
+
+ typedef IID *REFIID;
+
+ class IUnknown;
+
+ class WeakRef;
+
+ namespace Details {
+ template
+ class ComPtrRef {
+ public:
+ using InterfaceType = T;
+
+ ComPtrRef(T*);
+
+ InterfaceType* const * GetAddressOf() const;
+ InterfaceType** ReleaseAndGetAddressOf();
+
+ operator InterfaceType**();
+ operator T*();
+ operator void**() const;
+ InterfaceType* operator *();
+ };
+ }
+
+ template
+ class ComPtr
+ {
+ public:
+ using InterfaceType = T;
+
+ ComPtr();
+ ComPtr(const ComPtr &);
+ ComPtr(ComPtr &&);
+
+ template
+ ComPtr(U *);
+
+ ~ComPtr();
+
+ template
+ HRESULT As(ComPtr *p) const;
+
+ HRESULT AsWeak(WeakRef *);
+
+ void Attach(InterfaceType *);
+
+ HRESULT CopyTo(InterfaceType **);
+
+ HRESULT CopyTo(REFIID, void **) const;
+
+ template
+ HRESULT CopyTo(U **) const;
+
+ T *Detach();
+
+ T *Get() const;
+
+ T *const *GetAddressOf() const;
+ T **GetAddressOf();
+
+ T **ReleaseAndGetAddressOf();
+
+ unsigned long Reset();
+
+ void Swap(ComPtr &&r);
+
+ void Swap(ComPtr &r);
+
+ Details::ComPtrRef> operator&();
+ const Details::ComPtrRef> operator&() const;
+
+ InterfaceType* operator->() const; // return type simplified from Microsoft::WRL::Details::RemoveIUnknown*
+
+ ComPtr& operator=(T *);
+ template
+ ComPtr& operator=(U *);
+ ComPtr& operator=(const ComPtr &);
+ template
+ ComPtr& operator=(const ComPtr&);
+ ComPtr& operator=(ComPtr &&);
+ template
+ ComPtr& operator=(ComPtr&&);
+ };
+
+ }
+}
+
+namespace std {
+ template T&& move(T& t) noexcept; // simplified signature
+}
+
+void test_constructor()
+{
+ Microsoft::WRL::ComPtr p0;
+ sink(*p0.Get()); // clean
+
+ int x = source();
+ Microsoft::WRL::ComPtr p1(new int(x));
+ sink(*p1.Get()); // $ ir MISSING: ast
+ sink(*p1.Detach()); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p2(p1);
+ sink(*p2.Get()); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p3(std::move(p1));
+ sink(*p3.Get()); // $ ir MISSING: ast
+}
+
+void test_As()
+{
+ int x = source();
+ Microsoft::WRL::ComPtr p1(new int(x));
+ Microsoft::WRL::ComPtr* p2;
+ p1.As(p2);
+ sink(*p2->Get()); // $ ir MISSING: ast
+}
+
+void test_CopyTo()
+{
+ int x = source();
+ Microsoft::WRL::ComPtr p1(new int(x));
+ int *raw = nullptr;
+ p1.CopyTo(&raw);
+ sink(*raw); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p2;
+ p1.CopyTo(nullptr, (void**)&raw);
+ sink(*raw); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p3(new int(x));
+
+ int* raw2 = nullptr;
+ p3.CopyTo(&raw2);
+ sink(*raw2); // $ ir MISSING: ast
+}
+
+void test_Swap()
+{
+ int x = source();
+ Microsoft::WRL::ComPtr p1(new int(x));
+ Microsoft::WRL::ComPtr p2;
+ p1.Swap(p2);
+ sink(*p2.Get()); // $ ir MISSING: ast
+ sink(*p1.Get()); // $ SPURIOUS: ir
+}
+
+void test_GetAddressOf()
+{
+ int x = source();
+ Microsoft::WRL::ComPtr p1(new int(x));
+ sink(**p1.GetAddressOf()); // $ ir MISSING: ast
+
+ const Microsoft::WRL::ComPtr p2(new int(x));
+ sink(**p2.GetAddressOf()); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p3(new int(x));
+ int **pp = p3.ReleaseAndGetAddressOf();
+ sink(**pp); // $ ir MISSING: ast
+}
+
+struct S {
+ int x;
+};
+
+void test_address_of_deref_operators() {
+ int x = source();
+ Microsoft::WRL::ComPtr p1(new int(x));
+ Microsoft::WRL::Details::ComPtrRef> pp = &p1;
+ Microsoft::WRL::ComPtr* qq = *pp;
+ sink(*qq->Get()); // $ ir MISSING: ast
+
+ const Microsoft::WRL::ComPtr p2(new int(x));
+ Microsoft::WRL::Details::ComPtrRef> pp2 = &p2;
+ const Microsoft::WRL::ComPtr* qq2 = *pp2;
+ sink(*qq2->Get()); // $ ir MISSING: ast
+
+ S s;
+ s.x = source();
+ Microsoft::WRL::ComPtr p3(&s);
+ sink(p3->x); // $ ir MISSING: ast
+}
+
+void test_assignments() {
+ Microsoft::WRL::ComPtr p1;
+ p1 = new int(source());
+ sink(*p1.Get()); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p2;
+ p2 = new long(source());
+ sink(*p2.Get()); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p3;
+ p3 = p1;
+ sink(*p3.Get()); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p4;
+ p4 = p1;
+ sink(*p4.Get()); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p5;
+ p5 = std::move(p1);
+ sink(*p5.Get()); // $ ir MISSING: ast
+
+ Microsoft::WRL::ComPtr p6;
+ p6 = std::move(p1);
+ sink(*p6.Get()); // $ ir MISSING: ast
}
\ No newline at end of file
diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected
index e19f34eb2170..e8f0a8e34b25 100644
--- a/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected
+++ b/cpp/ql/test/library-tests/dataflow/taint-tests/localTaint.expected
@@ -1278,6 +1278,223 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
| atl.cpp:1240:22:1240:30 | call to CStrBufT | atl.cpp:1241:46:1241:46 | b | |
| atl.cpp:1240:22:1240:30 | call to CStrBufT | atl.cpp:1242:45:1242:45 | b | |
| atl.cpp:1241:46:1241:46 | ref arg b | atl.cpp:1242:45:1242:45 | b | |
+| atl.cpp:1348:31:1348:32 | call to ComPtr | atl.cpp:1349:9:1349:10 | p0 | |
+| atl.cpp:1348:31:1348:32 | call to ComPtr | atl.cpp:1361:1:1361:1 | p0 | |
+| atl.cpp:1349:9:1349:10 | ref arg p0 | atl.cpp:1361:1:1361:1 | p0 | |
+| atl.cpp:1349:12:1349:14 | call to Get | atl.cpp:1349:8:1349:16 | * ... | TAINT |
+| atl.cpp:1351:11:1351:21 | call to source | atl.cpp:1352:42:1352:42 | x | |
+| atl.cpp:1352:34:1352:43 | new | atl.cpp:1352:34:1352:44 | call to ComPtr | TAINT |
+| atl.cpp:1352:34:1352:44 | call to ComPtr | atl.cpp:1353:9:1353:10 | p1 | |
+| atl.cpp:1352:34:1352:44 | call to ComPtr | atl.cpp:1354:9:1354:10 | p1 | |
+| atl.cpp:1352:34:1352:44 | call to ComPtr | atl.cpp:1356:34:1356:35 | p1 | |
+| atl.cpp:1352:34:1352:44 | call to ComPtr | atl.cpp:1359:44:1359:45 | p1 | |
+| atl.cpp:1352:34:1352:44 | call to ComPtr | atl.cpp:1361:1:1361:1 | p1 | |
+| atl.cpp:1352:42:1352:42 | x | atl.cpp:1352:34:1352:43 | new | |
+| atl.cpp:1353:9:1353:10 | ref arg p1 | atl.cpp:1354:9:1354:10 | p1 | |
+| atl.cpp:1353:9:1353:10 | ref arg p1 | atl.cpp:1356:34:1356:35 | p1 | |
+| atl.cpp:1353:9:1353:10 | ref arg p1 | atl.cpp:1359:44:1359:45 | p1 | |
+| atl.cpp:1353:9:1353:10 | ref arg p1 | atl.cpp:1361:1:1361:1 | p1 | |
+| atl.cpp:1353:12:1353:14 | call to Get | atl.cpp:1353:8:1353:16 | * ... | TAINT |
+| atl.cpp:1354:9:1354:10 | ref arg p1 | atl.cpp:1356:34:1356:35 | p1 | |
+| atl.cpp:1354:9:1354:10 | ref arg p1 | atl.cpp:1359:44:1359:45 | p1 | |
+| atl.cpp:1354:9:1354:10 | ref arg p1 | atl.cpp:1361:1:1361:1 | p1 | |
+| atl.cpp:1354:12:1354:17 | call to Detach | atl.cpp:1354:8:1354:19 | * ... | TAINT |
+| atl.cpp:1356:34:1356:35 | p1 | atl.cpp:1356:34:1356:36 | call to ComPtr | |
+| atl.cpp:1356:34:1356:36 | call to ComPtr | atl.cpp:1357:9:1357:10 | p2 | |
+| atl.cpp:1356:34:1356:36 | call to ComPtr | atl.cpp:1361:1:1361:1 | p2 | |
+| atl.cpp:1357:9:1357:10 | ref arg p2 | atl.cpp:1361:1:1361:1 | p2 | |
+| atl.cpp:1357:12:1357:14 | call to Get | atl.cpp:1357:8:1357:16 | * ... | TAINT |
+| atl.cpp:1359:34:1359:42 | call to move | atl.cpp:1359:34:1359:47 | call to ComPtr | TAINT |
+| atl.cpp:1359:34:1359:42 | ref arg call to move | atl.cpp:1359:44:1359:45 | p1 [inner post update] | |
+| atl.cpp:1359:34:1359:42 | ref arg call to move | atl.cpp:1361:1:1361:1 | p1 | |
+| atl.cpp:1359:34:1359:47 | call to ComPtr | atl.cpp:1360:9:1360:10 | p3 | |
+| atl.cpp:1359:34:1359:47 | call to ComPtr | atl.cpp:1361:1:1361:1 | p3 | |
+| atl.cpp:1359:44:1359:45 | p1 | atl.cpp:1359:34:1359:42 | call to move | TAINT |
+| atl.cpp:1359:44:1359:45 | p1 | atl.cpp:1359:34:1359:47 | call to ComPtr | |
+| atl.cpp:1360:9:1360:10 | ref arg p3 | atl.cpp:1361:1:1361:1 | p3 | |
+| atl.cpp:1360:12:1360:14 | call to Get | atl.cpp:1360:8:1360:16 | * ... | TAINT |
+| atl.cpp:1365:11:1365:21 | call to source | atl.cpp:1366:42:1366:42 | x | |
+| atl.cpp:1366:34:1366:43 | new | atl.cpp:1366:34:1366:44 | call to ComPtr | TAINT |
+| atl.cpp:1366:34:1366:44 | call to ComPtr | atl.cpp:1368:3:1368:4 | p1 | |
+| atl.cpp:1366:34:1366:44 | call to ComPtr | atl.cpp:1370:1:1370:1 | p1 | |
+| atl.cpp:1366:42:1366:42 | x | atl.cpp:1366:34:1366:43 | new | |
+| atl.cpp:1367:32:1367:33 | p2 | atl.cpp:1368:9:1368:10 | p2 | |
+| atl.cpp:1367:32:1367:33 | p2 | atl.cpp:1369:9:1369:10 | p2 | |
+| atl.cpp:1368:9:1368:10 | ref arg p2 | atl.cpp:1369:9:1369:10 | p2 | |
+| atl.cpp:1369:13:1369:15 | call to Get | atl.cpp:1369:8:1369:17 | * ... | TAINT |
+| atl.cpp:1374:11:1374:21 | call to source | atl.cpp:1375:42:1375:42 | x | |
+| atl.cpp:1374:11:1374:21 | call to source | atl.cpp:1384:42:1384:42 | x | |
+| atl.cpp:1375:34:1375:43 | new | atl.cpp:1375:34:1375:44 | call to ComPtr | TAINT |
+| atl.cpp:1375:34:1375:44 | call to ComPtr | atl.cpp:1377:3:1377:4 | p1 | |
+| atl.cpp:1375:34:1375:44 | call to ComPtr | atl.cpp:1381:3:1381:4 | p1 | |
+| atl.cpp:1375:34:1375:44 | call to ComPtr | atl.cpp:1389:1:1389:1 | p1 | |
+| atl.cpp:1375:42:1375:42 | x | atl.cpp:1375:34:1375:43 | new | |
+| atl.cpp:1376:14:1376:20 | 0 | atl.cpp:1377:14:1377:16 | raw | |
+| atl.cpp:1376:14:1376:20 | 0 | atl.cpp:1378:9:1378:11 | raw | |
+| atl.cpp:1376:14:1376:20 | 0 | atl.cpp:1381:31:1381:33 | raw | |
+| atl.cpp:1376:14:1376:20 | 0 | atl.cpp:1382:9:1382:11 | raw | |
+| atl.cpp:1377:3:1377:4 | ref arg p1 | atl.cpp:1381:3:1381:4 | p1 | |
+| atl.cpp:1377:3:1377:4 | ref arg p1 | atl.cpp:1389:1:1389:1 | p1 | |
+| atl.cpp:1377:13:1377:16 | ref arg & ... | atl.cpp:1377:14:1377:16 | raw [inner post update] | |
+| atl.cpp:1377:13:1377:16 | ref arg & ... | atl.cpp:1378:9:1378:11 | raw | |
+| atl.cpp:1377:13:1377:16 | ref arg & ... | atl.cpp:1381:31:1381:33 | raw | |
+| atl.cpp:1377:13:1377:16 | ref arg & ... | atl.cpp:1382:9:1382:11 | raw | |
+| atl.cpp:1377:14:1377:16 | raw | atl.cpp:1377:13:1377:16 | & ... | |
+| atl.cpp:1378:9:1378:11 | raw | atl.cpp:1378:8:1378:11 | * ... | TAINT |
+| atl.cpp:1380:31:1380:32 | call to ComPtr | atl.cpp:1389:1:1389:1 | p2 | |
+| atl.cpp:1381:30:1381:33 | ref arg & ... | atl.cpp:1381:31:1381:33 | raw [inner post update] | |
+| atl.cpp:1381:30:1381:33 | ref arg & ... | atl.cpp:1382:9:1382:11 | raw | |
+| atl.cpp:1381:31:1381:33 | raw | atl.cpp:1381:30:1381:33 | & ... | |
+| atl.cpp:1382:9:1382:11 | raw | atl.cpp:1382:8:1382:11 | * ... | TAINT |
+| atl.cpp:1384:34:1384:43 | new | atl.cpp:1384:34:1384:44 | call to ComPtr | TAINT |
+| atl.cpp:1384:34:1384:44 | call to ComPtr | atl.cpp:1387:3:1387:4 | p3 | |
+| atl.cpp:1384:34:1384:44 | call to ComPtr | atl.cpp:1389:1:1389:1 | p3 | |
+| atl.cpp:1384:42:1384:42 | x | atl.cpp:1384:34:1384:43 | new | |
+| atl.cpp:1386:15:1386:21 | 0 | atl.cpp:1387:19:1387:22 | raw2 | |
+| atl.cpp:1386:15:1386:21 | 0 | atl.cpp:1388:9:1388:12 | raw2 | |
+| atl.cpp:1387:18:1387:22 | ref arg & ... | atl.cpp:1387:19:1387:22 | raw2 [inner post update] | |
+| atl.cpp:1387:18:1387:22 | ref arg & ... | atl.cpp:1388:9:1388:12 | raw2 | |
+| atl.cpp:1387:19:1387:22 | raw2 | atl.cpp:1387:18:1387:22 | & ... | |
+| atl.cpp:1388:9:1388:12 | raw2 | atl.cpp:1388:8:1388:12 | * ... | TAINT |
+| atl.cpp:1393:11:1393:21 | call to source | atl.cpp:1394:42:1394:42 | x | |
+| atl.cpp:1394:34:1394:43 | new | atl.cpp:1394:34:1394:44 | call to ComPtr | TAINT |
+| atl.cpp:1394:34:1394:44 | call to ComPtr | atl.cpp:1396:3:1396:4 | p1 | |
+| atl.cpp:1394:34:1394:44 | call to ComPtr | atl.cpp:1398:9:1398:10 | p1 | |
+| atl.cpp:1394:34:1394:44 | call to ComPtr | atl.cpp:1399:1:1399:1 | p1 | |
+| atl.cpp:1394:42:1394:42 | x | atl.cpp:1394:34:1394:43 | new | |
+| atl.cpp:1395:31:1395:32 | call to ComPtr | atl.cpp:1396:11:1396:12 | p2 | |
+| atl.cpp:1395:31:1395:32 | call to ComPtr | atl.cpp:1397:9:1397:10 | p2 | |
+| atl.cpp:1395:31:1395:32 | call to ComPtr | atl.cpp:1399:1:1399:1 | p2 | |
+| atl.cpp:1396:3:1396:4 | ref arg p1 | atl.cpp:1398:9:1398:10 | p1 | |
+| atl.cpp:1396:3:1396:4 | ref arg p1 | atl.cpp:1399:1:1399:1 | p1 | |
+| atl.cpp:1396:11:1396:12 | ref arg p2 | atl.cpp:1397:9:1397:10 | p2 | |
+| atl.cpp:1396:11:1396:12 | ref arg p2 | atl.cpp:1399:1:1399:1 | p2 | |
+| atl.cpp:1397:9:1397:10 | ref arg p2 | atl.cpp:1399:1:1399:1 | p2 | |
+| atl.cpp:1397:12:1397:14 | call to Get | atl.cpp:1397:8:1397:16 | * ... | TAINT |
+| atl.cpp:1398:9:1398:10 | ref arg p1 | atl.cpp:1399:1:1399:1 | p1 | |
+| atl.cpp:1398:12:1398:14 | call to Get | atl.cpp:1398:8:1398:16 | * ... | TAINT |
+| atl.cpp:1403:11:1403:21 | call to source | atl.cpp:1404:42:1404:42 | x | |
+| atl.cpp:1403:11:1403:21 | call to source | atl.cpp:1407:48:1407:48 | x | |
+| atl.cpp:1403:11:1403:21 | call to source | atl.cpp:1410:42:1410:42 | x | |
+| atl.cpp:1404:34:1404:43 | new | atl.cpp:1404:34:1404:44 | call to ComPtr | TAINT |
+| atl.cpp:1404:34:1404:44 | call to ComPtr | atl.cpp:1405:10:1405:11 | p1 | |
+| atl.cpp:1404:34:1404:44 | call to ComPtr | atl.cpp:1413:1:1413:1 | p1 | |
+| atl.cpp:1404:42:1404:42 | x | atl.cpp:1404:34:1404:43 | new | |
+| atl.cpp:1405:9:1405:26 | * ... | atl.cpp:1405:8:1405:26 | * ... | TAINT |
+| atl.cpp:1405:10:1405:11 | ref arg p1 | atl.cpp:1413:1:1413:1 | p1 | |
+| atl.cpp:1405:13:1405:24 | call to GetAddressOf | atl.cpp:1405:9:1405:26 | * ... | TAINT |
+| atl.cpp:1407:40:1407:49 | new | atl.cpp:1407:40:1407:50 | call to ComPtr | TAINT |
+| atl.cpp:1407:40:1407:50 | call to ComPtr | atl.cpp:1408:10:1408:11 | p2 | |
+| atl.cpp:1407:40:1407:50 | call to ComPtr | atl.cpp:1413:1:1413:1 | p2 | |
+| atl.cpp:1407:48:1407:48 | x | atl.cpp:1407:40:1407:49 | new | |
+| atl.cpp:1408:9:1408:26 | * ... | atl.cpp:1408:8:1408:26 | * ... | TAINT |
+| atl.cpp:1408:10:1408:11 | ref arg p2 | atl.cpp:1413:1:1413:1 | p2 | |
+| atl.cpp:1408:13:1408:24 | call to GetAddressOf | atl.cpp:1408:9:1408:26 | * ... | TAINT |
+| atl.cpp:1410:34:1410:43 | new | atl.cpp:1410:34:1410:44 | call to ComPtr | TAINT |
+| atl.cpp:1410:34:1410:44 | call to ComPtr | atl.cpp:1411:14:1411:15 | p3 | |
+| atl.cpp:1410:34:1410:44 | call to ComPtr | atl.cpp:1413:1:1413:1 | p3 | |
+| atl.cpp:1410:42:1410:42 | x | atl.cpp:1410:34:1410:43 | new | |
+| atl.cpp:1411:14:1411:15 | ref arg p3 | atl.cpp:1413:1:1413:1 | p3 | |
+| atl.cpp:1411:17:1411:38 | call to ReleaseAndGetAddressOf | atl.cpp:1412:10:1412:11 | pp | |
+| atl.cpp:1412:9:1412:11 | * ... | atl.cpp:1412:8:1412:11 | * ... | TAINT |
+| atl.cpp:1412:10:1412:11 | pp | atl.cpp:1412:9:1412:11 | * ... | TAINT |
+| atl.cpp:1420:11:1420:21 | call to source | atl.cpp:1421:42:1421:42 | x | |
+| atl.cpp:1420:11:1420:21 | call to source | atl.cpp:1426:48:1426:48 | x | |
+| atl.cpp:1421:34:1421:43 | new | atl.cpp:1421:34:1421:44 | call to ComPtr | TAINT |
+| atl.cpp:1421:34:1421:44 | call to ComPtr | atl.cpp:1422:73:1422:74 | p1 | |
+| atl.cpp:1421:34:1421:44 | call to ComPtr | atl.cpp:1435:1:1435:1 | p1 | |
+| atl.cpp:1421:42:1421:42 | x | atl.cpp:1421:34:1421:43 | new | |
+| atl.cpp:1422:72:1422:72 | call to operator& | atl.cpp:1423:38:1423:39 | pp | |
+| atl.cpp:1422:73:1422:74 | ref arg p1 | atl.cpp:1435:1:1435:1 | p1 | |
+| atl.cpp:1423:37:1423:37 | call to operator* | atl.cpp:1424:9:1424:10 | qq | |
+| atl.cpp:1424:13:1424:15 | call to Get | atl.cpp:1424:8:1424:17 | * ... | TAINT |
+| atl.cpp:1426:40:1426:49 | new | atl.cpp:1426:40:1426:50 | call to ComPtr | TAINT |
+| atl.cpp:1426:40:1426:50 | call to ComPtr | atl.cpp:1427:80:1427:81 | p2 | |
+| atl.cpp:1426:40:1426:50 | call to ComPtr | atl.cpp:1435:1:1435:1 | p2 | |
+| atl.cpp:1426:48:1426:48 | x | atl.cpp:1426:40:1426:49 | new | |
+| atl.cpp:1427:79:1427:79 | call to operator& | atl.cpp:1428:45:1428:47 | pp2 | |
+| atl.cpp:1428:44:1428:44 | call to operator* | atl.cpp:1429:9:1429:11 | qq2 | |
+| atl.cpp:1429:14:1429:16 | call to Get | atl.cpp:1429:8:1429:18 | * ... | TAINT |
+| atl.cpp:1431:5:1431:5 | s | atl.cpp:1432:3:1432:3 | s | |
+| atl.cpp:1431:5:1431:5 | s | atl.cpp:1433:33:1433:33 | s | |
+| atl.cpp:1432:3:1432:3 | s [post update] | atl.cpp:1433:33:1433:33 | s | |
+| atl.cpp:1432:3:1432:21 | ... = ... | atl.cpp:1432:5:1432:5 | x [post update] | |
+| atl.cpp:1432:9:1432:19 | call to source | atl.cpp:1432:3:1432:21 | ... = ... | |
+| atl.cpp:1433:32:1433:33 | & ... | atl.cpp:1433:32:1433:34 | call to ComPtr | TAINT |
+| atl.cpp:1433:32:1433:33 | ref arg & ... | atl.cpp:1433:33:1433:33 | s [inner post update] | |
+| atl.cpp:1433:32:1433:34 | call to ComPtr | atl.cpp:1434:8:1434:9 | p3 | |
+| atl.cpp:1433:32:1433:34 | call to ComPtr | atl.cpp:1435:1:1435:1 | p3 | |
+| atl.cpp:1433:33:1433:33 | s | atl.cpp:1433:32:1433:33 | & ... | |
+| atl.cpp:1434:8:1434:9 | ref arg p3 | atl.cpp:1435:1:1435:1 | p3 | |
+| atl.cpp:1438:31:1438:32 | call to ComPtr | atl.cpp:1439:3:1439:4 | p1 | |
+| atl.cpp:1438:31:1438:32 | call to ComPtr | atl.cpp:1440:9:1440:10 | p1 | |
+| atl.cpp:1438:31:1438:32 | call to ComPtr | atl.cpp:1447:8:1447:9 | p1 | |
+| atl.cpp:1438:31:1438:32 | call to ComPtr | atl.cpp:1451:8:1451:9 | p1 | |
+| atl.cpp:1438:31:1438:32 | call to ComPtr | atl.cpp:1455:18:1455:19 | p1 | |
+| atl.cpp:1438:31:1438:32 | call to ComPtr | atl.cpp:1459:18:1459:19 | p1 | |
+| atl.cpp:1438:31:1438:32 | call to ComPtr | atl.cpp:1461:1:1461:1 | p1 | |
+| atl.cpp:1439:3:1439:4 | ref arg p1 | atl.cpp:1440:9:1440:10 | p1 | |
+| atl.cpp:1439:3:1439:4 | ref arg p1 | atl.cpp:1447:8:1447:9 | p1 | |
+| atl.cpp:1439:3:1439:4 | ref arg p1 | atl.cpp:1451:8:1451:9 | p1 | |
+| atl.cpp:1439:3:1439:4 | ref arg p1 | atl.cpp:1455:18:1455:19 | p1 | |
+| atl.cpp:1439:3:1439:4 | ref arg p1 | atl.cpp:1459:18:1459:19 | p1 | |
+| atl.cpp:1439:3:1439:4 | ref arg p1 | atl.cpp:1461:1:1461:1 | p1 | |
+| atl.cpp:1439:16:1439:26 | call to source | atl.cpp:1439:8:1439:29 | new | |
+| atl.cpp:1440:9:1440:10 | ref arg p1 | atl.cpp:1447:8:1447:9 | p1 | |
+| atl.cpp:1440:9:1440:10 | ref arg p1 | atl.cpp:1451:8:1451:9 | p1 | |
+| atl.cpp:1440:9:1440:10 | ref arg p1 | atl.cpp:1455:18:1455:19 | p1 | |
+| atl.cpp:1440:9:1440:10 | ref arg p1 | atl.cpp:1459:18:1459:19 | p1 | |
+| atl.cpp:1440:9:1440:10 | ref arg p1 | atl.cpp:1461:1:1461:1 | p1 | |
+| atl.cpp:1440:12:1440:14 | call to Get | atl.cpp:1440:8:1440:16 | * ... | TAINT |
+| atl.cpp:1442:31:1442:32 | call to ComPtr | atl.cpp:1443:3:1443:4 | p2 | |
+| atl.cpp:1442:31:1442:32 | call to ComPtr | atl.cpp:1444:9:1444:10 | p2 | |
+| atl.cpp:1442:31:1442:32 | call to ComPtr | atl.cpp:1461:1:1461:1 | p2 | |
+| atl.cpp:1443:3:1443:4 | ref arg p2 | atl.cpp:1444:9:1444:10 | p2 | |
+| atl.cpp:1443:3:1443:4 | ref arg p2 | atl.cpp:1461:1:1461:1 | p2 | |
+| atl.cpp:1443:17:1443:28 | call to source | atl.cpp:1443:8:1443:31 | new | |
+| atl.cpp:1444:9:1444:10 | ref arg p2 | atl.cpp:1461:1:1461:1 | p2 | |
+| atl.cpp:1444:12:1444:14 | call to Get | atl.cpp:1444:8:1444:16 | * ... | TAINT |
+| atl.cpp:1446:31:1446:32 | call to ComPtr | atl.cpp:1447:3:1447:4 | p3 | |
+| atl.cpp:1446:31:1446:32 | call to ComPtr | atl.cpp:1448:9:1448:10 | p3 | |
+| atl.cpp:1446:31:1446:32 | call to ComPtr | atl.cpp:1461:1:1461:1 | p3 | |
+| atl.cpp:1447:3:1447:4 | ref arg p3 | atl.cpp:1448:9:1448:10 | p3 | |
+| atl.cpp:1447:3:1447:4 | ref arg p3 | atl.cpp:1461:1:1461:1 | p3 | |
+| atl.cpp:1447:8:1447:9 | p1 | atl.cpp:1447:3:1447:4 | ref arg p3 | TAINT |
+| atl.cpp:1447:8:1447:9 | p1 | atl.cpp:1447:6:1447:6 | call to operator= | TAINT |
+| atl.cpp:1448:9:1448:10 | ref arg p3 | atl.cpp:1461:1:1461:1 | p3 | |
+| atl.cpp:1448:12:1448:14 | call to Get | atl.cpp:1448:8:1448:16 | * ... | TAINT |
+| atl.cpp:1450:32:1450:33 | call to ComPtr | atl.cpp:1451:3:1451:4 | p4 | |
+| atl.cpp:1450:32:1450:33 | call to ComPtr | atl.cpp:1452:9:1452:10 | p4 | |
+| atl.cpp:1450:32:1450:33 | call to ComPtr | atl.cpp:1461:1:1461:1 | p4 | |
+| atl.cpp:1451:3:1451:4 | ref arg p4 | atl.cpp:1452:9:1452:10 | p4 | |
+| atl.cpp:1451:3:1451:4 | ref arg p4 | atl.cpp:1461:1:1461:1 | p4 | |
+| atl.cpp:1452:9:1452:10 | ref arg p4 | atl.cpp:1461:1:1461:1 | p4 | |
+| atl.cpp:1452:12:1452:14 | call to Get | atl.cpp:1452:8:1452:16 | * ... | TAINT |
+| atl.cpp:1454:31:1454:32 | call to ComPtr | atl.cpp:1455:3:1455:4 | p5 | |
+| atl.cpp:1454:31:1454:32 | call to ComPtr | atl.cpp:1456:9:1456:10 | p5 | |
+| atl.cpp:1454:31:1454:32 | call to ComPtr | atl.cpp:1461:1:1461:1 | p5 | |
+| atl.cpp:1455:3:1455:4 | ref arg p5 | atl.cpp:1456:9:1456:10 | p5 | |
+| atl.cpp:1455:3:1455:4 | ref arg p5 | atl.cpp:1461:1:1461:1 | p5 | |
+| atl.cpp:1455:8:1455:16 | call to move | atl.cpp:1455:3:1455:4 | ref arg p5 | TAINT |
+| atl.cpp:1455:8:1455:16 | call to move | atl.cpp:1455:6:1455:6 | call to operator= | TAINT |
+| atl.cpp:1455:8:1455:16 | ref arg call to move | atl.cpp:1455:18:1455:19 | p1 [inner post update] | |
+| atl.cpp:1455:8:1455:16 | ref arg call to move | atl.cpp:1459:18:1459:19 | p1 | |
+| atl.cpp:1455:8:1455:16 | ref arg call to move | atl.cpp:1461:1:1461:1 | p1 | |
+| atl.cpp:1455:18:1455:19 | p1 | atl.cpp:1455:3:1455:4 | ref arg p5 | TAINT |
+| atl.cpp:1455:18:1455:19 | p1 | atl.cpp:1455:6:1455:6 | call to operator= | TAINT |
+| atl.cpp:1455:18:1455:19 | p1 | atl.cpp:1455:8:1455:16 | call to move | TAINT |
+| atl.cpp:1456:9:1456:10 | ref arg p5 | atl.cpp:1461:1:1461:1 | p5 | |
+| atl.cpp:1456:12:1456:14 | call to Get | atl.cpp:1456:8:1456:16 | * ... | TAINT |
+| atl.cpp:1458:32:1458:33 | call to ComPtr | atl.cpp:1459:3:1459:4 | p6 | |
+| atl.cpp:1458:32:1458:33 | call to ComPtr | atl.cpp:1460:9:1460:10 | p6 | |
+| atl.cpp:1458:32:1458:33 | call to ComPtr | atl.cpp:1461:1:1461:1 | p6 | |
+| atl.cpp:1459:3:1459:4 | ref arg p6 | atl.cpp:1460:9:1460:10 | p6 | |
+| atl.cpp:1459:3:1459:4 | ref arg p6 | atl.cpp:1461:1:1461:1 | p6 | |
+| atl.cpp:1459:8:1459:16 | ref arg call to move | atl.cpp:1459:18:1459:19 | p1 [inner post update] | |
+| atl.cpp:1459:8:1459:16 | ref arg call to move | atl.cpp:1461:1:1461:1 | p1 | |
+| atl.cpp:1459:18:1459:19 | p1 | atl.cpp:1459:8:1459:16 | call to move | TAINT |
+| atl.cpp:1460:9:1460:10 | ref arg p6 | atl.cpp:1461:1:1461:1 | p6 | |
+| atl.cpp:1460:12:1460:14 | call to Get | atl.cpp:1460:8:1460:16 | * ... | TAINT |
| bsd.cpp:17:11:17:16 | call to source | bsd.cpp:20:18:20:18 | s | |
| bsd.cpp:18:12:18:15 | addr | bsd.cpp:20:22:20:25 | addr | |
| bsd.cpp:18:12:18:15 | addr | bsd.cpp:23:8:23:11 | addr | |
@@ -7767,6 +7984,10 @@ WARNING: module 'TaintTracking' has been deprecated and may be removed in future
| taint.cpp:830:20:830:34 | call to indirect_source | taint.cpp:832:23:832:24 | in | |
| taint.cpp:831:15:831:17 | out | taint.cpp:832:18:832:20 | out | |
| taint.cpp:831:15:831:17 | out | taint.cpp:833:8:833:10 | out | |
+| taint.cpp:841:21:841:35 | call to indirect_source | taint.cpp:842:11:842:12 | fp | |
+| taint.cpp:841:21:841:35 | call to indirect_source | taint.cpp:843:16:843:17 | fp | |
+| taint.cpp:842:11:842:12 | ref arg fp | taint.cpp:843:16:843:17 | fp | |
+| taint.cpp:842:15:842:16 | | taint.cpp:842:11:842:12 | ref arg fp | TAINT |
| thread.cpp:10:27:10:27 | s | thread.cpp:10:27:10:27 | s | |
| thread.cpp:10:27:10:27 | s | thread.cpp:11:8:11:8 | s | |
| thread.cpp:14:26:14:26 | s | thread.cpp:15:8:15:8 | s | |
diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp
index 74bcf26ea7d2..0c09665de1cd 100644
--- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp
+++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.cpp
@@ -831,4 +831,15 @@ void test_write_to_const_ptr_ptr() {
const char* out;
take_const_ptr(out, in);
sink(out); // $ SPURIOUS: ast
+}
+
+void indirect_sink(FILE *fp);
+int fprintf(FILE *fp, const char *format, ...);
+
+int f7(void)
+{
+ FILE* fp = (FILE*)indirect_source();
+ fprintf(fp, "");
+ indirect_sink(fp); // $ ir MISSING: ast
+ return 0;
}
\ No newline at end of file
diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.ql b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.ql
index f5f483cdf1b6..3bde6ca03f06 100644
--- a/cpp/ql/test/library-tests/dataflow/taint-tests/taint.ql
+++ b/cpp/ql/test/library-tests/dataflow/taint-tests/taint.ql
@@ -117,6 +117,11 @@ module IRTest {
call.getTarget().getName() = "sink" and
[sink.asExpr(), sink.asIndirectExpr()] = call.getAnArgument()
)
+ or
+ exists(FunctionCall call |
+ call.getTarget().getName() = "indirect_sink" and
+ sink.asIndirectExpr() = call.getAnArgument()
+ )
}
predicate isBarrier(DataFlow::Node barrier) {
diff --git a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected
index 239ed2ec607d..846359fd6b23 100644
--- a/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected
+++ b/cpp/ql/test/library-tests/dataflow/taint-tests/test_mad-signatures.expected
@@ -5567,6 +5567,31 @@ signatureMatches
| atl.cpp:1231:5:1231:12 | CStrBufT | (const char *,const char *,unsigned long) | | __ngettext | 2 |
| atl.cpp:1231:5:1231:12 | CStrBufT | (unsigned char *,int,unsigned long) | | UTF8_putc | 1 |
| atl.cpp:1231:5:1231:12 | CStrBufT | (unsigned char *,int,unsigned long) | | UTF8_putc | 2 |
+| atl.cpp:1286:5:1286:10 | ComPtr | (const ComPtr &) | ComPtr | ComPtr | 0 |
+| atl.cpp:1286:5:1286:10 | ComPtr | (const ComPtr &) | ComPtr | operator= | 0 |
+| atl.cpp:1287:5:1287:10 | ComPtr | (ComPtr &&) | ComPtr | ComPtr | 0 |
+| atl.cpp:1287:5:1287:10 | ComPtr | (ComPtr &&) | ComPtr | operator= | 0 |
+| atl.cpp:1290:5:1290:10 | ComPtr | (T *) | ComPtr | ComPtr | 0 |
+| atl.cpp:1290:5:1290:10 | ComPtr | (T *) | ComPtr | ComPtr | 0 |
+| atl.cpp:1290:5:1290:10 | ComPtr | (U *) | ComPtr | operator= | 0 |
+| atl.cpp:1290:5:1290:10 | ComPtr | (U *) | ComPtr | operator= | 0 |
+| atl.cpp:1301:13:1301:18 | CopyTo | (T **) | ComPtr | CopyTo | 0 |
+| atl.cpp:1303:13:1303:18 | CopyTo | (Curl_easy *,void **) | | Curl_resolver_init | 1 |
+| atl.cpp:1303:13:1303:18 | CopyTo | (REFIID,void **) | ComPtr | CopyTo | 0 |
+| atl.cpp:1303:13:1303:18 | CopyTo | (REFIID,void **) | ComPtr | CopyTo | 1 |
+| atl.cpp:1303:13:1303:18 | CopyTo | (size_t,void **) | | __libc_alloc_buffer_allocate | 1 |
+| atl.cpp:1306:13:1306:18 | CopyTo | (T **) | ComPtr | CopyTo | 0 |
+| atl.cpp:1328:13:1328:21 | operator= | (T *) | ComPtr | operator= | 0 |
+| atl.cpp:1330:13:1330:21 | operator= | (T *) | ComPtr | ComPtr | 0 |
+| atl.cpp:1330:13:1330:21 | operator= | (U *) | ComPtr | operator= | 0 |
+| atl.cpp:1331:13:1331:21 | operator= | (const ComPtr &) | ComPtr | ComPtr | 0 |
+| atl.cpp:1331:13:1331:21 | operator= | (const ComPtr &) | ComPtr | operator= | 0 |
+| atl.cpp:1333:13:1333:21 | operator= | (const ComPtr &) | ComPtr | ComPtr | 0 |
+| atl.cpp:1333:13:1333:21 | operator= | (const ComPtr &) | ComPtr | operator= | 0 |
+| atl.cpp:1334:13:1334:21 | operator= | (ComPtr &&) | ComPtr | ComPtr | 0 |
+| atl.cpp:1334:13:1334:21 | operator= | (ComPtr &&) | ComPtr | operator= | 0 |
+| atl.cpp:1336:13:1336:21 | operator= | (ComPtr &&) | ComPtr | ComPtr | 0 |
+| atl.cpp:1336:13:1336:21 | operator= | (ComPtr &&) | ComPtr | operator= | 0 |
| bsd.cpp:12:5:12:10 | accept | (CURLM *,curl_socket_t,int *) | | curl_multi_socket | 2 |
| bsd.cpp:12:5:12:10 | accept | (Curl_easy *,ssize_t *,int *) | | Curl_GetFTPResponse | 2 |
| bsd.cpp:12:5:12:10 | accept | (EVP_CIPHER_CTX *,unsigned char *,int *) | | EVP_CipherFinal | 2 |
@@ -9386,6 +9411,8 @@ signatureMatches
| stl.h:333:42:333:47 | insert | (const_iterator,InputIt,InputIt) | vector | insert | 2 |
| stl.h:333:42:333:47 | insert | (const_iterator,InputIt,InputIt) | vector | insert | 2 |
| stl.h:335:37:335:43 | emplace | (format_string,Args &&) | | format | 1 |
+| stl.h:351:12:351:21 | shared_ptr | (T *) | ComPtr | operator= | 0 |
+| stl.h:369:12:369:21 | unique_ptr | (T *) | ComPtr | operator= | 0 |
| stl.h:396:3:396:3 | pair | (const deque &,const Allocator &) | deque | deque | 1 |
| stl.h:396:3:396:3 | pair | (const deque &,const Allocator &) | deque | deque | 1 |
| stl.h:396:3:396:3 | pair | (const deque &,const Allocator &) | deque | deque | 1 |
@@ -17670,6 +17697,55 @@ signatureMatches
| taint.cpp:822:6:822:19 | take_const_ptr | (unsigned long *,const char *) | | set_cert_ex | 1 |
| taint.cpp:822:6:822:19 | take_const_ptr | (unsigned long *,const char *) | | set_name_ex | 1 |
| taint.cpp:822:6:822:19 | take_const_ptr | (uv_pipe_t *,const char *) | | uv_pipe_bind | 1 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_default_uflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_feof | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_ferror | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_file_close_mmap | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_file_underflow_mmap | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_ftell | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_getc | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_getwc | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_new_file_underflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_peekc_locked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_str_count | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_str_underflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_sungetc | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_sungetwc | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_wdefault_uflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_wfile_underflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_wfile_underflow_mmap | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_wstr_count | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | _IO_wstr_underflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __fbufsize | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __feof_unlocked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __ferror_unlocked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __fileno | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __flbf | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __fopen_maybe_mmap | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __fpending | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __ftello | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __fwriting | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __getc_unlocked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __getwc_unlocked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __uflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __underflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __wuflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | __wunderflow | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | feof_unlocked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | ferror_unlocked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | fgetc_unlocked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | fgetgrent | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | fgetpwent | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | fgetsgent | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | fgetspent | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | getc_unlocked | 0 |
+| taint.cpp:836:6:836:18 | indirect_sink | (FILE *) | | getmntent | 0 |
+| taint.cpp:837:5:837:11 | fprintf | (CURLSH *,CURLSHoption,...) | | curl_share_setopt | 2 |
+| taint.cpp:837:5:837:11 | fprintf | (Jim_Interp *,const char *,...) | | Jim_SetResultFormatted | 1 |
+| taint.cpp:837:5:837:11 | fprintf | (Jim_Interp *,const char *,...) | | Jim_SetResultFormatted | 2 |
+| taint.cpp:837:5:837:11 | fprintf | (char **,const char *,...) | | ___asprintf | 1 |
+| taint.cpp:837:5:837:11 | fprintf | (char **,const char *,...) | | ___asprintf | 2 |
+| taint.cpp:837:5:837:11 | fprintf | (curl_httppost **,curl_httppost **,...) | | curl_formadd | 2 |
| thread.cpp:4:6:4:9 | sink | (int) | | ASN1_STRING_type_new | 0 |
| thread.cpp:4:6:4:9 | sink | (int) | | ASN1_tag2bit | 0 |
| thread.cpp:4:6:4:9 | sink | (int) | | ASN1_tag2str | 0 |
@@ -21701,6 +21777,8 @@ getSignatureParameterName
| (CURLU *,const char *,char **,OperationConfig *) | | ipfs_url_rewrite | 1 | const char * |
| (CURLU *,const char *,char **,OperationConfig *) | | ipfs_url_rewrite | 2 | char ** |
| (CURLU *,const char *,char **,OperationConfig *) | | ipfs_url_rewrite | 3 | OperationConfig * |
+| (ComPtr &&) | ComPtr | ComPtr | 0 | ComPtr && |
+| (ComPtr &&) | ComPtr | operator= | 0 | ComPtr && |
| (CompoundDictionary *,const PreparedDictionary *) | | AttachPreparedDictionary | 0 | CompoundDictionary * |
| (CompoundDictionary *,const PreparedDictionary *) | | AttachPreparedDictionary | 1 | const PreparedDictionary * |
| (Curl_cfilter *) | | Curl_conn_cf_is_ssl | 0 | Curl_cfilter * |
@@ -28531,6 +28609,8 @@ getSignatureParameterName
| (RAND_POOL *,unsigned int) | | ossl_rand_pool_bytes_needed | 1 | unsigned int |
| (RECORD_LAYER *,SSL_CONNECTION *) | | RECORD_LAYER_init | 0 | RECORD_LAYER * |
| (RECORD_LAYER *,SSL_CONNECTION *) | | RECORD_LAYER_init | 1 | SSL_CONNECTION * |
+| (REFIID,void **) | ComPtr | CopyTo | 0 | REFIID |
+| (REFIID,void **) | ComPtr | CopyTo | 1 | void ** |
| (RIO_NOTIFIER *) | | ossl_rio_notifier_cleanup | 0 | RIO_NOTIFIER * |
| (RIPEMD160_CTX *,const unsigned char *) | | RIPEMD160_Transform | 0 | RIPEMD160_CTX * |
| (RIPEMD160_CTX *,const unsigned char *) | | RIPEMD160_Transform | 1 | const unsigned char * |
@@ -30114,6 +30194,10 @@ getSignatureParameterName
| (Strtab *,const char *,size_t) | | strtabadd | 2 | size_t |
| (Strtab *,size_t *) | | strtabfinalize | 0 | Strtab * |
| (Strtab *,size_t *) | | strtabfinalize | 1 | size_t * |
+| (T *) | ComPtr | ComPtr | 0 | func:0 * |
+| (T *) | ComPtr | operator= | 0 | class:0 * |
+| (T **) | ComPtr | CopyTo | 0 | func:0 ** |
+| (T **) | ComPtr | CopyTo | 0 | class:0 ** |
| (TLS_FEATURE *) | | TLS_FEATURE_free | 0 | TLS_FEATURE * |
| (TLS_RL_RECORD *,const unsigned char *) | | ossl_tls_rl_record_set_seq_num | 0 | TLS_RL_RECORD * |
| (TLS_RL_RECORD *,const unsigned char *) | | ossl_tls_rl_record_set_seq_num | 1 | const unsigned char * |
@@ -30306,6 +30390,7 @@ getSignatureParameterName
| (TXT_DB *,int,..(*)(..),OPENSSL_LH_HASHFUNC,OPENSSL_LH_COMPFUNC) | | TXT_DB_create_index | 2 | ..(*)(..) |
| (TXT_DB *,int,..(*)(..),OPENSSL_LH_HASHFUNC,OPENSSL_LH_COMPFUNC) | | TXT_DB_create_index | 3 | OPENSSL_LH_HASHFUNC |
| (TXT_DB *,int,..(*)(..),OPENSSL_LH_HASHFUNC,OPENSSL_LH_COMPFUNC) | | TXT_DB_create_index | 4 | OPENSSL_LH_COMPFUNC |
+| (U *) | ComPtr | operator= | 0 | func:0 * |
| (UI *) | | UI_get0_user_data | 0 | UI * |
| (UI *) | | UI_get_method | 0 | UI * |
| (UI *,UI_STRING *,const char *) | | UI_set_result | 0 | UI * |
@@ -33256,6 +33341,8 @@ getSignatureParameterName
| (const CURLU *,CURLUPart,char **,unsigned int) | | curl_url_get | 1 | CURLUPart |
| (const CURLU *,CURLUPart,char **,unsigned int) | | curl_url_get | 2 | char ** |
| (const CURLU *,CURLUPart,char **,unsigned int) | | curl_url_get | 3 | unsigned int |
+| (const ComPtr &) | ComPtr | ComPtr | 0 | const ComPtr & |
+| (const ComPtr &) | ComPtr | operator= | 0 | const ComPtr & |
| (const Command *,const size_t,const BlockSplit *,const BlockSplit *,const BlockSplit *,const uint8_t *,size_t,size_t,uint8_t,uint8_t,const ContextType *,HistogramLiteral *,HistogramCommand *,HistogramDistance *) | | BrotliBuildHistogramsWithContext | 0 | const Command * |
| (const Command *,const size_t,const BlockSplit *,const BlockSplit *,const BlockSplit *,const uint8_t *,size_t,size_t,uint8_t,uint8_t,const ContextType *,HistogramLiteral *,HistogramCommand *,HistogramDistance *) | | BrotliBuildHistogramsWithContext | 1 | const size_t |
| (const Command *,const size_t,const BlockSplit *,const BlockSplit *,const BlockSplit *,const uint8_t *,size_t,size_t,uint8_t,uint8_t,const ContextType *,HistogramLiteral *,HistogramCommand *,HistogramDistance *) | | BrotliBuildHistogramsWithContext | 2 | const BlockSplit * |
@@ -46355,6 +46442,27 @@ getParameterTypeName
| atl.cpp:1231:5:1231:12 | CStrBufT | 1 | int |
| atl.cpp:1231:5:1231:12 | CStrBufT | 2 | DWORD |
| atl.cpp:1231:5:1231:12 | CStrBufT | 2 | unsigned long |
+| atl.cpp:1286:5:1286:10 | ComPtr | 0 | const ComPtr & |
+| atl.cpp:1287:5:1287:10 | ComPtr | 0 | ComPtr && |
+| atl.cpp:1290:5:1290:10 | ComPtr | 0 | func:0 * |
+| atl.cpp:1290:5:1290:10 | ComPtr | 0 | func:0 * |
+| atl.cpp:1295:13:1295:14 | As | 0 | ComPtr * |
+| atl.cpp:1301:13:1301:18 | CopyTo | 0 | Interfaceclass:0ype ** |
+| atl.cpp:1301:13:1301:18 | CopyTo | 0 | class:0 ** |
+| atl.cpp:1303:13:1303:18 | CopyTo | 0 | GUID * |
+| atl.cpp:1303:13:1303:18 | CopyTo | 0 | REFIID |
+| atl.cpp:1303:13:1303:18 | CopyTo | 1 | void ** |
+| atl.cpp:1306:13:1306:18 | CopyTo | 0 | func:0 ** |
+| atl.cpp:1321:10:1321:13 | Swap | 0 | ComPtr & |
+| atl.cpp:1328:13:1328:21 | operator= | 0 | class:0 * |
+| atl.cpp:1330:13:1330:21 | operator= | 0 | func:0 * |
+| atl.cpp:1331:13:1331:21 | operator= | 0 | const ComPtr & |
+| atl.cpp:1333:13:1333:21 | operator= | 0 | const ComPtr & |
+| atl.cpp:1334:13:1334:21 | operator= | 0 | ComPtr && |
+| atl.cpp:1336:13:1336:21 | operator= | 0 | ComPtr && |
+| atl.cpp:1343:25:1343:28 | move | 0 | func:0 & |
+| atl.cpp:1415:8:1415:8 | operator= | 0 | S && |
+| atl.cpp:1415:8:1415:8 | operator= | 0 | const S & |
| bsd.cpp:6:8:6:8 | operator= | 0 | const sockaddr & |
| bsd.cpp:6:8:6:8 | operator= | 0 | sockaddr && |
| bsd.cpp:12:5:12:10 | accept | 0 | int |
@@ -47191,6 +47299,10 @@ getParameterTypeName
| taint.cpp:817:6:817:27 | write_to_const_ptr_ptr | 1 | const char ** |
| taint.cpp:822:6:822:19 | take_const_ptr | 0 | const char * |
| taint.cpp:822:6:822:19 | take_const_ptr | 1 | const char * |
+| taint.cpp:836:6:836:18 | indirect_sink | 0 | FILE * |
+| taint.cpp:837:5:837:11 | fprintf | 0 | FILE * |
+| taint.cpp:837:5:837:11 | fprintf | 1 | const char * |
+| taint.cpp:837:5:837:11 | fprintf | 2 | ... |
| thread.cpp:4:6:4:9 | sink | 0 | int |
| thread.cpp:6:8:6:8 | operator= | 0 | S && |
| thread.cpp:6:8:6:8 | operator= | 0 | const S & |
diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
index 6e62071e7d97..c3085da03ab5 100644
--- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
+++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected
@@ -24550,6 +24550,37 @@ ir.cpp:
# 2771| Type = [LValueReferenceType] ThreeWay &
# 2771| ValueCategory = prvalue
# 2772| getStmt(2): [ReturnStmt] return ...
+# 2774| [TopLevelFunction] void test_allocation_with_initializer()
+# 2774| :
+# 2774| getEntryPoint(): [BlockStmt] { ... }
+# 2775| getStmt(0): [DeclStmt] declaration
+# 2775| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p1
+# 2775| Type = [IntPointerType] int *
+# 2775| getVariable().getInitializer(): [Initializer] initializer for p1
+# 2775| getExpr(): [NewExpr] new
+# 2775| Type = [IntPointerType] int *
+# 2775| ValueCategory = prvalue
+# 2775| getInitializer(): [Literal] 42
+# 2775| Type = [IntType] int
+# 2775| Value = [Literal] 42
+# 2775| ValueCategory = prvalue
+# 2776| getStmt(1): [DeclStmt] declaration
+# 2776| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p2
+# 2776| Type = [PointerType] long *
+# 2776| getVariable().getInitializer(): [Initializer] initializer for p2
+# 2776| getExpr(): [NewExpr] new
+# 2776| Type = [PointerType] long *
+# 2776| ValueCategory = prvalue
+# 2776| getInitializer(): [Literal] 42
+# 2776| Type = [IntType] int
+# 2776| Value = [Literal] 42
+# 2776| ValueCategory = prvalue
+# 2776| getInitializer().getFullyConverted(): [CStyleCast] (long)...
+# 2776| Conversion = [IntegralConversion] integral conversion
+# 2776| Type = [LongType] long
+# 2776| Value = [CStyleCast] 42
+# 2776| ValueCategory = prvalue
+# 2777| getStmt(2): [ReturnStmt] return ...
ir23.cpp:
# 1| [TopLevelFunction] bool consteval_1()
# 1| :
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 6bf6801a48bd..d8babdb54e20 100644
--- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected
@@ -20395,6 +20395,41 @@ ir.cpp:
# 2769| v2769_14(void) = AliasedUse : ~m2771_8
# 2769| v2769_15(void) = ExitFunction :
+# 2774| void test_allocation_with_initializer()
+# 2774| Block 0
+# 2774| v2774_1(void) = EnterFunction :
+# 2774| m2774_2(unknown) = AliasedDefinition :
+# 2774| m2774_3(unknown) = InitializeNonLocal :
+# 2774| m2774_4(unknown) = Chi : total:m2774_2, partial:m2774_3
+# 2775| r2775_1(glval) = VariableAddress[p1] :
+# 2775| r2775_2(glval) = FunctionAddress[operator new] :
+# 2775| r2775_3(unsigned long) = Constant[4] :
+# 2775| r2775_4(void *) = Call[operator new] : func:r2775_2, 0:r2775_3
+# 2775| m2775_5(unknown) = ^CallSideEffect : ~m2774_4
+# 2775| m2775_6(unknown) = Chi : total:m2774_4, partial:m2775_5
+# 2775| m2775_7(unknown) = ^InitializeDynamicAllocation : &:r2775_4
+# 2775| r2775_8(int *) = Convert : r2775_4
+# 2775| r2775_9(int) = Constant[42] :
+# 2775| m2775_10(int) = Store[?] : &:r2775_8, r2775_9
+# 2775| m2775_11(unknown) = Chi : total:m2775_7, partial:m2775_10
+# 2775| m2775_12(int *) = Store[p1] : &:r2775_1, r2775_8
+# 2776| r2776_1(glval) = VariableAddress[p2] :
+# 2776| r2776_2(glval) = FunctionAddress[operator new] :
+# 2776| r2776_3(unsigned long) = Constant[8] :
+# 2776| r2776_4(void *) = Call[operator new] : func:r2776_2, 0:r2776_3
+# 2776| m2776_5(unknown) = ^CallSideEffect : ~m2775_6
+# 2776| m2776_6(unknown) = Chi : total:m2775_6, partial:m2776_5
+# 2776| m2776_7(unknown) = ^InitializeDynamicAllocation : &:r2776_4
+# 2776| r2776_8(long *) = Convert : r2776_4
+# 2776| r2776_9(long) = Constant[42] :
+# 2776| m2776_10(long) = Store[?] : &:r2776_8, r2776_9
+# 2776| m2776_11(unknown) = Chi : total:m2776_7, partial:m2776_10
+# 2776| m2776_12(long *) = Store[p2] : &:r2776_1, r2776_8
+# 2777| v2777_1(void) = NoOp :
+# 2774| v2774_5(void) = ReturnVoid :
+# 2774| v2774_6(void) = AliasedUse : ~m2776_6
+# 2774| v2774_7(void) = ExitFunction :
+
ir23.cpp:
# 1| bool consteval_1()
# 1| Block 0
diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp
index 74c41c7e916b..66af788db12d 100644
--- a/cpp/ql/test/library-tests/ir/ir/ir.cpp
+++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp
@@ -2771,4 +2771,9 @@ void test_three_way(int a, int b, ThreeWay c, ThreeWay d) {
auto y = c <=> d;
}
+void test_allocation_with_initializer() {
+ int* p1 = new int(42);
+ long* p2 = new long(42);
+}
+
// semmle-extractor-options: -std=c++20 --clang
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 bf4cef8c3f49..a567c651ca24 100644
--- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
+++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected
@@ -18547,6 +18547,36 @@ ir.cpp:
# 2769| v2769_13(void) = AliasedUse : ~m?
# 2769| v2769_14(void) = ExitFunction :
+# 2774| void test_allocation_with_initializer()
+# 2774| Block 0
+# 2774| v2774_1(void) = EnterFunction :
+# 2774| mu2774_2(unknown) = AliasedDefinition :
+# 2774| mu2774_3(unknown) = InitializeNonLocal :
+# 2775| r2775_1(glval) = VariableAddress[p1] :
+# 2775| r2775_2(glval) = FunctionAddress[operator new] :
+# 2775| r2775_3(unsigned long) = Constant[4] :
+# 2775| r2775_4(void *) = Call[operator new] : func:r2775_2, 0:r2775_3
+# 2775| mu2775_5(unknown) = ^CallSideEffect : ~m?
+# 2775| mu2775_6(unknown) = ^InitializeDynamicAllocation : &:r2775_4
+# 2775| r2775_7(int *) = Convert : r2775_4
+# 2775| r2775_8(int) = Constant[42] :
+# 2775| mu2775_9(int) = Store[?] : &:r2775_7, r2775_8
+# 2775| mu2775_10(int *) = Store[p1] : &:r2775_1, r2775_7
+# 2776| r2776_1(glval) = VariableAddress[p2] :
+# 2776| r2776_2(glval) = FunctionAddress[operator new] :
+# 2776| r2776_3(unsigned long) = Constant[8] :
+# 2776| r2776_4(void *) = Call[operator new] : func:r2776_2, 0:r2776_3
+# 2776| mu2776_5(unknown) = ^CallSideEffect : ~m?
+# 2776| mu2776_6(unknown) = ^InitializeDynamicAllocation : &:r2776_4
+# 2776| r2776_7(long *) = Convert : r2776_4
+# 2776| r2776_8(long) = Constant[42] :
+# 2776| mu2776_9(long) = Store[?] : &:r2776_7, r2776_8
+# 2776| mu2776_10(long *) = Store[p2] : &:r2776_1, r2776_7
+# 2777| v2777_1(void) = NoOp :
+# 2774| v2774_4(void) = ReturnVoid :
+# 2774| v2774_5(void) = AliasedUse : ~m?
+# 2774| v2774_6(void) = ExitFunction :
+
ir23.cpp:
# 1| bool consteval_1()
# 1| Block 0
diff --git a/cpp/ql/test/library-tests/macros/arguments/macro_arguments.expected b/cpp/ql/test/library-tests/macros/arguments/macro_arguments.expected
index 0ddac7d27a6f..5a18945cc0f6 100644
--- a/cpp/ql/test/library-tests/macros/arguments/macro_arguments.expected
+++ b/cpp/ql/test/library-tests/macros/arguments/macro_arguments.expected
@@ -23,7 +23,7 @@
| test.c:27:17:33:1 | test.c:27:17:33:1 | CONCAT | 1 | "Semmle" | "Semmle" |
| test.c:42:1:42:13 | test.c:42:1:42:13 | APPLY | 0 | top | top |
| test.c:42:1:42:13 | test.c:42:1:42:13 | APPLY | 1 | 3 | 3 |
-| test.c:42:1:42:13 | test.c:42:7:41:24 | APPLY -> top | 0 | 3 | 3 |
+| test.c:42:1:42:13 | test.c:42:7:42:7 | APPLY -> top | 0 | 3 | 3 |
| test.c:42:1:42:13 | top_and_nested.h:2:16:2:24 | APPLY -> top -> nested | 0 | 3 | |
| test.c:42:1:42:13 | top_and_nested.h:3:16:3:30 | APPLY -> top -> nested | 0 | 2 + (3) | |
| test.c:47:1:47:23 | test.c:45:15:45:22 | DECLARE_STRING -> ID | 0 | string1 | string1 |
@@ -49,7 +49,7 @@
| test.c:82:1:82:4 | test.c:82:1:82:4 | ID | 0 | | |
| test.c:84:5:84:20 | test.c:84:5:84:20 | APPLY | 0 | ID | ID |
| test.c:84:5:84:20 | test.c:84:5:84:20 | APPLY | 1 | ID(1) | 1 |
-| test.c:84:5:84:20 | test.c:84:11:41:24 | APPLY -> ID | 0 | 1 | 1 |
+| test.c:84:5:84:20 | test.c:84:11:84:11 | APPLY -> ID | 0 | 1 | 1 |
| test.c:84:5:84:20 | test.c:84:15:84:19 | APPLY -> ID | 0 | 1 | 1 |
| test.c:85:21:85:40 | test.c:85:21:85:40 | CMD_LINE_MACRO | 0 | 5 | 5 |
| test.c:85:21:85:40 | test.c:85:21:85:40 | CMD_LINE_MACRO | 1 | 6 | 6 |
diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/tests/ms_vacopy.c b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/tests/ms_vacopy.c
new file mode 100644
index 000000000000..4aef7d79eb57
--- /dev/null
+++ b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/tests/ms_vacopy.c
@@ -0,0 +1,8 @@
+#include
+
+int va_copy_test(va_list va) {
+ va_list va2;
+ va_copy(va2, va);
+ return 0;
+}
+// semmle-extractor-options: --microsoft
diff --git a/csharp/codeql-extractor.yml b/csharp/codeql-extractor.yml
index c4d7352cc439..786b78950ca1 100644
--- a/csharp/codeql-extractor.yml
+++ b/csharp/codeql-extractor.yml
@@ -10,6 +10,8 @@ build_modes:
- autobuild
- manual
- none
+default_queries:
+ - codeql/csharp-queries
github_api_languages:
- C#
scc_languages:
diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md
index c276cd6133e6..7f3f4d436831 100644
--- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md
+++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.7.47
+
+No user-facing changes.
+
## 1.7.46
No user-facing changes.
diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.47.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.47.md
new file mode 100644
index 000000000000..afc26600b73c
--- /dev/null
+++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.47.md
@@ -0,0 +1,3 @@
+## 1.7.47
+
+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 a39de8bc91c1..21f0fc0de3c1 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.46
+lastReleaseVersion: 1.7.47
diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml
index d9430bc679ce..eec8eedc6568 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.46
+version: 1.7.47
groups:
- csharp
- solorigate
diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md
index c276cd6133e6..7f3f4d436831 100644
--- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md
+++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.7.47
+
+No user-facing changes.
+
## 1.7.46
No user-facing changes.
diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.47.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.47.md
new file mode 100644
index 000000000000..afc26600b73c
--- /dev/null
+++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.47.md
@@ -0,0 +1,3 @@
+## 1.7.47
+
+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 a39de8bc91c1..21f0fc0de3c1 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.46
+lastReleaseVersion: 1.7.47
diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml
index 747eaaec33b9..165e362e6c6f 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.46
+version: 1.7.47
groups:
- csharp
- solorigate
diff --git a/csharp/ql/consistency-queries/CfgConsistency.ql b/csharp/ql/consistency-queries/CfgConsistency.ql
index 3caf64f9aece..d7f0c091538d 100644
--- a/csharp/ql/consistency-queries/CfgConsistency.ql
+++ b/csharp/ql/consistency-queries/CfgConsistency.ql
@@ -29,7 +29,7 @@ predicate bbSuccInconsistency(ControlFlowElement pred, ControlFlowElement succ)
succBB.getFirstNode() = succ.getAControlFlowNode()
) and
not exists(PreBasicBlock predBB, PreBasicBlock succBB |
- predBB.getLastElement() = pred and
+ predBB.getLastNode() = pred and
succBB = predBB.getASuccessor() and
succBB.getFirstElement() = succ
)
@@ -41,12 +41,12 @@ predicate bbIntraSuccInconsistency(ControlFlowElement pred, ControlFlowElement s
succ.getAControlFlowNode() = bb.getNode(i + 1)
) and
not exists(PreBasicBlock bb |
- bb.getLastElement() = pred and
+ bb.getLastNode() = pred and
bb.getASuccessor().getFirstElement() = succ
) and
not exists(PreBasicBlock bb, int i |
- bb.getElement(i) = pred and
- bb.getElement(i + 1) = succ
+ bb.getNode(i) = pred and
+ bb.getNode(i + 1) = succ
)
}
diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md
index 9e3686d8267d..0aca82e83107 100644
--- a/csharp/ql/lib/CHANGELOG.md
+++ b/csharp/ql/lib/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 5.2.3
+
+### Minor Analysis Improvements
+
+* A bug has been fixed in the data flow analysis, which means that flow through calls using the `base` qualifier may now be tracked more accurately.
+* Added summary models for `System.Xml.XmlReader`, `System.Xml.XmlTextReader` and `System.Xml.XmlDictionaryReader`.
+* Models-as-data summaries for byte and char arrays and pointers now treat the entire collection as tainted, reflecting their common use as string alternatives.
+* The default taint tracking configuration now allows implicit reads from collections at sinks and in additional flow steps. This increases flow coverage for many taint tracking queries and helps reduce false negatives.
+
## 5.2.2
No user-facing changes.
diff --git a/csharp/ql/lib/change-notes/released/5.2.3.md b/csharp/ql/lib/change-notes/released/5.2.3.md
new file mode 100644
index 000000000000..b98913104193
--- /dev/null
+++ b/csharp/ql/lib/change-notes/released/5.2.3.md
@@ -0,0 +1,8 @@
+## 5.2.3
+
+### Minor Analysis Improvements
+
+* A bug has been fixed in the data flow analysis, which means that flow through calls using the `base` qualifier may now be tracked more accurately.
+* Added summary models for `System.Xml.XmlReader`, `System.Xml.XmlTextReader` and `System.Xml.XmlDictionaryReader`.
+* Models-as-data summaries for byte and char arrays and pointers now treat the entire collection as tainted, reflecting their common use as string alternatives.
+* The default taint tracking configuration now allows implicit reads from collections at sinks and in additional flow steps. This increases flow coverage for many taint tracking queries and helps reduce false negatives.
diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml
index e3b1b0c079d8..f7fd1ec5b57a 100644
--- a/csharp/ql/lib/codeql-pack.release.yml
+++ b/csharp/ql/lib/codeql-pack.release.yml
@@ -1,2 +1,2 @@
---
-lastReleaseVersion: 5.2.2
+lastReleaseVersion: 5.2.3
diff --git a/csharp/ql/lib/ext/System.IO.model.yml b/csharp/ql/lib/ext/System.IO.model.yml
index 0b8b52d9e8a5..549c324d66eb 100644
--- a/csharp/ql/lib/ext/System.IO.model.yml
+++ b/csharp/ql/lib/ext/System.IO.model.yml
@@ -77,7 +77,7 @@ extensions:
- ["System.IO", "Path", False, "GetPathRoot", "(System.ReadOnlySpan)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
- ["System.IO", "Path", False, "GetPathRoot", "(System.String)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System.IO", "Path", False, "GetRelativePath", "(System.String,System.String)", "", "Argument[1]", "ReturnValue", "taint", "manual"]
- - ["System.IO", "Stream", True, "BeginRead", "(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
+ - ["System.IO", "Stream", True, "BeginRead", "(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
- ["System.IO", "Stream", True, "BeginWrite", "(System.Byte[],System.Int32,System.Int32,System.AsyncCallback,System.Object)", "", "Argument[0].Element", "Argument[this]", "taint", "manual"]
- ["System.IO", "Stream", False, "CopyTo", "(System.IO.Stream)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
- ["System.IO", "Stream", True, "CopyTo", "(System.IO.Stream,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
@@ -85,17 +85,17 @@ extensions:
- ["System.IO", "Stream", False, "CopyToAsync", "(System.IO.Stream,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
- ["System.IO", "Stream", True, "CopyToAsync", "(System.IO.Stream,System.Int32,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
- ["System.IO", "Stream", False, "CopyToAsync", "(System.IO.Stream,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
- - ["System.IO", "Stream", True, "Read", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "Stream", True, "Read", "(System.Span)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "Stream", False, "ReadAsync", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "Stream", True, "ReadAsync", "(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
+ - ["System.IO", "Stream", True, "Read", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "Stream", True, "Read", "(System.Span)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "Stream", False, "ReadAsync", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "Stream", True, "ReadAsync", "(System.Byte[],System.Int32,System.Int32,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
# Post-update nodes for `Memory` are currently unsupported. This model is provided for completeness
- - ["System.IO", "Stream", True, "ReadAsync", "(System.Memory,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "Stream", True, "ReadAtLeast", "(System.Span,System.Int32,System.Boolean)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
+ - ["System.IO", "Stream", True, "ReadAsync", "(System.Memory,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "Stream", True, "ReadAtLeast", "(System.Span,System.Int32,System.Boolean)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
# Post-update nodes for `Memory` are currently unsupported. This model is provided for completeness
- ["System.IO", "Stream", True, "ReadAtLeastAsync", "(System.Memory,System.Int32,System.Boolean,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
- - ["System.IO", "Stream", True, "ReadExactly", "(System.Span)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "Stream", True, "ReadExactly", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
+ - ["System.IO", "Stream", True, "ReadExactly", "(System.Span)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "Stream", True, "ReadExactly", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
- ["System.IO", "Stream", True, "Write", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[0].Element", "Argument[this]", "taint", "manual"]
- ["System.IO", "Stream", True, "Write", "(System.ReadOnlySpan)", "", "Argument[0].Element", "Argument[this]", "taint", "manual"]
- ["System.IO", "Stream", False, "WriteAsync", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[0].Element", "Argument[this]", "taint", "manual"]
@@ -128,16 +128,16 @@ extensions:
- ["System.IO", "StringWriter", True, "WriteLineAsync", "(System.String)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["System.IO", "StringWriter", True, "WriteLineAsync", "(System.Text.StringBuilder,System.Threading.CancellationToken)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["System.IO", "TextReader", True, "Read", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- - ["System.IO", "TextReader", True, "Read", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "TextReader", True, "Read", "(System.Span)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "TextReader", True, "ReadAsync", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
+ - ["System.IO", "TextReader", True, "Read", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "TextReader", True, "Read", "(System.Span)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "TextReader", True, "ReadAsync", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
# Post-update nodes for `Memory` are currently unsupported. This model is provided for completeness
- - ["System.IO", "TextReader", True, "ReadAsync", "(System.Memory,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "TextReader", True, "ReadBlock", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "TextReader", True, "ReadBlock", "(System.Span)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
- - ["System.IO", "TextReader", True, "ReadBlockAsync", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
+ - ["System.IO", "TextReader", True, "ReadAsync", "(System.Memory,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "TextReader", True, "ReadBlock", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "TextReader", True, "ReadBlock", "(System.Span)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.IO", "TextReader", True, "ReadBlockAsync", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
# Post-update nodes for `Memory` are currently unsupported. This model is provided for completeness
- - ["System.IO", "TextReader", True, "ReadBlockAsync", "(System.Memory,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0].Element", "taint", "manual"]
+ - ["System.IO", "TextReader", True, "ReadBlockAsync", "(System.Memory,System.Threading.CancellationToken)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
- ["System.IO", "TextReader", True, "ReadLine", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["System.IO", "TextReader", True, "ReadLineAsync", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["System.IO", "TextReader", True, "ReadToEnd", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
diff --git a/csharp/ql/lib/ext/System.Xml.model.yml b/csharp/ql/lib/ext/System.Xml.model.yml
index efea34b40dbe..a6ed8dd465d5 100644
--- a/csharp/ql/lib/ext/System.Xml.model.yml
+++ b/csharp/ql/lib/ext/System.Xml.model.yml
@@ -23,6 +23,17 @@ extensions:
- ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[1]", "ReturnValue", "taint", "manual"]
- ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.IXmlDictionary,System.Xml.XmlDictionaryReaderQuotas,System.Xml.XmlBinaryReaderSession,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[3]", "ReturnValue", "taint", "manual"]
- ["System.Xml", "XmlDictionaryReader", False, "CreateBinaryReader", "(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlDictionaryReader", False, "CreateTextReader", "(System.Byte[],System.Int32,System.Int32,System.Text.Encoding,System.Xml.XmlDictionaryReaderQuotas,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", False, "CreateTextReader", "(System.Byte[],System.Int32,System.Int32,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", False, "CreateTextReader", "(System.Byte[],System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", False, "CreateTextReader", "(System.IO.Stream,System.Text.Encoding,System.Xml.XmlDictionaryReaderQuotas,System.Xml.OnXmlDictionaryReaderClose)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", False, "CreateTextReader", "(System.IO.Stream,System.Xml.XmlDictionaryReaderQuotas)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", True, "ReadContentAsBase64", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", True, "ReadContentAsBinHex", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", True, "ReadContentAsBinHex", "(System.Int32)", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", True, "ReadContentAsChars", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", True, "ReadElementContentAsBase64", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlDictionaryReader", True, "ReadElementContentAsBinHex", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
- ["System.Xml", "XmlDocument", False, "Load", "(System.IO.Stream)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["System.Xml", "XmlDocument", False, "Load", "(System.IO.TextReader)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
- ["System.Xml", "XmlDocument", False, "Load", "(System.String)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
@@ -68,3 +79,68 @@ extensions:
- ["System.Xml", "XmlReader", False, "Create", "(System.String,System.Xml.XmlReaderSettings)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System.Xml", "XmlReader", False, "Create", "(System.String,System.Xml.XmlReaderSettings,System.Xml.XmlParserContext)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System.Xml", "XmlReader", False, "Create", "(System.Xml.XmlReader,System.Xml.XmlReaderSettings)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "GetAttribute", "(System.Int32)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "GetAttribute", "(System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "GetAttribute", "(System.String,System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "GetValueAsync", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "LookupNamespace", "(System.String)", "", "Argument[0]", "ReturnValue", "value", "dfc-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAs", "(System.Type,System.Xml.IXmlNamespaceResolver)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsAsync", "(System.Type,System.Xml.IXmlNamespaceResolver)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsBase64", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsBase64Async", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsBinHex", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsBinHexAsync", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsObject", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsObjectAsync", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsString", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadContentAsStringAsync", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAs", "(System.Type,System.Xml.IXmlNamespaceResolver,System.String,System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsAsync", "(System.Type,System.Xml.IXmlNamespaceResolver)", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsBase64", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsBase64Async", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsBinHex", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsBinHexAsync", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsObject", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsObject", "(System.String,System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsString", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementContentAsString", "(System.String,System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementString", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementString", "(System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadElementString", "(System.String,System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadInnerXml", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadInnerXmlAsync", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadOuterXml", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadOuterXmlAsync", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadString", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadSubtree", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "ReadValueChunk", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "ReadValueChunkAsync", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlReader", True, "get_BaseURI", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_Item", "(System.Int32)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_Item", "(System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_Item", "(System.String,System.String)", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_LocalName", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_Name", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_NameTable", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_NamespaceURI", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_Prefix", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlReader", True, "get_SchemaInfo", "()", "", "Argument[this]", "ReturnValue", "value", "dfc-manual"]
+ - ["System.Xml", "XmlReader", True, "get_Value", "()", "", "Argument[this]", "ReturnValue", "taint", "df-manual"]
+ - ["System.Xml", "XmlTextReader", True, "GetNamespacesInScope", "(System.Xml.XmlNamespaceScope)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", True, "GetRemainder", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", True, "ReadBase64", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", True, "ReadBinHex", "(System.Byte[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", True, "ReadChars", "(System.Char[],System.Int32,System.Int32)", "", "Argument[this]", "Argument[0]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.IO.Stream)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.IO.Stream,System.Xml.XmlNameTable)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.IO.Stream,System.Xml.XmlNodeType,System.Xml.XmlParserContext)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.IO.TextReader)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.IO.TextReader,System.Xml.XmlNameTable)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.String)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.String,System.IO.Stream)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.String,System.IO.Stream,System.Xml.XmlNameTable)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.String,System.IO.TextReader)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.String,System.IO.TextReader,System.Xml.XmlNameTable)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.String,System.Xml.XmlNameTable)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.String,System.Xml.XmlNodeType,System.Xml.XmlParserContext)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
+ - ["System.Xml", "XmlTextReader", False, "XmlTextReader", "(System.Xml.XmlNameTable)", "", "Argument[0]", "Argument[this]", "taint", "manual"]
diff --git a/csharp/ql/lib/ext/System.model.yml b/csharp/ql/lib/ext/System.model.yml
index 3853f03dc2fc..870413e75698 100644
--- a/csharp/ql/lib/ext/System.model.yml
+++ b/csharp/ql/lib/ext/System.model.yml
@@ -39,15 +39,15 @@ extensions:
- ["System", "Convert", False, "ChangeType", "(System.Object,System.Type,System.IFormatProvider)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System", "Convert", False, "ChangeType", "(System.Object,System.TypeCode)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System", "Convert", False, "ChangeType", "(System.Object,System.TypeCode,System.IFormatProvider)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- - ["System", "Convert", False, "FromBase64CharArray", "(System.Char[],System.Int32,System.Int32)", "", "Argument[0].Element", "ReturnValue.Element", "taint", "manual"]
- - ["System", "Convert", False, "FromBase64String", "(System.String)", "", "Argument[0]", "ReturnValue.Element", "taint", "manual"]
- - ["System", "Convert", False, "FromHexString", "(System.ReadOnlySpan)", "", "Argument[0].Element", "ReturnValue.Element", "taint", "manual"]
- - ["System", "Convert", False, "FromHexString", "(System.String)", "", "Argument[0]", "ReturnValue.Element", "taint", "manual"]
+ - ["System", "Convert", False, "FromBase64CharArray", "(System.Char[],System.Int32,System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
+ - ["System", "Convert", False, "FromBase64String", "(System.String)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
+ - ["System", "Convert", False, "FromHexString", "(System.ReadOnlySpan)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
+ - ["System", "Convert", False, "FromHexString", "(System.String)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System", "Convert", False, "GetTypeCode", "(System.Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System", "Convert", False, "IsDBNull", "(System.Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- - ["System", "Convert", False, "ToBase64CharArray", "(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32)", "", "Argument[0].Element", "Argument[3].Element", "taint", "manual"]
+ - ["System", "Convert", False, "ToBase64CharArray", "(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32)", "", "Argument[0].Element", "Argument[3]", "taint", "manual"]
- ["System", "Convert", False, "ToBase64CharArray", "(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
- - ["System", "Convert", False, "ToBase64CharArray", "(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions)", "", "Argument[0].Element", "Argument[3].Element", "taint", "manual"]
+ - ["System", "Convert", False, "ToBase64CharArray", "(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions)", "", "Argument[0].Element", "Argument[3]", "taint", "manual"]
- ["System", "Convert", False, "ToBase64CharArray", "(System.Byte[],System.Int32,System.Int32,System.Char[],System.Int32,System.Base64FormattingOptions)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
- ["System", "Convert", False, "ToBase64String", "(System.Byte[])", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
- ["System", "Convert", False, "ToBase64String", "(System.Byte[],System.Base64FormattingOptions)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
@@ -353,13 +353,13 @@ extensions:
- ["System", "Convert", False, "ToUInt64", "(System.UInt16)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System", "Convert", False, "ToUInt64", "(System.UInt32)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- ["System", "Convert", False, "ToUInt64", "(System.UInt64)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- - ["System", "Convert", False, "TryFromBase64Chars", "(System.ReadOnlySpan,System.Span,System.Int32)", "", "Argument[0].Element", "Argument[1].Element", "taint", "manual"]
+ - ["System", "Convert", False, "TryFromBase64Chars", "(System.ReadOnlySpan,System.Span,System.Int32)", "", "Argument[0].Element", "Argument[1]", "taint", "manual"]
- ["System", "Convert", False, "TryFromBase64Chars", "(System.ReadOnlySpan,System.Span,System.Int32)", "", "Argument[0].Element", "Argument[2]", "taint", "manual"]
- ["System", "Convert", False, "TryFromBase64Chars", "(System.ReadOnlySpan,System.Span,System.Int32)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
- - ["System", "Convert", False, "TryFromBase64String", "(System.String,System.Span,System.Int32)", "", "Argument[0]", "Argument[1].Element", "taint", "manual"]
+ - ["System", "Convert", False, "TryFromBase64String", "(System.String,System.Span,System.Int32)", "", "Argument[0]", "Argument[1]", "taint", "manual"]
- ["System", "Convert", False, "TryFromBase64String", "(System.String,System.Span,System.Int32)", "", "Argument[0]", "Argument[2]", "taint", "manual"]
- ["System", "Convert", False, "TryFromBase64String", "(System.String,System.Span,System.Int32)", "", "Argument[0]", "ReturnValue", "taint", "manual"]
- - ["System", "Convert", False, "TryToBase64Chars", "(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions)", "", "Argument[0].Element", "Argument[1].Element", "taint", "manual"]
+ - ["System", "Convert", False, "TryToBase64Chars", "(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions)", "", "Argument[0].Element", "Argument[1]", "taint", "manual"]
- ["System", "Convert", False, "TryToBase64Chars", "(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions)", "", "Argument[0].Element", "Argument[2]", "taint", "manual"]
- ["System", "Convert", False, "TryToBase64Chars", "(System.ReadOnlySpan,System.Span,System.Int32,System.Base64FormattingOptions)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
- ["System", "Int32", False, "Parse", "(System.ReadOnlySpan,System.Globalization.NumberStyles,System.IFormatProvider)", "", "Argument[0].Element", "ReturnValue", "taint", "manual"]
diff --git a/csharp/ql/lib/printAst.ql b/csharp/ql/lib/printAst.ql
index 380f4b4024bb..85820796a881 100644
--- a/csharp/ql/lib/printAst.ql
+++ b/csharp/ql/lib/printAst.ql
@@ -18,8 +18,8 @@ external string selectedSourceFile();
class PrintAstConfigurationOverride extends PrintAstConfiguration {
/**
- * Holds if the location matches the selected file in the VS Code extension and
- * the element is `fromSource`.
+ * Holds if the location `l` matches the selected file in the VS Code extension and
+ * the element is `e` is `fromSource`.
*/
override predicate shouldPrint(Element e, Location l) {
super.shouldPrint(e, l) and
diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml
index e37dc80836f0..2ecc1490cf54 100644
--- a/csharp/ql/lib/qlpack.yml
+++ b/csharp/ql/lib/qlpack.yml
@@ -1,5 +1,5 @@
name: codeql/csharp-all
-version: 5.2.2
+version: 5.2.3
groups: csharp
dbscheme: semmlecode.csharp.dbscheme
extractor: csharp
diff --git a/csharp/ql/lib/semmle/code/csharp/Assignable.qll b/csharp/ql/lib/semmle/code/csharp/Assignable.qll
index d4f8d9974f08..3c7170a6f846 100644
--- a/csharp/ql/lib/semmle/code/csharp/Assignable.qll
+++ b/csharp/ql/lib/semmle/code/csharp/Assignable.qll
@@ -583,7 +583,7 @@ module AssignableDefinitions {
}
/**
- * Holds if the `ref` assignment to `aa` via call `c` is uncertain.
+ * Holds if the `ref` assignment to `arg` via call `c` is uncertain.
*/
// Not in the cached module `Cached`, as that would introduce a dependency
// on the CFG construction, and effectively collapse too many stages into one
diff --git a/csharp/ql/lib/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll
index 6384f4582769..7e17f853913a 100644
--- a/csharp/ql/lib/semmle/code/csharp/Callable.qll
+++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll
@@ -708,7 +708,7 @@ class TrueOperator extends UnaryOperator {
*
* Either an addition operator (`AddOperator`), a checked addition operator
* (`CheckedAddOperator`) a subtraction operator (`SubOperator`), a checked
- * substraction operator (`CheckedSubOperator`), a multiplication operator
+ * subtraction operator (`CheckedSubOperator`), a multiplication operator
* (`MulOperator`), a checked multiplication operator (`CheckedMulOperator`),
* a division operator (`DivOperator`), a checked division operator
* (`CheckedDivOperator`), a remainder operator (`RemOperator`), an and
diff --git a/csharp/ql/lib/semmle/code/csharp/Member.qll b/csharp/ql/lib/semmle/code/csharp/Member.qll
index 3427d4ea0893..a196d3b3fc70 100644
--- a/csharp/ql/lib/semmle/code/csharp/Member.qll
+++ b/csharp/ql/lib/semmle/code/csharp/Member.qll
@@ -491,7 +491,7 @@ class Parameterizable extends Declaration, @parameterizable {
final Parameter getARawParameter() { result = this.getRawParameter(_) }
/**
- * Gets the type of the parameter, possibly prefixed
+ * Gets the type of the `i`th parameter, possibly prefixed
* with `out`, `ref`, or `params`, where appropriate.
*/
private string parameterTypeToString(int i) {
diff --git a/csharp/ql/lib/semmle/code/csharp/PrintAst.qll b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll
index fd4bf1cb86b0..1ac96c85e788 100644
--- a/csharp/ql/lib/semmle/code/csharp/PrintAst.qll
+++ b/csharp/ql/lib/semmle/code/csharp/PrintAst.qll
@@ -523,11 +523,9 @@ final class AttributeNode extends ElementNode {
* A node representing a `TypeParameter`.
*/
final class TypeParameterNode extends ElementNode {
- TypeParameter typeParameter;
-
TypeParameterNode() {
- typeParameter = element and
- not isNotNeeded(typeParameter.getDeclaringGeneric())
+ element =
+ any(TypeParameter typeParameter | not isNotNeeded(typeParameter.getDeclaringGeneric()))
}
override ElementNode getChild(int childIndex) { none() }
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll
index 9e548838adec..c3bf2545230c 100644
--- a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll
@@ -6,6 +6,7 @@ import csharp
private import ControlFlow::SuccessorTypes
private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as CfgImpl
private import CfgImpl::BasicBlocks as BasicBlocksImpl
+private import codeql.controlflow.BasicBlock as BB
/**
* A basic block, that is, a maximal straight-line sequence of control flow nodes
@@ -13,7 +14,12 @@ private import CfgImpl::BasicBlocks as BasicBlocksImpl
*/
final class BasicBlock extends BasicBlocksImpl::BasicBlock {
/** Gets an immediate successor of this basic block of a given type, if any. */
- BasicBlock getASuccessorByType(ControlFlow::SuccessorType t) { result = this.getASuccessor(t) }
+ BasicBlock getASuccessor(ControlFlow::SuccessorType t) { result = super.getASuccessor(t) }
+
+ /** DEPRECATED: Use `getASuccessor` instead. */
+ deprecated BasicBlock getASuccessorByType(ControlFlow::SuccessorType t) {
+ result = this.getASuccessor(t)
+ }
/** Gets an immediate predecessor of this basic block of a given type, if any. */
BasicBlock getAPredecessorByType(ControlFlow::SuccessorType t) {
@@ -58,6 +64,8 @@ final class BasicBlock extends BasicBlocksImpl::BasicBlock {
result.getFirstNode() = this.getLastNode().getAFalseSuccessor()
}
+ BasicBlock getASuccessor() { result = super.getASuccessor() }
+
/** Gets the control flow node at a specific (zero-indexed) position in this basic block. */
ControlFlow::Node getNode(int pos) { result = super.getNode(pos) }
@@ -330,3 +338,21 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl
super.edgeDominates(controlled, s)
}
}
+
+private class BasicBlockAlias = BasicBlock;
+
+private class EntryBasicBlockAlias = EntryBasicBlock;
+
+module Cfg implements BB::CfgSig {
+ class ControlFlowNode = ControlFlow::Node;
+
+ class SuccessorType = ControlFlow::SuccessorType;
+
+ class BasicBlock = BasicBlockAlias;
+
+ class EntryBasicBlock = EntryBasicBlockAlias;
+
+ predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
+ BasicBlocksImpl::dominatingEdge(bb1, bb2)
+ }
+}
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll
index 5649f43b8818..1cd09725b6e0 100644
--- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll
@@ -90,7 +90,7 @@ class ControlFlowElement extends ExprOrStmtParent, @control_flow_element {
// all other nodes can use regular CFG dominance
this instanceof Impl::SplitAstNode and
cb.getLastNode() = this.getAControlFlowNode() and
- succ = cb.getASuccessorByType(s)
+ succ = cb.getASuccessor(s)
}
pragma[noinline]
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll
index 313fabc02356..2688472f71c3 100644
--- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll
@@ -999,7 +999,7 @@ module Internal {
pragma[nomagic]
private predicate preControlsDirect(Guard g, PreBasicBlocks::PreBasicBlock bb, AbstractValue v) {
exists(PreBasicBlocks::ConditionBlock cb, ConditionalSuccessor s | cb.controls(bb, s) |
- v.branch(cb.getLastElement(), s, g)
+ v.branch(cb.getLastNode(), s, g)
)
}
@@ -1146,9 +1146,9 @@ module Internal {
/** Gets the successor block that is reached when guard `g` has abstract value `v`. */
private PreBasicBlocks::PreBasicBlock getConditionalSuccessor(Guard g, AbstractValue v) {
exists(PreBasicBlocks::ConditionBlock pred, ConditionalSuccessor s |
- v.branch(pred.getLastElement(), s, g)
+ v.branch(pred.getLastNode(), s, g)
|
- result = pred.getASuccessorByType(s)
+ result = pred.getASuccessor(s)
)
}
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll
index 6fed45cdf84d..a3bf97945964 100644
--- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll
@@ -310,10 +310,8 @@ private class Overflowable extends UnaryOperation {
/** A control flow element that is inside a `try` block. */
private class TriedControlFlowElement extends ControlFlowElement {
- TryStmt try;
-
TriedControlFlowElement() {
- this = try.getATriedElement() and
+ this = any(TryStmt try).getATriedElement() and
not this instanceof NonReturningCall
}
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll
index 08debc21c0d0..b3cdf3335e66 100644
--- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll
@@ -13,6 +13,7 @@ import csharp
private import Completion
private import ControlFlowGraphImpl
private import semmle.code.csharp.controlflow.ControlFlowGraph::ControlFlow as Cfg
+private import codeql.controlflow.BasicBlock as BB
private predicate startsBB(ControlFlowElement cfe) {
not succ(_, cfe, _) and
@@ -55,24 +56,34 @@ private predicate bbIDominates(PreBasicBlock dom, PreBasicBlock bb) =
class PreBasicBlock extends ControlFlowElement {
PreBasicBlock() { startsBB(this) }
- PreBasicBlock getASuccessorByType(Cfg::SuccessorType t) {
- succ(this.getLastElement(), result, any(Completion c | t = c.getAMatchingSuccessorType()))
+ PreBasicBlock getASuccessor(Cfg::SuccessorType t) {
+ succ(this.getLastNode(), result, any(Completion c | t = c.getAMatchingSuccessorType()))
}
- PreBasicBlock getASuccessor() { result = this.getASuccessorByType(_) }
+ deprecated PreBasicBlock getASuccessorByType(Cfg::SuccessorType t) {
+ result = this.getASuccessor(t)
+ }
+
+ PreBasicBlock getASuccessor() { result = this.getASuccessor(_) }
PreBasicBlock getAPredecessor() { result.getASuccessor() = this }
- ControlFlowElement getElement(int pos) { bbIndex(this, result, pos) }
+ ControlFlowElement getNode(int pos) { bbIndex(this, result, pos) }
- ControlFlowElement getAnElement() { result = this.getElement(_) }
+ deprecated ControlFlowElement getElement(int pos) { result = this.getNode(pos) }
+
+ ControlFlowElement getAnElement() { result = this.getNode(_) }
ControlFlowElement getFirstElement() { result = this }
- ControlFlowElement getLastElement() { result = this.getElement(this.length() - 1) }
+ ControlFlowElement getLastNode() { result = this.getNode(this.length() - 1) }
+
+ deprecated ControlFlowElement getLastElement() { result = this.getLastNode() }
int length() { result = strictcount(this.getAnElement()) }
+ PreBasicBlock getImmediateDominator() { bbIDominates(result, this) }
+
predicate immediatelyDominates(PreBasicBlock bb) { bbIDominates(this, bb) }
pragma[inline]
@@ -84,45 +95,83 @@ class PreBasicBlock extends ControlFlowElement {
or
this.strictlyDominates(bb)
}
+
+ predicate inDominanceFrontier(PreBasicBlock df) {
+ this = df.getAPredecessor() and not bbIDominates(this, df)
+ or
+ exists(PreBasicBlock prev | prev.inDominanceFrontier(df) |
+ bbIDominates(this, prev) and
+ not bbIDominates(this, df)
+ )
+ }
+
+ /** Unsupported. Do not use. */
+ predicate strictlyPostDominates(PreBasicBlock bb) { none() }
+
+ /** Unsupported. Do not use. */
+ predicate postDominates(PreBasicBlock bb) {
+ this.strictlyPostDominates(bb) or
+ this = bb
+ }
}
private Completion getConditionalCompletion(ConditionalCompletion cc) {
result.getInnerCompletion() = cc
}
+pragma[nomagic]
+private predicate conditionBlockImmediatelyControls(
+ ConditionBlock cond, PreBasicBlock succ, ConditionalCompletion cc
+) {
+ exists(ControlFlowElement last, Completion c |
+ last = cond.getLastNode() and
+ c = getConditionalCompletion(cc) and
+ succ(last, succ, c) and
+ // In the pre-CFG, we need to account for case where one predecessor node has
+ // two edges to the same successor node. Assertion expressions are examples of
+ // such nodes.
+ not exists(Completion other |
+ succ(last, succ, other) and
+ other != c
+ ) and
+ forall(PreBasicBlock pred | pred = succ.getAPredecessor() and pred != cond |
+ succ.dominates(pred)
+ )
+ )
+}
+
class ConditionBlock extends PreBasicBlock {
ConditionBlock() {
exists(Completion c | c = getConditionalCompletion(_) |
- succ(this.getLastElement(), _, c)
+ succ(this.getLastNode(), _, c)
or
- scopeLast(_, this.getLastElement(), c)
- )
- }
-
- pragma[nomagic]
- private predicate immediatelyControls(PreBasicBlock succ, ConditionalCompletion cc) {
- exists(ControlFlowElement last, Completion c |
- last = this.getLastElement() and
- c = getConditionalCompletion(cc) and
- succ(last, succ, c) and
- // In the pre-CFG, we need to account for case where one predecessor node has
- // two edges to the same successor node. Assertion expressions are examples of
- // such nodes.
- not exists(Completion other |
- succ(last, succ, other) and
- other != c
- ) and
- forall(PreBasicBlock pred | pred = succ.getAPredecessor() and pred != this |
- succ.dominates(pred)
- )
+ scopeLast(_, this.getLastNode(), c)
)
}
pragma[nomagic]
predicate controls(PreBasicBlock controlled, Cfg::SuccessorTypes::ConditionalSuccessor s) {
- exists(PreBasicBlock succ, ConditionalCompletion c | this.immediatelyControls(succ, c) |
+ exists(PreBasicBlock succ, ConditionalCompletion c |
+ conditionBlockImmediatelyControls(this, succ, c)
+ |
succ.dominates(controlled) and
s = c.getAMatchingSuccessorType()
)
}
}
+
+module PreCfg implements BB::CfgSig {
+ class ControlFlowNode = ControlFlowElement;
+
+ class SuccessorType = Cfg::SuccessorType;
+
+ class BasicBlock = PreBasicBlock;
+
+ class EntryBasicBlock extends BasicBlock {
+ EntryBasicBlock() { entryBB(this) }
+ }
+
+ predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) {
+ conditionBlockImmediatelyControls(bb1, bb2, _)
+ }
+}
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll
index 6507bbbe04bf..ce9fdd406fd8 100644
--- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll
@@ -12,9 +12,9 @@ module PreSsa {
private import codeql.ssa.Ssa as SsaImplCommon
private predicate definitionAt(
- AssignableDefinition def, SsaInput::BasicBlock bb, int i, SsaInput::SourceVariable v
+ AssignableDefinition def, PreBasicBlocks::PreBasicBlock bb, int i, SsaInput::SourceVariable v
) {
- bb.getElement(i) = def.getExpr() and
+ bb.getNode(i) = def.getExpr() and
v = def.getTarget() and
// In cases like `(x, x) = (0, 1)`, we discard the first (dead) definition of `x`
not exists(TupleAssignmentDefinition first, TupleAssignmentDefinition second | first = def |
@@ -30,7 +30,9 @@ module PreSsa {
)
}
- predicate implicitEntryDef(Callable c, SsaInput::BasicBlock bb, SsaInput::SourceVariable v) {
+ predicate implicitEntryDef(
+ Callable c, PreBasicBlocks::PreBasicBlock bb, SsaInput::SourceVariable v
+ ) {
c = v.getACallable() and
scopeFirst(c, bb) and
(
@@ -79,19 +81,9 @@ module PreSsa {
}
}
- module SsaInput implements SsaImplCommon::InputSig {
- class BasicBlock extends PreBasicBlocks::PreBasicBlock {
- ControlFlowNode getNode(int i) { result = this.getElement(i) }
- }
-
- class ControlFlowNode = ControlFlowElement;
-
- BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result.immediatelyDominates(bb) }
-
- BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
-
- private class ExitBasicBlock extends BasicBlock {
- ExitBasicBlock() { scopeLast(_, this.getLastElement(), _) }
+ module SsaInput implements SsaImplCommon::InputSig {
+ private class ExitBasicBlock extends PreBasicBlocks::PreBasicBlock {
+ ExitBasicBlock() { scopeLast(_, this.getLastNode(), _) }
}
pragma[noinline]
@@ -129,7 +121,9 @@ module PreSsa {
Callable getACallable() { result = c }
}
- predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {
+ predicate variableWrite(
+ PreBasicBlocks::PreBasicBlock bb, int i, SourceVariable v, boolean certain
+ ) {
exists(AssignableDefinition def |
definitionAt(def, bb, i, v) and
if def.getTargetAccess().isRefArgument() then certain = false else certain = true
@@ -140,9 +134,11 @@ module PreSsa {
certain = true
}
- predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
+ predicate variableRead(
+ PreBasicBlocks::PreBasicBlock bb, int i, SourceVariable v, boolean certain
+ ) {
exists(AssignableRead read |
- read = bb.getElement(i) and
+ read = bb.getNode(i) and
read.getTarget() = v and
certain = true
)
@@ -157,27 +153,27 @@ module PreSsa {
}
}
- private module SsaImpl = SsaImplCommon::Make;
+ private module SsaImpl = SsaImplCommon::Make;
class Definition extends SsaImpl::Definition {
final AssignableRead getARead() {
- exists(SsaInput::BasicBlock bb, int i |
+ exists(PreBasicBlocks::PreBasicBlock bb, int i |
SsaImpl::ssaDefReachesRead(_, this, bb, i) and
- result = bb.getElement(i)
+ result = bb.getNode(i)
)
}
final AssignableDefinition getDefinition() {
- exists(SsaInput::BasicBlock bb, int i, SsaInput::SourceVariable v |
+ exists(PreBasicBlocks::PreBasicBlock bb, int i, SsaInput::SourceVariable v |
this.definesAt(v, bb, i) and
definitionAt(result, bb, i, v)
)
}
final AssignableRead getAFirstRead() {
- exists(SsaInput::BasicBlock bb, int i |
+ exists(PreBasicBlocks::PreBasicBlock bb, int i |
SsaImpl::firstUse(this, bb, i, true) and
- result = bb.getElement(i)
+ result = bb.getNode(i)
)
}
@@ -191,14 +187,14 @@ module PreSsa {
not result instanceof PhiNode
}
- final predicate isLiveAtEndOfBlock(SsaInput::BasicBlock bb) {
+ final predicate isLiveAtEndOfBlock(PreBasicBlocks::PreBasicBlock bb) {
SsaImpl::ssaDefReachesEndOfBlock(bb, this, _)
}
override Location getLocation() {
result = this.getDefinition().getLocation()
or
- exists(Callable c, SsaInput::BasicBlock bb, SsaInput::SourceVariable v |
+ exists(Callable c, PreBasicBlocks::PreBasicBlock bb, SsaInput::SourceVariable v |
this.definesAt(v, bb, -1) and
implicitEntryDef(c, bb, v) and
result = c.getLocation()
@@ -213,10 +209,10 @@ module PreSsa {
}
predicate adjacentReadPairSameVar(AssignableRead read1, AssignableRead read2) {
- exists(SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2 |
- read1 = bb1.getElement(i1) and
+ exists(PreBasicBlocks::PreBasicBlock bb1, int i1, PreBasicBlocks::PreBasicBlock bb2, int i2 |
+ read1 = bb1.getNode(i1) and
SsaImpl::adjacentUseUse(bb1, i1, bb2, i2, _, true) and
- read2 = bb2.getElement(i2)
+ read2 = bb2.getNode(i2)
)
}
}
diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll
index b6efdfcf1eac..f57dd0703fce 100644
--- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll
+++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll
@@ -899,7 +899,7 @@ module BooleanSplitting {
/** Holds if control flow element `cfe` starts a split of this kind. */
predicate startsSplit(AstNode cfe) {
- this.correlatesConditions(any(ConditionBlock cb | cb.getLastElement() = cfe), _, _)
+ this.correlatesConditions(any(ConditionBlock cb | cb.getLastNode() = cfe), _, _)
}
/**
@@ -941,7 +941,7 @@ module BooleanSplitting {
/**
* Holds if condition `cb` is a read of the SSA variable in this split.
*/
- private predicate defCondition(ConditionBlock cb) { cb.getLastElement() = def.getARead() }
+ private predicate defCondition(ConditionBlock cb) { cb.getLastNode() = def.getARead() }
/**
* Holds if condition `cb` is a read of the SSA variable in this split,
@@ -950,7 +950,7 @@ module BooleanSplitting {
*/
private predicate defConditionReachableFromRead(ConditionBlock cb, AssignableRead read) {
this.defCondition(cb) and
- read = cb.getLastElement()
+ read = cb.getLastNode()
or
exists(AssignableRead mid | this.defConditionReachableFromRead(cb, mid) |
PreSsa::adjacentReadPairSameVar(read, mid) and
@@ -970,9 +970,9 @@ module BooleanSplitting {
override predicate correlatesConditions(ConditionBlock cb1, ConditionBlock cb2, boolean inverted) {
this.firstDefCondition(cb1) and
exists(AssignableRead read1, AssignableRead read2 |
- read1 = cb1.getLastElement() and
+ read1 = cb1.getLastNode() and
PreSsa::adjacentReadPairSameVar+(read1, read2) and
- read2 = cb2.getLastElement() and
+ read2 = cb2.getLastNode() and
inverted = false
)
}
@@ -1088,7 +1088,7 @@ module BooleanSplitting {
*/
private predicate appliesToBlock(PreBasicBlock bb, Completion c) {
this.appliesTo(bb) and
- exists(AstNode last | last = bb.getLastElement() |
+ exists(AstNode last | last = bb.getLastNode() |
(succ(last, _, c) or scopeLast(_, last, c)) and
// Respect the value recorded in this split for all correlated conditions
forall(boolean inverted | bb = this.getACorrelatedCondition(inverted) |
@@ -1102,7 +1102,7 @@ module BooleanSplitting {
override predicate hasExit(AstNode pred, AstNode succ, Completion c) {
exists(PreBasicBlock bb | this.appliesToBlock(bb, c) |
- pred = bb.getLastElement() and
+ pred = bb.getLastNode() and
succ(pred, succ, c) and
// Exit this split if we can no longer reach a correlated condition
not super.getSubKind().canReachCorrelatedCondition(succ)
@@ -1111,7 +1111,7 @@ module BooleanSplitting {
override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) {
exists(PreBasicBlock bb | this.appliesToBlock(bb, c) |
- last = bb.getLastElement() and
+ last = bb.getLastNode() and
scopeLast(scope, last, c)
)
}
@@ -1121,7 +1121,7 @@ module BooleanSplitting {
pred = bb.getAnElement() and
this.appliesSucc(pred, succ, c) and
(
- pred = bb.getLastElement()
+ pred = bb.getLastNode()
implies
(
// We must still be able to reach a correlated condition to stay in this split
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll
index 7e8ed0aadc04..352418779955 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll
@@ -297,7 +297,7 @@ private predicate defNullImpliesStep(
not exists(SuccessorTypes::ConditionalSuccessor s, NullValue nv |
bb1.getLastNode() = getANullCheck(def1, s, nv).getAControlFlowNode()
|
- bb2 = bb1.getASuccessorByType(s) and
+ bb2 = bb1.getASuccessor(s) and
nv.isNonNull()
)
}
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll
index f17317af83be..4c9f64de4b9e 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/SSA.qll
@@ -451,10 +451,9 @@ module Ssa {
* An SSA definition that corresponds to an explicit assignable definition.
*/
class ExplicitDefinition extends Definition, SsaImpl::WriteDefinition {
- SourceVariable sv;
AssignableDefinition ad;
- ExplicitDefinition() { SsaImpl::explicitDefinition(this, sv, ad) }
+ ExplicitDefinition() { SsaImpl::explicitDefinition(this, _, ad) }
/**
* Gets an underlying assignable definition. The result is always unique,
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll
index ec1b5a0188e8..6e2d7d239f78 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll
@@ -5,6 +5,7 @@ import csharp
*/
module BaseSsa {
private import AssignableDefinitions
+ private import semmle.code.csharp.controlflow.BasicBlocks as BasicBlocks
private import codeql.ssa.Ssa as SsaImplCommon
/**
@@ -42,22 +43,12 @@ module BaseSsa {
)
}
- private module SsaInput implements SsaImplCommon::InputSig {
+ private module SsaInput implements SsaImplCommon::InputSig {
private import semmle.code.csharp.controlflow.internal.PreSsa
- class BasicBlock = ControlFlow::BasicBlock;
-
- class ControlFlowNode = ControlFlow::Node;
-
- BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) {
- result = bb.getImmediateDominator()
- }
-
- BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
-
class SourceVariable = PreSsa::SimpleLocalScopeVariable;
- predicate variableWrite(BasicBlock bb, int i, SourceVariable v, boolean certain) {
+ predicate variableWrite(ControlFlow::BasicBlock bb, int i, SourceVariable v, boolean certain) {
exists(AssignableDefinition def |
definitionAt(def, bb, i, v) and
if def.isCertain() then certain = true else certain = false
@@ -68,7 +59,7 @@ module BaseSsa {
certain = true
}
- predicate variableRead(BasicBlock bb, int i, SourceVariable v, boolean certain) {
+ predicate variableRead(ControlFlow::BasicBlock bb, int i, SourceVariable v, boolean certain) {
exists(AssignableRead read |
read.getAControlFlowNode() = bb.getNode(i) and
read.getTarget() = v and
@@ -77,7 +68,7 @@ module BaseSsa {
}
}
- private module SsaImpl = SsaImplCommon::Make;
+ private module SsaImpl = SsaImplCommon::Make;
class Definition extends SsaImpl::Definition {
final AssignableRead getARead() {
@@ -114,7 +105,7 @@ module BaseSsa {
override Location getLocation() {
result = this.getDefinition().getLocation()
or
- exists(Callable c, SsaInput::BasicBlock bb, SsaInput::SourceVariable v |
+ exists(Callable c, ControlFlow::BasicBlock bb, SsaInput::SourceVariable v |
this.definesAt(v, bb, -1) and
implicitEntryDef(c, bb, v) and
result = c.getLocation()
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
index 9373c46466a0..f9563ef9fe5d 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll
@@ -264,6 +264,7 @@ predicate hasNodePath(ControlFlowReachabilityConfiguration conf, ExprNode n1, No
/** Provides logic related to captured variables. */
module VariableCapture {
private import codeql.dataflow.VariableCapture as Shared
+ private import semmle.code.csharp.controlflow.BasicBlocks as BasicBlocks
private predicate closureFlowStep(ControlFlow::Nodes::ExprNode e1, ControlFlow::Nodes::ExprNode e2) {
e1 = LocalFlow::getALastEvalNode(e2)
@@ -275,24 +276,15 @@ module VariableCapture {
)
}
- private module CaptureInput implements Shared::InputSig {
+ private module CaptureInput implements Shared::InputSig {
private import csharp as Cs
private import semmle.code.csharp.controlflow.ControlFlowGraph as Cfg
- private import semmle.code.csharp.controlflow.BasicBlocks as BasicBlocks
private import TaintTrackingPrivate as TaintTrackingPrivate
- class BasicBlock extends BasicBlocks::BasicBlock {
- Callable getEnclosingCallable() { result = super.getCallable() }
+ Callable basicBlockGetEnclosingCallable(BasicBlocks::BasicBlock bb) {
+ result = bb.getCallable()
}
- class ControlFlowNode = Cfg::ControlFlow::Node;
-
- BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) {
- result = bb.getImmediateDominator()
- }
-
- BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
-
private predicate thisAccess(ControlFlow::Node cfn, InstanceCallable c) {
ThisFlow::thisAccessExpr(cfn.getAstNode()) and
cfn.getEnclosingCallable().getEnclosingCallable*() = c
@@ -359,7 +351,7 @@ module VariableCapture {
}
class Expr extends ControlFlow::Node {
- predicate hasCfgNode(BasicBlock bb, int i) { this = bb.getNode(i) }
+ predicate hasCfgNode(BasicBlocks::BasicBlock bb, int i) { this = bb.getNode(i) }
}
class VariableWrite extends Expr {
@@ -411,7 +403,7 @@ module VariableCapture {
class ClosureExpr = CaptureInput::ClosureExpr;
- module Flow = Shared::Flow;
+ module Flow = Shared::Flow;
private Flow::ClosureNode asClosureNode(Node n) {
result = n.(CaptureNode).getSynthesizedCaptureNode()
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll
index d1490c849163..d3f1a9d956bb 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll
@@ -6,17 +6,10 @@ import csharp
private import codeql.ssa.Ssa as SsaImplCommon
private import AssignableDefinitions
private import semmle.code.csharp.controlflow.internal.PreSsa
+private import semmle.code.csharp.controlflow.BasicBlocks as BasicBlocks
private import semmle.code.csharp.controlflow.Guards as Guards
-private module SsaInput implements SsaImplCommon::InputSig {
- class BasicBlock = ControlFlow::BasicBlock;
-
- class ControlFlowNode = ControlFlow::Node;
-
- BasicBlock getImmediateBasicBlockDominator(BasicBlock bb) { result = bb.getImmediateDominator() }
-
- BasicBlock getABasicBlockSuccessor(BasicBlock bb) { result = bb.getASuccessor() }
-
+private module SsaInput implements SsaImplCommon::InputSig {
class SourceVariable = Ssa::SourceVariable;
/**
@@ -25,7 +18,7 @@ private module SsaInput implements SsaImplCommon::InputSig {
*
* This includes implicit writes via calls.
*/
- predicate variableWrite(BasicBlock bb, int i, Ssa::SourceVariable v, boolean certain) {
+ predicate variableWrite(ControlFlow::BasicBlock bb, int i, Ssa::SourceVariable v, boolean certain) {
variableWriteDirect(bb, i, v, certain)
or
variableWriteQualifier(bb, i, v, certain)
@@ -39,7 +32,7 @@ private module SsaInput implements SsaImplCommon::InputSig {
*
* This includes implicit reads via calls.
*/
- predicate variableRead(BasicBlock bb, int i, Ssa::SourceVariable v, boolean certain) {
+ predicate variableRead(ControlFlow::BasicBlock bb, int i, Ssa::SourceVariable v, boolean certain) {
variableReadActual(bb, i, v) and
certain = true
or
@@ -48,7 +41,7 @@ private module SsaInput implements SsaImplCommon::InputSig {
}
}
-import SsaImplCommon::Make as Impl
+import SsaImplCommon::Make as Impl
class Definition = Impl::Definition;
@@ -150,7 +143,7 @@ private module SourceVariableImpl {
}
/**
- * Gets an `out`/`ref` definition of the same source variable as the `out`/`ref`
+ * Gets an `out`/`ref` definition of the same source variable `v` as the `out`/`ref`
* definition `def`, belonging to the same call, at a position after `def`.
*/
OutRefDefinition getASameOutRefDefAfter(Ssa::SourceVariable v, OutRefDefinition def) {
@@ -729,7 +722,7 @@ private predicate variableReadPseudo(ControlFlow::BasicBlock bb, int i, Ssa::Sou
pragma[noinline]
deprecated private predicate adjacentDefRead(
- Definition def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2,
+ Definition def, ControlFlow::BasicBlock bb1, int i1, ControlFlow::BasicBlock bb2, int i2,
SsaInput::SourceVariable v
) {
Impl::adjacentDefRead(def, bb1, i1, bb2, i2) and
@@ -737,8 +730,8 @@ deprecated private predicate adjacentDefRead(
}
deprecated private predicate adjacentDefReachesRead(
- Definition def, SsaInput::SourceVariable v, SsaInput::BasicBlock bb1, int i1,
- SsaInput::BasicBlock bb2, int i2
+ Definition def, SsaInput::SourceVariable v, ControlFlow::BasicBlock bb1, int i1,
+ ControlFlow::BasicBlock bb2, int i2
) {
adjacentDefRead(def, bb1, i1, bb2, i2, v) and
(
@@ -747,7 +740,7 @@ deprecated private predicate adjacentDefReachesRead(
SsaInput::variableRead(bb1, i1, v, true)
)
or
- exists(SsaInput::BasicBlock bb3, int i3 |
+ exists(ControlFlow::BasicBlock bb3, int i3 |
adjacentDefReachesRead(def, v, bb1, i1, bb3, i3) and
SsaInput::variableRead(bb3, i3, _, false) and
Impl::adjacentDefRead(def, bb3, i3, bb2, i2)
@@ -755,7 +748,7 @@ deprecated private predicate adjacentDefReachesRead(
}
deprecated private predicate adjacentDefReachesUncertainRead(
- Definition def, SsaInput::BasicBlock bb1, int i1, SsaInput::BasicBlock bb2, int i2
+ Definition def, ControlFlow::BasicBlock bb1, int i1, ControlFlow::BasicBlock bb2, int i2
) {
exists(SsaInput::SourceVariable v |
adjacentDefReachesRead(def, v, bb1, i1, bb2, i2) and
@@ -766,12 +759,12 @@ deprecated private predicate adjacentDefReachesUncertainRead(
/** Same as `lastRefRedef`, but skips uncertain reads. */
pragma[nomagic]
deprecated private predicate lastRefSkipUncertainReads(
- Definition def, SsaInput::BasicBlock bb, int i
+ Definition def, ControlFlow::BasicBlock bb, int i
) {
Impl::lastRef(def, bb, i) and
not SsaInput::variableRead(bb, i, def.getSourceVariable(), false)
or
- exists(SsaInput::BasicBlock bb0, int i0 |
+ exists(ControlFlow::BasicBlock bb0, int i0 |
Impl::lastRef(def, bb0, i0) and
adjacentDefReachesUncertainRead(def, bb, i, bb0, i0)
)
@@ -1054,7 +1047,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) {
exists(ControlFlow::SuccessorTypes::ConditionalSuccessor s |
this.getAControlFlowNode() = bb1.getLastNode() and
- bb2 = bb1.getASuccessorByType(s) and
+ bb2 = bb1.getASuccessor(s) and
s.getValue() = branch
)
}
diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll
index b7681994e2c3..3146720efe86 100644
--- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll
@@ -29,7 +29,10 @@ predicate defaultTaintSanitizer(DataFlow::Node node) {
* of `c` at sinks and inputs to additional taint steps.
*/
bindingset[node]
-predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::ContentSet c) { none() }
+predicate defaultImplicitTaintRead(DataFlow::Node node, DataFlow::ContentSet c) {
+ exists(node) and
+ c.isElement()
+}
private class LocalTaintExprStepConfiguration extends ControlFlowReachabilityConfiguration {
LocalTaintExprStepConfiguration() { this = "LocalTaintExprStepConfiguration" }
diff --git a/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll
index 7de6c30eb13c..c61ad0f2a2a9 100644
--- a/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll
+++ b/csharp/ql/lib/semmle/code/csharp/dispatch/Dispatch.qll
@@ -270,6 +270,14 @@ private module Internal {
hasOverrider(t, c)
}
+ /**
+ * For `base` expressions, the extractor provides the type of the base
+ * class instead of the derived class; this predicate provides the latter.
+ */
+ private Type getBaseAdjustedType(BaseAccess base) {
+ result = base.getEnclosingCallable().getDeclaringType()
+ }
+
abstract private class DispatchOverridableCall extends DispatchCallImpl {
pragma[noinline]
OverridableCallable getAStaticTargetExt() {
@@ -360,7 +368,12 @@ private module Internal {
private predicate contextArgHasType(DispatchCall ctx, Type t, boolean isExact) {
exists(Expr arg, int i |
this.relevantContext(ctx, i) and
- t = getAPossibleType(arg, isExact)
+ (
+ t = getBaseAdjustedType(arg) and isExact = false
+ or
+ not exists(getBaseAdjustedType(arg)) and
+ t = getAPossibleType(arg, isExact)
+ )
|
ctx.getArgument(i) = arg
or
@@ -725,9 +738,7 @@ private module Internal {
Type getType(boolean isExact) {
result = this.getType() and
- if
- this instanceof ObjectCreation or
- this instanceof BaseAccess
+ if this instanceof ObjectCreation or this instanceof BaseAccess
then isExact = true
else isExact = false
}
diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll
index 27f6ab6935f7..5b2bd407a5ce 100644
--- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll
+++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UnsafeDeserializationQuery.qll
@@ -874,7 +874,7 @@ private predicate isStrongTypeFsPicklerCall(MethodCall mc, Method m) {
(
m instanceof FsPicklerSerializerClassDeserializeMethod or
m instanceof FsPicklerSerializerClassDeserializeSequenceMethod or
- m instanceof FsPicklerSerializerClasDeserializeSiftedMethod or
+ m instanceof FsPicklerSerializerClassDeserializeSiftedMethod or
m instanceof FsPicklerSerializerClassUnPickleMethod or
m instanceof FsPicklerSerializerClassUnPickleSiftedMethod or
m instanceof CsPicklerSerializerClassDeserializeMethod or
diff --git a/csharp/ql/lib/semmle/code/csharp/serialization/Deserializers.qll b/csharp/ql/lib/semmle/code/csharp/serialization/Deserializers.qll
index aeb341222844..f7c6ade96eaf 100644
--- a/csharp/ql/lib/semmle/code/csharp/serialization/Deserializers.qll
+++ b/csharp/ql/lib/semmle/code/csharp/serialization/Deserializers.qll
@@ -560,9 +560,15 @@ class FsPicklerSerializerClassDeserializeSequenceMethod extends Method, UnsafeDe
}
}
+/**
+ * DEPRECATED: Use `FsPicklerSerializerClassDeserializeSiftedMethod` instead.
+ */
+deprecated class FsPicklerSerializerClasDeserializeSiftedMethod =
+ FsPicklerSerializerClassDeserializeSiftedMethod;
+
/** `MBrace.FsPickler.FsPicklerSerializer.DeserializeSifted` method */
-class FsPicklerSerializerClasDeserializeSiftedMethod extends Method, UnsafeDeserializer {
- FsPicklerSerializerClasDeserializeSiftedMethod() {
+class FsPicklerSerializerClassDeserializeSiftedMethod extends Method, UnsafeDeserializer {
+ FsPicklerSerializerClassDeserializeSiftedMethod() {
this.getDeclaringType().getBaseClass*() instanceof FsPicklerSerializerClass and
this.hasUndecoratedName("DeserializeSifted")
}
diff --git a/csharp/ql/src/Bad Practices/Magic Constants/MagicConstants.qll b/csharp/ql/src/Bad Practices/Magic Constants/MagicConstants.qll
index 73b82c14700a..8c3e0562d395 100644
--- a/csharp/ql/src/Bad Practices/Magic Constants/MagicConstants.qll
+++ b/csharp/ql/src/Bad Practices/Magic Constants/MagicConstants.qll
@@ -113,7 +113,7 @@ private predicate valueOccurrenceCount(string value, int n) {
n > 20
}
-private predicate occurenceCount(Literal lit, string value, int n) {
+private predicate occurrenceCount(Literal lit, string value, int n) {
valueOccurrenceCount(value, n) and
value = lit.getValue() and
relevantLiteral(lit, value)
@@ -127,7 +127,7 @@ private predicate check(Literal lit, string value, int n, File f) {
// Check that the literal is nontrivial
not trivial(lit) and
// Check that it is repeated a number of times
- occurenceCount(lit, value, n) and
+ occurrenceCount(lit, value, n) and
n > 20 and
f = lit.getFile()
}
diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md
index 2539f93099f9..e1109181fca3 100644
--- a/csharp/ql/src/CHANGELOG.md
+++ b/csharp/ql/src/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.3.4
+
+No user-facing changes.
+
## 1.3.3
No user-facing changes.
diff --git a/csharp/ql/src/Language Abuse/UselessUpcast.ql b/csharp/ql/src/Language Abuse/UselessUpcast.ql
index 827d16038b21..a06dc60cc7ab 100644
--- a/csharp/ql/src/Language Abuse/UselessUpcast.ql
+++ b/csharp/ql/src/Language Abuse/UselessUpcast.ql
@@ -75,15 +75,16 @@ private class ConstructorCall extends Call {
/** An explicit upcast. */
class ExplicitUpcast extends ExplicitCast {
- ValueOrRefType src;
ValueOrRefType dest;
ExplicitUpcast() {
- src = this.getSourceType() and
- dest = this.getTargetType() and
- (src instanceof RefType or src instanceof Struct) and
- src.isImplicitlyConvertibleTo(dest) and
- src != dest // Handled by `cs/useless-cast-to-self`
+ exists(ValueOrRefType src |
+ src = this.getSourceType() and
+ dest = this.getTargetType() and
+ (src instanceof RefType or src instanceof Struct) and
+ src.isImplicitlyConvertibleTo(dest) and
+ src != dest // Handled by `cs/useless-cast-to-self`
+ )
}
pragma[nomagic]
diff --git a/csharp/ql/src/Security Features/CWE-090/LDAPInjection.qhelp b/csharp/ql/src/Security Features/CWE-090/LDAPInjection.qhelp
index 04f01720ce66..4af37eadfd76 100644
--- a/csharp/ql/src/Security Features/CWE-090/LDAPInjection.qhelp
+++ b/csharp/ql/src/Security Features/CWE-090/LDAPInjection.qhelp
@@ -12,7 +12,7 @@ is likely to be able to run malicious LDAP queries.
If user input must be included in an LDAP query, it should be escaped to
avoid a malicious user providing special characters that change the meaning
of the query. If possible, use an existing library, such as the AntiXSS
-library.
+library. One may also make their own encoder filter `LdapEncode` following RFC 4515 standards.
@@ -35,7 +35,6 @@ the query cannot be changed by a malicious user.